엔지니어링/인증

[RHSSO] 리프래시 토큰 보관

joon95 2022. 9. 6. 17:40
반응형

지난번 ocp operator를 활용해 rhsso 를 구축하였다.

 

rhsso 는 refresh token 을 캐시 또는 데이터베이스에 보관하는데,

기본적으로 설정되어있는 상태는 캐시에 분산(distributed)형태이다.

 

jboss 캐시 컨트롤 부분을 알아보면 복제, 분산 두가지의 모드가 있는데

MSA아키텍처가 확장되어가며 분산모드가 대세가 된 것 같다.

 

캐시 분산 모드 설정

그래서 sso pod 에 들어가 설정파일을 하나 보면 파드갯수만큼 공유하라는 설정이 존재한다.

$ cat /opt/eap/standalone/configuration/standalone-openshift.xml
<subsystem xmlns="urn:jboss:domain:infinispan:12.0">
 <cache-container name="keycloak">
  <distributed-cache name="sessions" owners="${env.CACHE_OWNERS_COUNT:1}"/>
  <distributed-cache name="authenticationSessions" owners="${env.CACHE_OWNERS_AUTH_SESSIONS_COUNT:1}"/>
  <distributed-cache name="offlineSessions" owners="${env.CACHE_OWNERS_COUNT:1}"/>
  <distributed-cache name="clientSessions" owners="${env.CACHE_OWNERS_COUNT:1}"/>
  <distributed-cache name="offlineClientSessions" owners="${env.CACHE_OWNERS_COUNT:1}"/>
  <distributed-cache name="loginFailures" owners="${env.CACHE_OWNERS_COUNT:1}"/>

 

실제 pod가 기동되면 아래와 같이 pod간의 세션이 맺어졌다고 로그가 남는다.

Received new cluster view for channel ee: [keycloak-0|1] (2) [keycloak-0, keycloak-1]
ISPN100000: Node keycloak-1 joined the cluster
[Context=authenticationSessions] ISPN100002: Starting rebalance with members [keycloak-0, keycloak-1], phase READ_OLD_WRITE_ALL, topology id 2

 

이상태로 토큰을 발급하면 0,1 두곳중 랜덤한 곳에 refresh token 캐시값이 저장되고,

0번 파드를 죽이면 0번 파드의 캐시를 1번 파드로 옮기고,

다음 1번 파드를 죽으면 새로 올라간 0번 파드에 캐시를 옮기게 된다.

 

이때 세션이 죽는지 여부는 rhsso 대시보드의 sessions 탭에서 확인할 수 있다.

만약 저 Active Session이 사라진다면 발행된 refresh token은 절대 사용할 수 없게 된다.

(session 이 날라간다면 토큰재발행 요청 시 'Session not active' 라는 메시지를 보게된다).

이렇게 몇번 pod를 죽여가며 refresh token 으로 토큰재발급 요청을 해보면 잘된다.

 

데이터베이스에 저장

만약 데이터베이스에 토큰을 저장하고 싶다면 scope 에 offline_access를 추가하면 된다.

해당 scope를 넣고 발행요청을 하면 offline_user_session 테이블에 저장된다.

select * from offline_user_session order by last_session_refresh desc;
           user_session_id            |               user_id                | realm_id | created_on | offline_flag |                                              data                                                                                                                                                                  | last_session_refresh--------------------------------------+--------------------------------------+----------+------------+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------
 9330dc95-4ed9-435a-bc15-2d73d311e0d9 | 179619ff-ef31-49fd-8fb2-6f50247ee231 | mydata   | 1649994909 | 1            | {"ipAddress":"192.168.160.70","authMethod":"openid-connect","rememberMe":false,"started":0,"notes":{"KC_DEVICE_NOTE":"eyJpcEFkZHJlc3MiOiIxOTIuMTY4LjE2MC43MCIsIm9zIjoiT3RoZXIiLCJvc1ZlcnNpb24iOiJVbmtub3duIiwiYnJvd3NlciI6Ik90aGVyL1Vua25vd24iLCJkZXZpY2UiOiJPdGhlciIsImxhc3RBY2Nlc3MiOjAsIm1vYmlsZSI6ZmFsc2V9"},"state":"LOGGED_IN"} |           1649994909
(1 row)

 

반응형