Keycloak 인증 솔루션 선택 – 그리고 ext개발

관련기술 모음

  • https://memo.polypia.net/archives/3821

Keycloak vs CAS 선택은

국내에서는 Springboot을 많이 쓰다보니 CAS를 많이 쓸 것 같지만
사용의 난해성 때문에 Keycloak이 더 많이 사용된다
(CAS는 딱 이정도만 해보고 포기 https://memo.polypia.net/archives/3783)

Keycloak을 서비스에 적용하려고 보면 약간의 문제가 있다

  • application 서버와 별도 인스턴스를 띄워야한다는 문제
  • 회원 디비가 application과 별도로 관리된다는 문제

해야하는 일

  • 로그인, 회원가입 화면 만들기 – 보통 테마만 추가
  • 커스텀 회원정보 수정화면/기능 만들기 application에 또는 keycloak 커스텀
  • 회원가입, 로그인 로그 저장
  • 회원가입, 로그인 이벤트 전달

어려운 부분

  • 회원디비를 application에 두고 연동해서 사용
    이건 매우 어렵다. 잘 안된다. 극한의 커스터마이징을 하려면… 그냥 따로 만드는게 낫다
    서비스 초반에는 있는 그대로 쓰자….
  • 디비를 공유
    캐시때문에 싱크가 안맞다
  • 그냥 무엇이건 커스터마이징…

간단하게 결론을 내면
뭘 쓰건 기본기능 그대로 쓸게 아니라면 사용이 쉽지는 않다.

초반에는 서비스를 오픈소스에 맞춰서 쓰자

Keycloak 사용후기

keycloak은 간편한 편이다.
그런데 서비스 개발용이 아니라 블로그, 위키 등 운영 용으로 만들어진게 아닐까?
개발자가 서비스를 개발할 때 사용하기는 불편하다.

(14버전쯤)추가기능 구현도 도큐먼트 대로 되지도 않고 엄청 복잡했는데
한달정도 보다보니 구조파악이 되고 좀 할만해졌다. 소스보고 알아서 분석해서 써야한다.
그냥 도큐먼트만 보고 하려면 rest api 호출하는것도 쉽지가 않다.(공식문서에 주소를 엉터리로 적어놔서 ㅋ)

keycloak 소스코드와 포럼의 질문답변을 잘 읽어봐야한다

JBoss 스타일로 만들어져서 Spring생태계에 익숙한 개발자가 접근하기 쉽지 않다
jas-rx 기반 resteasy, wildfly 서버, jboss의존성 관리 등등..

  • https://github.com/keycloak
  • https://github.com/ScriptonBasestar-io/keycloak-providers
  • https://github.com/thomasdarimont/keycloak-user-storage-provider-demo
  • https://www.baeldung.com/java-keycloak-custom-user-providers
  • https://github.com/thomasdarimont/keycloak-extension-playground
  • https://github.com/zonaut/keycloak-extensions

Keycloak 문제점? 헷갈리는 포인트

Keycloak 설명

오픈소스
회원관리 oauth2-oidc, saml 서버기능 지원
외부 Oauth 소셜로그인 지원(구글,페북,인스타..등)

헷갈리는 점

이해를 못해서 헷갈리는 점 말고 설계가 잘못됐다고 생각하는 부분

import가 아니고 partial import

json으로 export하고 import 한다고 하면 서버 설정전체를 집어넣고 내보내는거라고 생각하기 쉬운데
지원되는 항목이 정해져 있다
추가기능으로 설치한것들은 지원이 안되는 것 같다

rabbitmq EventListener를 추가했더니 export는되는데 import가 안된다

기본 client

realm을 처음 생성할 때 clients가 생성된다

  • {realm_name}-realm 이건 렐ㅁ을 생성할 때 마다 master 렒에 추가된다
  • master-realm은 master 렒의 Clients에 추가된다
  • account 계정관리 권한 이걸 지우면 로그인도 안된다 https://keycloak.com/auth/realms/master/account/
  • account-console 콘솔로그인 권한
  • account-cli
  • broker 소셜로그인 권한인가
  • security-admin-console

기본 옵션을 클라이언트에 달아놓은게 맘에 안들어.. 수정/삭제 버튼도 달려있다.

role

기본 client의 문제가 이어진다

기본 client는 고유 권한을 가지고 있다.

keycloak에서는 previlege를 별도로 관리하지 않아서
고유 client가 role이라는 이름으로 previlege(role)을 들고있다
소스에 보니까 string으로 선언이 돼 있어서 이름만 같으면 되나 싶어서
같은 이름 생성 해 봤는데… 이름같아서 헷갈리기만 하도 안된다

전체에서 관리되는 role과 client에서만 관리되는 role 그리고 기본client의 role이 별도로 존재한다고 봐야할까

새로운 client에 previlege를 부여하려면 composite roles를 선택해서 기본 client의 previlege를 associate 해야한다

그냥 잘못 만든 점

Events – Evnets Config에서

EventListeners를 설정하고 evnet종류를 지정할 수 있는데

EventListener가 한개일 때는 괜찮은데 여러개일 때
리스너 종류에 따라 다른 이벤트 설정을 못 하게 돼 있다.

ex) jboss-logging이 기본인데 이건 전부 수신하고
email로는 회원가입만 보내고 싶다… 라면..?? 이거 안된다.

