한울이

[SPRING] Spring Authorization Server Default Session Registry 본문

PROGRAMMING

[SPRING] Spring Authorization Server Default Session Registry

gksdnf050 2023. 7. 31. 15:12

1. 문제상황

- Spring authorization server 를 사용해서 oauth2 provider 서버를 구성한 후 access token 을 발급 받아 봤는데

local 과 개발환경에서 oidc token 의 claim 값이 다른 현상 발견 (sid, auth_time)

 

2. debugging 

- 목적: local 에서 테스트 했을 땐 oidc token claim에 sid, auth_time 값이 있고 개발환경 서버에서 oidc token 을 발급 받았을 땐 왜 claim 값에 sid, auth_time 값이 없는지 ?

 

- OAuth2AuthorizationCodeAuthenticationProvider

 

- JwtGenerator

Spring authorization server 에서는 sessionInformation 값이 있으면 sid, auth_time 값을 oidc claim에 넣어서 만들어주고 있음.

 

- 제약사항

1. 개발환경 서버에 원격 디버깅을 할 수 없는 상황

2. library 에서 발생한 것이라 log 를 원하는 곳에 남길 수 없는 상황

 

- 첫번째 의심

같은 코드에서 환경에 따라 다른 결과 값이 나오고 있어서 코드가 아닌 인프라 (db, redis 등등...) 문제라고 생각했음

따라서 local 과 개발환경의 db 테이블을 모두 비교 했음 -> 이상 없음

개발환경 인프라를 local 에서 붙어서 테스트 -> local 인프라와 테스트 할 때와 같은 결과값이 나옴

 

그러던 중 개발환경에서 간헐적으로 jwt claim에 sid, auth_time 값이 포함된 oidc token 이 발급되는 걸 확인

 

- 두번째 의심

개발환경에서 간헐적으로 local 과 같은 현상이 일어난 다는 것을 보고 깨달은 것이 local 은 단일 서버이고

개발환경은 pod 가 여러개가 떠있는 상황(쿠버네티스 사용중) 인걸 인지함 

-> 즉 session clustering 이 이뤄지지 않고 있다고 생각함

-> spring authorization server 에서 사용하고 있는 session registry 를 확인해봄

 

- OAuth2AuthorizationServerConfigurer

SessionRegistry bean 이 없다면 기본적으로 SessionRegistryImpl (server의 memory 에 저장함) 이라는 구현체를 사용함

 

- 해결

clustered 환경에서 spring session 으로부터 session 정보를 가져오도록 SpringSessionBackedSessionRegistry bean 을 등록함

 

참조

https://spring.io/projects/spring-boot

 

Spring Boot

 

spring.io

 

Comments