Keycloak 25000일의 오버플로우

이종완·2023년 6월 6일
0

개발이야기

목록 보기
10/12

문제

뱅킹서비스 api의 인증인가를 위해 오픈소스 Keycloak 기반의 인증서버를 사용하고 있는데,
realm의 세션 최대 수명을 25000일로 변경하니 기존 리프레시 토큰으로 재발급 요청을 할때 전부 invalid session 에러가 발생하며 유효하지 않은 토큰으로 인식되기 시작했다

원인

과도하게 높은 수치 (25000일)를 설정하면 세션 유효성 판정을 제대로 하지 못해 발생하는 오류이다

인증 컨테이너의 에러 로그로부터 keycloak의 호출 스택을 따라가보면
세션의 유효성을 검사하는 sessionIsValid라는 메소드가 있으며, 다음과 같은 현상을 확인할 수 있었다

  1. sessionIsValid(세션 유효 체크 메소드)에서 유효성 검사를 위해,
    사용자 세션 started 시각 초단위 값 + realm의 현재 session max 시간 초단위 값 덧셈을 수행
  2. realm의 세션 최대 수명을 크게 설정하면, 유효성 체크를 위해 덧셈한 값이 int 최대값을 초과하여 음수가 됨
  3. 해당 음수는 sessionIsValid() 메소드를 실행 시 currentTime보다 작은 숫자로 판정됨
  4. 해당 음수는 currentTime보다 작은 값이기에 과거 시간으로 취급하여 valid 하지 않은 세션으로 판단 후 false 리턴
  5. sessionIsValid 메소드로부터 false 값 리턴이 오면 세션 메소드에서 session logout 진행
    (사용자 세션은 null이 된다)
  6. 해당 세션은 세션 최대 수명 값을 정상 수치로 돌려놓아도 이미 로그아웃 되었으므로 추후 sessionIsValid() 메소드 내부에서 사용자 세션이 null이 되어 무조건 false 반환

결론

과도하게 높은 수치는 지양하는 것이 좋고, 테스트 시 이상 없었던 최대 수치 약 2000일 내에서 설정하도록 한다
만약, 무기한 토큰이 필요하다면 offline_token 사용도 검토해볼 수 있으나 보안에 취약할 가능성이 있으므로 가급적이면 남용하지 않는 것이 좋을 듯 하다

profile
안녕하세요...

0개의 댓글