토큰 및 세션 관리

uchan·2025년 3월 11일
0

개요

  • 세션 관리
  • 토큰 관리

세션 관리

세션은 사용자 경험, 보안 그리고 성능과 같은 중요한 지표에 직접적인 영향을 미친다.

Keycloak 에서는 사용자를 인증할 때 다양한 레벨에서 세션을 생성한다.

  1. 사용자 세션(User Session)

    • 사용자가 Keycloak에 로그인하면 사용자 세션이 생성된다.
    • 사용자는 하나의 사용자 세션에서 여러 클라이언트에 액세스하여 클라이언트 세션을 생성한다.
    • SSO(Session Timeout) 설정
      - SSO 세션 최대 수명(SSO Session Max): 전체 세션 유지 시간
      - SSO 세션 유휴 수명(SSO Session Idle): 일정 시간 동안 활동이 없을 경우 세션 종료
      - 예를 들어, 최대 시간이 10시간, 유휴 시간이 30분이라면, 사용자가 30분 동안 활동이 없을 경우 세션은 만료되며 계속해서 활동하더라도 10시간이 지나면 세션 만료한다.
  2. 클라이언트 세션(Client Session)

    • 사용자가 특정 클라이언트(예: 웹 애플리케이션, API)와 연결될 때 생성된다.
    • 하나의 사용자 세션 내에서 여러 개의 클라이언트 세션이 존재할 수 있다.
    • 클라이언트 세션은 각 클라이언트에 대한 토큰 발급 및 인증 정보 관리 역할을 한다.
    • 클라이언트 세션이 종료되면 해당 클라이언트에 대한 토큰도 무효화된다.
    • 클라이언트 세션도 사용자 세션과 마찬가지로 Max, Idle 시간을 설정할 수 있으며 의미는 동일하다. 만약 클라이언트 세션이 만료되었는데 사용자 세션이 남아있다면 Keycloak 으로 리다이렉트되어 재인증 절차를 수행한 뒤 다시 클라이언트 세션을 발급받을 수 있다.

세션의 생명 주기를 짧게하여 세션 하이재킹, 토큰 유출 등 보안 이슈로부터 영향을 최소화시킬 수 있고, 공유 캐시 메모리의 서버리소스를 줄일 수 있다는 장점이 있으나 사용자 경험에는 부정적인 영향을 준다. 따라서 서버 리소스, 사용자 활동 등을 고려하여 적절한 시간을 고려하여 세션 만료시간을 설정하는 것이 좋다.

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 도 갱신하여 공격자로부터 방어할 수 있다.

0개의 댓글