User – Role – Previlege

구분이 좀 됐으면

아쉬운 점

플러그인 참여가 오픈되어있지 않다

사용자가 꽤 많은 것 같은데 기본지원되는 소셜로그인 말곤 따로 만들어야된다
커뮤니티 좀 활성화 돼 있으면 사람들이 알아서 만들고 할텐데

과도한 커스터마이징 미지원

버전이 14까지 올라갔는데 지원이 안되고 있네
좀 시도해볼만하지 않나
oauth말고 그냥 서비스 특화된 방식

커스텀 필드

되긴되는데 좀 불편

주소 문제

https://auth.service.com
/ 주소는 무슨 홍보페이지같은거고
/auth가 실제 서비스 주소가 된다
/auth/realms/master 처럼 주소가 나온다

기본 서비스 clients랑 같은 문제인데… master realm, 서비스 어카운트 등은 일반사용자와 다른 테이블에 다른 차원으로 관리되는게 좋은데 개인적으로는

각 렒별로 주소를 별도로 할당하고싶기도 한데 그것도 안된다
누가봐도 keycloak를 쓰고 있다는걸 알 수 있는 상태로 오픈해야한다

reverse proxy로 처리하면 할 수는 있을 것 같은데 좀 봐야겠다

좆같은 캐시

infinispan과 jpa 두 계층으로 데이터를 저장하는데
캐시를 굉장히 무겁게 사용하고 있는 것 같다
솔직히 잘 모르겠다. 그냥 좆같다
어디서 뭐가 저장 돼 있는지 따라갈수가 없어서 뭘 수정 할 수도 없다

RestEasy

이런 그지같은 rest api client는 스프링 web client 말고는 없다

호출 수백번 반복

회원가입할 때 저장을 수십번 하는 것 같은데
디비에 필드단위로 정규화한 데이터를 저장하는 병신짓은 아무도 안하는게 당연한데
그런식으로 저장하고 있는거 아닐까

성능

뭐 이따윈지

DDD

DDD를 잘 쓰려고 노력한 것 같은데
잘 하지는 못했다

hmm

초기서비스용으로 있는그대로 쓰면 괜찮다
학습용으로 좋다
개인서버용 정도로 쓰기 좋다

NAS,홈오피스 – OS,솔루션

NAS 솔루션

  • NextCloud
  • https://www.openmediavault.org
  • http://rockstor.com
  • https://www.amahi.org
  • https://lime-technology.com

NAS 인프라, NAS 서비스 섞여있음

OS

  • www.nas4free.org
  • FreeNAS https://www.freenas.org
  • http://rockstor.com/

홈오피스

  • www.zentyal.org
  • NethServer https://www.nethserver.org

Media

  • https://www.amahi.org/

인프라

  • https://www.pfsense.org/

CAS – 로컬실행/개발환경 만들기

뭔가 괜찮은 것 같으면서도 애매한 오픈소스 프로젝트…
복잡함 때문에 몇 번 사용하려다가 포기 했는데 이번에 인증서비스를 만들면서 다시 사용하려고 한다.

jasig CAS일 때 보고 apereo로 바뀐거 보고… 세번째 정도인 것 같다.
이전에는 기능을 축소해서 직접 개발했었는데

복합인증을 구현하려면 쓰는게 나을 것 같다

경쟁제품

유료 무료 다 포함해서 대강

무료

  • Keycloak
  • CAS
  • JOSSO
  • LemonLDAP
  • Shibbolet ldP
  • OpenAM
  • Gluu
  • https://freeradius.org/

유료

  • Auth0
  • AWS Cognito

기타

  • https://gist.github.com/bmaupin/6878fae9abcb63ef43f8ac9b9de8fafd
  • https://www.gluu.org/blog/gluu-versus-keycloak/

조금씩 특성이 다르긴 하다.

