세션은 사용자 경험, 보안 그리고 성능과 같은 중요한 지표에 직접적인 영향을 미친다.
Keycloak 에서는 사용자를 인증할 때 다양한 레벨에서 세션을 생성한다.
사용자 세션(User Session)
클라이언트 세션(Client Session)
세션의 생명 주기를 짧게하여 세션 하이재킹, 토큰 유출 등 보안 이슈로부터 영향을 최소화시킬 수 있고, 공유 캐시 메모리의 서버리소스를 줄일 수 있다는 장점이 있으나 사용자 경험에는 부정적인 영향을 준다. 따라서 서버 리소스, 사용자 활동 등을 고려하여 적절한 시간을 고려하여 세션 만료시간을 설정하는 것이 좋다.
Keycloak 에는 Sessions 라는 탭을 통해 세션들을 관리할 수 있다. 만약 특정 세션을 무효화시키고자 한다면 Sessions -> 특정 세션 클릭하여 상세페이지로 넘어간 뒤 로그아웃 처리가 가능하다.
Keycloak 은 세션 만료 시 관련된 세션들을 순회하며 만료시킨다. 만일 사용자 레벨에 있는 모든 세션을 만료시킬 경우 클라이언트 세션들도 모두 만료처리를 해야되기 때문에 많은 리소스가 필요할 수 있다.
Keycloak 은 KEYCLOAK_IDENTITY
쿠키를 통해 브라우저 세션을 서버의 사용자 세션과 연동한다. 만일 Keycloak 서버에서 세션을 만료시킬 경우 쿠키에 담긴 세션이 유효하지 않으므로 다음 접근 시 재인증 절차를 무조건 수행해야 한다.
토큰은 세션과 연동하여 사용할 수 있다. 보통 토큰을 이용하여 어플리케이션이 추가적인 통신없이 로컬에서 토큰을 검증하고 지원한다. 만약 Keycloak 에서 세션을 만료시킨 경우 어플리케이션에서 백엔드 채널 로그아웃 처리 등을 구현안했다면, 세션은 만료되었지만 어플리케이션에서는 계속해서 유효한 토큰으로 처리될 수 있다. 따라서 토큰 만료 및 폐기에 대한 명확한 전략을 항상 고려해야 한다.
어플리케이션이 Keycloak 으로부터 토큰을 발급받는 경우 크게 ID Token, Access Token, Refresh Token 을 획득할 수 있다. ID Token, Access Token 은 대게 짧은 수명주기를 사용하며 Refresh Token 은 클라이언트 세션에 설정된 생명주기에 따라 비교적 긴 수명주기를 사용한다.
만약 Refresh Token 을 통해 Access Token 을 재발급 받는 경우 클라이언트 세션이 유효하지 않다면 신규 토큰 발급이 불가하다. 그리고 Refresh Token 로테이션을 활성화하여 만일 토큰 재발급을 할 때 서버에서 리프레쉬 토큰을 무효화 처리를 한 뒤 계속해서 Refresh Token 도 갱신하여 공격자로부터 방어할 수 있다.