[SPRING] Spring Authorization Server Default Session Registry
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