CAS 특징

  • 프로젝트가 굉장히 잘게 나눠져 있다.
    모듈형으로 가져다가 사용하라는 것 같은데…
    의존성이 복잡해서 그렇게 쓸 수가 없다
    도큐먼트는 사용법에 관한 것만 있고
  • 설치형으로 사용하려고 보면…
    cas-overlay-template 라는게 있기는 한데
    기본으로 지원되는 부분을 제외하면 설치형으로 쓸 수 있는건 아니고 거의 소스레벨에서 수정해서 써야만 한다.
  • 스프링을 매우 잘 쓴다. 나도 스프링 꽤 써봤다고 생각했는데 처음보는게 조금씩 보인다
  • Springboot autoconfigure 사이의 엄청난 충돌이 발생
    실행형으로 만들게 아니라면 그냥 없애야 하지 않을까

어쨌든 소스레벨에서 분석해서 사용해야 하고
필요한 부분만 뽑아쓰긴 힘들어 보인다

설치방법

소스

docker 컨테이너를 제공 해 주면 좋겠는데…. 커스텀을 해서 쓰라는 철학을 가지고 있는 애들이라 그런지 통짜로 제공 해 주지는 않는다.
그래도 쓰기 편하게 템플릿이 제공된다.

https://github.com/apereo/cas-overlay-template

이런것도 제공 해 주고 많이 발전했다.

아래 순서대로 치다보면 뭐가 뭔지 알 수 있을거다. README.md와 비슷하지만 약간 다르다.

git clone https://github.com/apereo/cas-overlay-template cas-server
cd cas-server
./gradlew clean build
./gradlew downloadShell runShell
./gradlew allDependencies

설정파일 수정

docker-compose 실행테스트를 해야되서 설정파일을 수정 해 준다

# /etc/cas/config/cas.properties

logging.config=file:/etc/cas/config/log4j2.xml

server.port=8080
server.ssl.enabled=false

실행

docker-compose up

화면수정

수정가능 항목의 목록을 얻는 명령어

./gradlew listTemplateViews

템플릿을 소스코드로 가져오는 명령어

./gradlew getResource -PresourceName=[여기뭐가들어갈까]

기능수정

이쪽 철학이 그런가보다. 디비를 직접 관리하거나 하지 않는다.
그럴거면 jpa 연동하기 쉽게 인터페이스를 달아주던가 하면 좋을텐데 그런건 또 안해놨다.

트리거 설정

각 기능이 실행될 때 마다 앞뒤로 트리거를 달 수 있다.
인터셉터
groovy

아직 안해봐서잘 모르겠지만 할 수 있다.

배포

리버스 프록시 사용

요즘 리버스 프록시 안쓰는 경우가 더 드물지 않을까

cas.server.name=https://domain.tld
cas.server.prefix=/

server.port=8080
server.ssl.enabled=false
cas.server.http.enabled=false
cas.server.httpProxy.enabled=true
cas.server.httpProxy.secure=true
cas.server.httpProxy.scheme=https
cas.server.httpProxy.protocol=HTTP/1.1

결론

overlay template 설치하려면 keycloak, gluu 등 다른 쉬운걸 쓰는게 나을것으로 보인다
인증방식은 어차피 다 표준프로토콜이 있어서 한두개 빼고는 다 비슷하게 제공된다

소스레벨에서 사용하려면 cas를 쓰는게 나을까… 그냥 만드는게 나을까
아직 시작단계라 정확하지는 않지만
이걸 쓰기보다는 필요한 부분 소스만 참고해서 따로 만들게 될 것 같다

REF

  • https://apereo.github.io/2019/01/07/cas61-gettingstarted-overlay/
  • https://apereo.github.io/cas/6.3.x/configuration/Configuration-Server-Management.html
  • https://apereo.github.io/2018/01/05/cas-deployment-with-proxy/

State Machine libray

상태관리

프로그램을 만들다 보면 상태가 중요한 요소일 경우가 많은데
회원의 상태, 프롯스의 상태
상태를 변경하기 위한 동작들
기존 상태 메모리에 로드, 디스크 저장 등등

별도로 관리하지 않고 디비에서 가져와서 한개씩 처리하면서 트랜잭션 거는거도 가능하지만
실수가 잦다

그래서 하나 만들어볼까 하다가 찾아보니 잔뜩 나와서 일단 정리

REF

  • https://statecharts.github.io/
  • https://kentcdodds.com/blog/implementing-a-simple-state-machine-library-in-javascript
  • https://github.com/davidkpiano/xstate
  • https://github.com/Ankzz/easyfsm/
  • https://github.com/hekailiang/squirrel

Custom Router

라우터 OS

  • OPENWRT
  • DD-WRT
  • pfsense
  • VyOS
  • suricata

OpenWRT

https://openwrt.org/
공유기

임베디드에 설치. 오래된 공유기 안쓰는거에 설치해서 사용
x86은 공식지원이 없다. uefi 지원은 별도 빌드 필요

DD-WRT

https://dd-wrt.com/
공유기

pfsense

https://www.pfsense.org
공유기

BIRD

https://bird.network.cz/
데탑

REF

Xpressengine3는 아직 미완성인가

SSIBAL 이거 돌아가는거 맞나?

composer install 하면 뭔가 경고가 엄청 뜬다. 의존성 오류가…?
보니까 composer.lock이 ignore가 되어있다.
php, composer 모두 정해진 버전을 써야할 것 같은데 알 길이 없다.
.lock, .phar 등등은 gitignore에 포함시키지 말아야 하는거 아닌가?

developement 환경은 왜 셋팅도 안 되어 있는건가
sqlite에 달아주던가 해야 데모 테스트도 해 보고 쓸지 말지 결정할텐데

Docker 공식 이미지를 제공을 안 하길래 만들어서 써볼까 했는데
제대 돌아가질 않는다.
docker에서 terminal install을 하는경우 디비가 이미 생성 돼 있으면 넘어가주거나 하면 좋을텐데 에러를 토해낸다.
그럼 웹 설치만 해야되겠군…
latest.zip를 받아서 다시 만들었는데 localhost/만 접속이 되고 localhost/auth .. 등등 다른페이지가 안뜬다. 뭔가 손이 많이 간다.

config쪽이랑 installer env 네이밍이 너무 제각각사용된다. 그리고.xe_install_config.yml은 환경변수를 받지 않아서 꼭 파일을 넣어줘야 하는 것 같다.

redis를 넣어줬더니 predis가 필요하다고 한다.
다이내믹하게 설치가 되는건 아닌가본데… 그럼 서버 실행전에 composer install을 해 줘야한다는건데…

기능개발보다 안정화를 먼저 해야 사용자층을 넓힐 수 있지 않을까
며칠 보다보니 고쳐서 쓸 수는 있을 것 같은데 계속 이런상태일 것 같아서 고민이다.

그냥 안쓰는게 나을 것 같다.
wordpress, joomla 등등의 대안이 있으니까
이정도로 불안정한 플랫폼으로 서비스를 만드느니 새로 만드는게 나을 것 같다.

오픈소스 비지니스: 고객을 일하게 하라

목차

  1. 일하지 말고 일하게 하라
    1. 고객은 최고의 전문가
      그들을 활용하라 오픈소스 고객은 그 분야의 전문가다
    2. 고객을 전문가로 만들리
      전문가가 아닌 고객도 전문가가 될 수 있도록 교육자료를 제공하라
      그들은 우리의 제품을 더욱 향상시켜 줄 것이다
  2. 알아서 고치게 하라
    1. 고객들에게 스스로 고쳐 쓰고 방법을 공유하도록 만들라
  3. 고객은 최고의 노예다
  4. 일하지 않으면서 일하는 척 하라
    1. 고객은 서로 일을 해준다
    2. 다른 고객에게 우리(다른고객)의 업적을 전달하라
  5. 에필로그
    1. ㅇㅇ

목차만 봐도 지리겠다
돈버는 책이나 성공하는 책같은 제목과 소제목
두꺼운 똥소리만 잔뜩 집어넣으면 쓰레기같이 잘 팔리는 책 한권 나올 것 같다.

개발 조무사라면 꼭 봐야하는 책

암호화폐 거래소 프로젝트

오픈소스 프로젝트

  • peatio
    https://rubykube.io/#
    https://github.com/openware/peatio
    https://github.com/rubykube/peatio-trading-ui
    https://github.com/rubykube/peatio-react
    https://github.com/peatio/helm-charts
  • CoreCX
    https://bitbucket.org/account/user/margincallio/projects/MRGC
  • WLOX
    https://github.com/wlox/wlox/
  • bitex
    https://github.com/blinktrade/bitex
  • viabtc
    https://github.com/viabtc/viabtc_exchange_server
  • OpenDAX
    https://github.com/openware/opendax

상용 프로젝트

이건 그냥 서비스 중인 회사들

프로젝트별 특징

Peatio

개발언어: RubyOnRails
데이터 저장소: Mysql

[만들거]이벤트 트리거 – 리눅스(우분투) 프로그램

이벤트 캣치해서 트리거 발생해서 뭔가 실행시켜주는 서비스.

를 만들 수 있을지 검토를 해 봐야겠다

만들어놓은게 있는지 찾아보고

c,c++이용 커널과 os에서 이벤트 잡아내고

lua스크립트로 실행

다음에 찾아봐야겠다. 비슷한거 있을 것 같은데…