티스토리 뷰

WEB

Keycloak 시작하기 8

마시멜로co. 2025. 2. 19. 11:15

Keycloak은 통합 인증 및 인가 서비스 역할 외에도 세션 및 토큰 관리 시스템 역할을 합니다.

인증 프로세스의 일환으로 Keycloak은 서버 사이드 세션을 생성하고 토큰과 연동할 수 있습니다. 해당 세션을 통해 Keycloak은 세션이 시작된 인증 컨텍스트의 상태를 유지하고 사용자 및 클라이언트의 활동을 추적하며, 토큰의 유효성을 확인해 사용자와 클라이언트가 언제 재인증을 수행해야하는지 결정할 수 있습니다.

Keycloak을 통한 토큰 및 토큰 기반 세션 관리 방법과 이러한 작업을 수행할때 주의해야 할 다양한 부분에 대해 알아보겠습니다.

 

1. 세션 관리

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

사용자 경험 관점에서 Keycloak은 세션에 활용해 사용자와 클라이언트의 인증 여부, 인증 기간, 재인증 시기 등을 결정합니다. 세션의 이러한 특성은 기본적으로 동일한 영역 내의 서로 다른 클라이언트를 인증하는 경우 사용자에게 싱글 사인온 환경을 제공하고 통합 인증 경험을 실현합니다.

보안 관점에서 세션은 사용자 활동을 추적 및 제어하고 클라이언트에게 발급된 토큰이 사용자를 대신해 작동할 수 있는 유효한 토큰인지 확인하기 위한 보안 계층을 제공합니다. 세션 또는 토큰이 유출되거나 탈취됐을 경우 공격 표면을 제한할 수 있기 떄문에 사용자의 realm 및 해당 클라이언트와의 세션유지시간을 제한하고 제어하는 것 또한 중요합니다. 세션은 악의적인 행위자의 비인가 접근 차단 또는 대응을 하기 위해 관리자, 사용자 및 클라이언트가 조기에 무효화 시킬 수 있습니다.

성능 측면에서 세션은 메모리에 저장되며 Keycloak의 전반적인 성능에 직접적인 영향을 미칩니다. Keycloak은 세션을 공유 캐시에 저장합니다. 여기서 활성 세션의 개수와 활성 세션 유지 시간은 메모리와 CPU 리소스를 최적화하기 위해 균형을 유지해야하는 주요 요소입니다. 이러한 점들을 고려할 때 Keycloak은 여기에 언급된 세가지 측면의 균형을 유지하는 유연한 세션 및 토큰 관리를 제공합니다. 관리자는 사용자 및 클라이언트의 활성 세션을 추적하고, 사용자가 인증한 클라이언트를 확인하며 세션 무효화를 위해 단일 또는 전역 로그아웃을 수행하고 토큰을 폐기하고 세션 및 토큰 생명주기의 다양한 측면을 제어할 수 있습니다. 

 

2. 세션 생명주기 관리

Keycloak은 프로덕션 환경에 적용하기 전에 결정해야하는 첫번째 질문 중 하나는 얼마나 자주 사용자와 클라이언트가 재인증을 수행해야하는지 정하는 것입니다. 이 질문에 적절한 해답을 찾기 위해서는 Keycloak이 세션을 생성하는 방법과 세션의 생명주기를 정의하는 방법을 알고 있어야합니다.

세션 생명주기는 세션이 만료되고 삭제되는 시기를 결정합니다. 세션이 만료되면 해당 세션과 관련된 사용자 및 클라이언트는 인증된 상태를 유지할 수 없고 신규 세션을 생성하기 위해 재인증을 수행해야 합니다.

Keycloak은 백그라운드 작업을 사용해 세션을 만료하고 만료된 세션을 확인합니다. 기본적으로 작업은 15분마다 실행됩니다. 필요한 경우 해당 값을 수정할 수 있지만 기본설정을 사용하는 것을 권장합니다.

Keycloak은 사용자를 인증하는 경우 다양한 레벨에서 세션을 생성합니다. 첫번째 레벨에서 클라이언트에 관계없이 사용자 활동을 추적하기 위해 사용자 세션이 생성됩니다.

해당 레벨은 SSO(Single Sign-On) 세션이라고 하며 사용자 세션이라고도 합니다. 두번째 레벨에서 Keycloak은 사용자가 인증된 사용자 세션에서 각 클라이언트의 사용자 활동을 추적하기 위해 클라이언트 세션을 생성합니다. 클라이언트 세션은 토큰의 유효성 및 애플리케이션에서 토큰을 사용하는 방식과 밀접하게 관련돼 있습니다.

최상위 세션인 SSO 세션 생명주기는 사용자와 클라이언트가 재인증을 수행해야하는 빈도를 설정하기 위해 사용하는 전역 설정입니다. Keycloak을 사용하면 SSO세션이 활성 상태로 유지하는 최대 시간과 세션이 조기에 만료되는 유휴 시간을 설정할 수 있습니다. SSO 세션이 만료되면 해당 SSO 세션과 연동된 모든 클라이언트 세션 또한 만료됩니다.

SSO 세션은 HTTP 세션과 유사합니다. 두 세션 모두 동일한 에이전트가 전송하는 여러 개의 요청에서 상태를 추적하고 유지하기 위해 사용됩니다.

 

세션 생명주기를 설정하려면 좌측 패널의 Realm Setting > Sessions 탭을 클릭합니다.

SSO Session Idle SSO Session Max 설정을 통해 SSO 세션의 유휴 시간과 최대 시간을 각각 설정할 수 있습니다. 설정이 적용되면 세션ㅇㄴ 일정시간 동안 활성화상태로 유지돼야 하고, 최대 시간보다 길지 않아야 합니다. 그리고 동시에 Keycloak은 세션 조기 만료 여부를 결정하기 위해 특정시간(유휴 시간)동안 사용자 활동을 확인합니다.
기본적으로 Keycloak은 SSO 세션의 생명주기를 10시간으로 정의합니다. 해당 시간은 세션이 최대 10시간동안 지속될수 있고 그 이후에는 만료된다는 것을 의미합니다. 하지만 유휴 시간의 타임아웃은 기본 30분으로 설정되고 있고 이는 

Keycloak이 30분 이내에 사용자 활동을 확인하지 못하면 설정된 최대 시간에 관계없이 세션이 만료됨을 의미합니다.

사용자가 인가 포인트를 통해 직접 통신하거나 토큰이 클라이언트에 의해 간접적으로 갱신되는 것과 같이 Keycloak과 상호작용하는 유휴 시간 타임아웃은 갱신됩니다.

사용자가 인증을 수행한 후 자리를 비우고 토큰을 갱신하지 않으면 사용자 세션은 30분 후에 만료됩니다. 하지만 사용자가 브라우저를 통해 지속적으로 Keycloak과 통신하거나 클라이언트가 지속적으로 토큰을 갱신하면 사용자 세션은 최대 10시간까지 유지할 수 있습니다.

SSO 세션과 마찬가지로 관리자는 클라이언트 세션의 유휴 및 최대 시간을 설정하기 위해 Client Session Idle 및

Client Session Max 을 각각 설정할 수 있습니다.
위의 두가지 설정은 토큰의 유효 기간에 대한 최댓값을 정의하고 클라이언트가 토큰을 재인증을 수행하도록 함으로써 관리자에게 클라이언트 세션 생명주기에 대한 세밀한 제어를 제공해줍니다.즉, realm 클라이언트에 발급된 토큰은 설정한 최대 시간까지만 유효하며 클라이언트가 유후 기간내에 토큰을 갱신하지 않으면 클라이언트 세션이 조기에 만료되고 토큰이 폐기됩니다.
 하지만 SSO 세션과 다르게 클라이언트 세션이 만료되고, SSO 세션이 만료되지 않은 경우 사용자는 재인증을 반드시 수행할 필요는 없지만 신규 토큰을 생성하기 위해 클라이언트는 재인증을 수행해야 합니다. 클라이언트 세션이 만료된 경우 클라이언트 재인증을 수행하기 위해 사용자는 Keycloak으로 리다이렉트 되고, 브라우저를 사용하는 경우 사용자 경험에 영향을 미칠 수 있습니다.
기본적으로 Keycloak은 클라이언트 세션의 생명 주기를 제어하기 위한 SSO 세션과 동일한 설정 집합을 정의합니다.

Client Session Idle 및 Client Session Max  설정값을 0이 아닌 값으로 변경해 클라이언트 세션의 다양한 생명주기를 정의할 수 있습니다. 

경험에 비춰볼때 보안, 퍼포먼스 및 사용자 경험 측면을 고려해 세션의 생명주기를 가능한 한 짧게 설정해야합니다. 이러한 짧은 생명주기를 통해 세션 하이재킹 공격 또는 토큰 유출이나 도난에 대한 영향을 최소화할 수 있습니다. 또한 사용자의 활동을 보여주지 않는 세션에 의해서 서버에 과부하가 걸리는 것을 회피하고 메모리나 CPU 등의 서버 리소스 낭비를 막을 수 있습니다. 하지만 짧은 세션 생명주기는 사용자 경험과 사용자 재인증 횟수에 직접적인 영향을 미칩니다. 사용자 우선 접근법에서는 사용자에게 최적인 것부터 시작해 보안 요구 사항 및 메모리와 CPU와 같은 리소스 제약에 따라 세션 생명주기를 조정합니다.

 

3. 활성 세션 관리

Keycloak은 관리자에게 다양한 수준의 뛰어난 세션 추적성과 가시성을 제공합니다.

- realm 별

- 클라이언트별

- 사용자별 

 관리자는 realm 레벨에서 클라이언트별로 활성 세션 개수에 대한 통계를 볼 수 있습니다. 해당 통계를 확인하려면 좌측 패널의 Settings 링크를 클릭합니다.

 

 해당 페이지에서 임의의 클라이언트를 클릭하면 활성 세션에 대한 자세한 내용을 확인할 수 있습니다. 

 

클라이언트를 선택하면 클라이언트 상세 페이지의 Sessions 탭으로 리다이렉트됩니다.

 

 

해당 페이지에서 사용자 IP주소 및 세션 시작 시간 등과 같은 세션에 대한 몇가지 세부 정보에 접근할 수 있습니다.

해당 페이지에서 임의의 사용자를 클릭하면 활성 세션의 세번째 및 마지막 표시 수준인 사용자 상세 페이지로 리다이렉트됩니다.

 

해당 탭에서 세션이 시작된 시간, Keycloak이 사용자와 여러 클라이언트 및 클라이언트 세션에 대한 자세한 정보가 제공됩니다.

 

일반적인 경우 단일 세션을 가진 사용자와 여러 클라이언트가 표시됩니다. 이는 사용자가 브라우저를 사용해 인증하는 일반적인 SSO에 적합하며 동일 세션이 서로 다른 클라이언트를 인증하기 위해 재사용됩니다. 하지만 사용자가 브라우저를 닫거나 쿠키를 지우거나 다른 기기를 사용해 인증할 수 있습니다. 이런 경우 단일 사용자는 여러개의 사용자 세션을 가집니다.

 

4. 사용자 세션 조기 종료

세션 통계 정보를 제공하는 것 외에도 Keycloak은 각기 다른 레벨에서 세션을 조기에 만료되는 메커니즘을 제공합니다.

realm 레벨에서 활성 세션을 확인하는 경우 Action > Sign out all active sessions 버튼을 클릭해 realm 의 전체 활성 세션을 만료할 수 있습니다.  Revocation(폐기, 무효화)란, 발급된 인증 정보(예: 토큰, 인증서, 권한)를 더 이상 사용할 수 없도록 무효화하는 과정입니다.

 

realm 또는 사용자 레벨에서 모든 세션을 로그아웃하기 위해 위의 방법 중 하나를 사용하는 경우 Keycloak은 전체 세션을 순회하며 하나씩 만료시킵니다. 사용자 레벨에서 활성 사용자 세션이 많진 않지만 사용자가 인증된 클라이언트 개수에 따라 클라이언트 세션이 많을 수 있습니다. 하지만 realm에 인증된 전체 사용자의 realm 세션을 만료시키는 작업은 많은 자원이 필요할 수 있습니다.

 

5. 쿠키 및 세션과의 관련성 이해

HTTP는 무상태(stateless) 프로토콜이며 브라우저와 서버 사이의 상태를 공유하기 위해 쿠키를 사용합니다. Keycloak은 사용자가 브라우저를 통해 통신하는 경우 사용자의 세션을 추적하기 위해 HTTP 쿠키를 활용합니다.

사용자를 성공적으로 인증한 다음 Keycloak은 KEYCLOAK_IDENTITY 쿠키를 통해 브라우저 세션을 서버의 사용자 세션과 연동합니다. KEYCLOAK_IDENTITY 쿠키가 유출되거나 탈취된 경우 사용자 세션의 보안이 위협을 받을 수 있습니다. 

KEYCLOAK_IDENTITY 쿠키는 XSS(cross-site scripting) 및 세션 하이재킹 session hijacking 공격을 방지하기 위해 HttpOnly 쿠키로 설정됩니다. 해당 쿠키의 만료는 사용자 세션에 설정된 최대 시간 값을 기반으로 하며 이 값은 추측 공격을 방지하기에 충분한 엔트로피를 가집니다. 

realm의 remember me 설정을 활성화하고 사용자가 로그인을 할 때 해당 옵션을 사용하는 경우 KEYCLOAK_IDENTITY 쿠키의 만료 기간이 1년으로 설정됩니다. 이런 경우 사용자 세션에 설정된 최대 시간은 고려되지 않습니다. 

쿠키에 더 많은 보안 설정을 추가할 수 있으며 가장 중요한 것은 HTTPS(HTTP over TLS)를 사용하는 보안 채널을 통해서만 Keycloak에 접근할 수 있도록 하는 것입니다.

HTTPS를 사용하는 경우 secure 속성은 쿠키가 평문으로 전송되지 않도록 하기 위해 설정되며, SameSite=none 속성은 보안 연결을 사용하는 사이트 간 요청에서만 쿠키가 전송되도록합니다. 

세션 만료와 관련해 KEYCLOAK_IDENTITY 쿠키는 위에서 살펴본 방법을 사용하는 경우 자동으로 만료되지 않습니다.따라서 브라우저는 여전히 해당 쿠키를 전송할 수 있지만 더이상 활성 세션을 참조하지 않습니다. 유효하지 않은 쿠키가 수신되면 Keycloak은 쿠키를 폐기하고 사용자가 재인증을 수행하도록 합니다.

 

6. 토큰 관리

토큰은 세션과 연동됩니다. 따라서 토큰 유효성(생명주기를 의미하지 않음) 세션에 따라 달라집니다. 토큰은 세션과 연동됩니다. 따라서 토큰 유효성 세션에 따라 달라집니다. 토큰은 각각 생명주기를 가지며 토큰이 유효한것으로 간주되는 기간은 토큰이 인증된 방식에 따라 달라집니다. JWT(Json Web Token)를 토큰 형식으로 사용하는 경우 Keycloak은 애플리케이션이 서버에 대한 추가적인 통신없이 로컬에서 토큰을 검증하고 검사할 수 있도록 지원합니다. 하지만 JWT토큰을 사용하는 경우 토큰이 유효한 생명주기를 갖고 있더라도 세션이 만료되면 토큰이 무효화됩니다. 

이를 고려하지 않으면 토큰은 무효화됐지만 유효한 생명주기 기간 내에 있기 때문에 애플리케이션에서 여전히 허용되므로 토큰이 유출될 경우 공격 표면이 증가할 수 있습니다. 토큰 만료 및 폐기에 대한 명확한 전략을 항상 고려해야합니다.

애플리케이션이 Keycloak으로부터 토큰을 획득하는 경우 다음과 같은 토큰 데이터를 포함합니다.

- ID 토큰

- 접근 토큰

- 리프레시토큰

클라이언트의 권한 부여에 따라 Keycloak은 위의 토큰을 모두 발행하거나 일부 토큰만 발행할 수 있습니다. 각 토큰은 자체 생명주기를 가집니다.

리프레시 토큰을 제외하고, ID 토큰과 접근 토큰은 동일한 생명주기를 가집니다. 두 토큰 모두 수명이 짧고 토큰 스토리지가 가장 안전하지 않은 공용클라이언트(예를들어 단일 페이지 애플리케이션)에 서 일반적으로 사용됩니다. 접근 토큰의 경우, 일반적으로 사용됩니다. 접근 토큰의 경우, 일반적으로 케이블을 통해 전송되며 토큰 정보가 통신 중에 유출될 가능성이 있습니다. 접근 토큰의 생명주기와 유효성은 토큰 유출 또는 폐기시 영향을 줄이는 핵심 요소입니다.

반면 리프레시 토큰은 수명이 더 길고, 유효성은 사용자 및 클라이언트 세션에 설정된 생명주기에 따라 달라집니다. 이러한 특성으로 인해 ID 토큰과 접근 토큰은 짧은 생명주기를 가지며 리프레시 토큰은 해당 토큰들이 만료되는 경우 갱신할 수 있습니다. 리프레시 토큰은 수명이 길기 떄문에 공격자에게 완벽한 타깃이 되며, 만료와 폐기를 위한 명확한 전략도 필요합니다.

 

7. ID 토큰 및 접근 토큰 생명 주기 관리

Keycloak에서 세션과 마찬가지로 토큰 생명주기를 설정할 수 있습니다. 해당 설정을 하려면 Realm Settings페이지에서 Tokens 탭을 클릭합니다. Tokens 탭에서 리프레시 토큰에 대한 특정 설정 정의를 포함해 ID토큰, 접근토큰,리프레시 토큰의 생명주기를 설정합니다.

 

ID 토큰 및 접근 토큰의 경우 Access Token Lifespan 설정을 통해 생명주기를 설정할 수 있습니다.

Keycloak은 또한 Access Token Lifespan을 클라이언트 별로 설정할 수 있습니다

해당 설정을 하려면 클라이언트 상세 페이지로 이동한 다음 Advanced  탭을 클릭합니다.

 

스크롤을 내려 Advanced settings 섹션으로 이동합니다.

 

Advanced Settings에서 특정 클라이언트 ID 토큰 및 접근 토큰 생명주기를 재설정하기 위해 Access Token Lifespan을 설정합니다.

 

 

토큰이 유출될 경우 피해를 줄이기 위해 토큰 생명주기 값은 최대한 짧게 해 클라이언트가 해당 토큰을 갱신하도록 해야합니다. 하지만 토큰 생명주기 값이 너무 짧으면 토큰 리프레시 요청이 더 자주 발생하므로 애플리케이션 및 Keycloak자체의 성능에 영향을 줄 수 있습니다. 토큰 생명주기의 기본값은 대부분의 사용 사례에 적합해야 하지만 필요에 따라 값을 조정할 수 있습니다.

이 설정은 RFC 6750 - Bearer Token Useage에 따라 애플리케이션에 접근하기 위해 베어러(Bearer) 토큰으로 자주 전송되기 떄문에 접근 토큰에 특히 중요합니다. 

이 Keycloak에서 발행한 토큰은 JWT 포맷이며 애플리케이션이 Keycloak의 토큰 검사 엔드포인트를 사용해 토큰을 검사하기 위한 추가적인 통신 없이 토큰 시그니처 및 생명주기와 관련된 일부 표준 클레임의 유효성을 검증합니다. 또한 보안 요구 사항에 따라 토큰이 수명 내에 있지만 리프레시 토큰은 더 이상 Keycloak의 활성 세션에서 사용되지 않는 상황을 허용하지 않을 수 있습니다. 이러한 상황에서 보안을 위해 토큰 검사 엔드포인트를 사용할 때 추가 오버헤드가 필요할 수 있습니다.

생명주기는 사용자 경험과 클라이언트의 복잡성에도 직접적인 영향을 미칩니다. 일반적으로 수명이 짧은 토큰은 수명이 긴 리프레시 토큰과 함께 사용돼 토큰이 만료될 때마다 사용자가 재인증하는 것을 방지합니다. 리프레시 토큰을 사용하는 클라이언트는 리프래시 토큰을 처리하는 추가 논리로 인해 구현이 더 복잡합니다. 반면 빈번한 토큰 갱신 필요성이 없는 수명이 긴 토큰은 토큰이 유출될 경우 추가적인 위험을 갖고 있지만 클라이언트의 복잡성을 제거합니다. 환경에 맞는 적절한 균형을 찾을 필요가 있습니다.

 

8. 리프레시 토큰 생명 주기 관라

리프레시 토큰 생명주기는 사용자 세션과 클라이언트 세션의 생명주기를 각각 설정하기 위해 SSO Session Max 및 Client Session Max 설정을 정의합니다.

먼저 리프레시 토큰의 생명주기는 클라이언트 세션에 설정된 시간을 기반으로 계산되며 realm 수준의 Client Session Max를 설정하거나 동일한 설정을 클라이언트 기반으로 재설정합니다. 클라이언트 세션에 대한 생명주기나 명시적으로 설정되지 않은 경우, Keycloak은 SSO Session Max 설정에서 사용자 세션으로 설정한 값이 사용됩니다. 

클라이언트 기반의 리프레시 토큰 생명주기를 재설정하려면 클라이언트의 상세 페이지로 이동한 다음 Advanced탭 > Advanced settings 섹션으로 이동합니다.

 

Advanced Settings에서 Client Session Max 및 Client Session Idle 설정을 통해 리프레시 토큰 생명주기를 재설정할 수 있습니다. Keycloak은 기본적으로 클라이언트 수준에서 해당 설정에 대한 명시적 값을 정의하지 않으므로 realm 수준에서 설정된 값이 암시적으로 설정됩니다.

리프레시 토큰과 관련해 다음과 같은 내용을 고려해야합니다.

- 리프레시 토큰은 인증 코드와 같은 특정 권한 부여를 사용해 Keycloak에서 사용자를 인증한 후 항상 클라이언트 세션과 연동한다.

- 리프레시 토큰은 연동된 사용자 및 클라이언트 세션이 만료되지 않은 경우 유효한 것으로 간주된다.

- 클라이언트는 클라이언트 세션이 활성 상태인 경우에만 리프레시 토큰을 사용해 신규 토큰을 획득할 수 있습니다.

 

위 세가지 고려 사항을 고려하면 수명이 짧은 ID 토큰 및 접근 토큰을 사용하는데 있어서 리프레시 토큰의 역할이 얼마나 중요한지알게 될 것입니다.  또한 클라이언트 기반의 토큰 생명주기를 통해 보다 엄격한 정책을 정의해 애플리케이션의 전반적인 보안에도 큰 영향을 미칠 수 있습니다.

토큰 생명 주기 갱신은 얼마나 많은 클라이언트가 토큰을 안전하게 유지할 것인지에 따라 조정됩니다. 예를 들어 보안성이 높은 클라이언트는 수명이 더 긴 리프레시 토큰을 사용할 수 있지만 공용 클라이언트의 경우 수명이 짧은 리프레시 토큰을 사용해야 할 수도 있습니다.

하지만 리프레시 토큰이 만료되면 사용자는 클라이언트에 대한 재인증을 수행해야 하기 때문에 브라우절르 사용하는 경우 사용자 경험에 영향을 줄 수 있음을 고려해야합니다.

발생할 수 있는 최악의 상황 중 하나는 리프레시 토큰이 유출되는 경우입니다. 이를 통해 공격자는 Keycloak에서 토큰을 획득하고 토큰이 발급된 클라이언트로 위장해 애플리케이션에 접근할 수 있습니다. 이러한 상황이 발생한 경우 영향을 피하거나 줄이기 위해 사용할 수 있는 여러 대응책이 있습니다. 그중 하나는 리프레시 토큰 로테이션입니다.

 

9. 리프레시 토큰 로테이션 활성화

리프레시 토큰이 유출된 경우에 대한 보안 대응책으로 Keycloak에서 리프레시 토큰 로테이션을 활성화할 수 있습니다. 리프레시 토큰 로테이션은 합법적인 클라이언트가 리프레시 토큰 요청을 하는 경우에 영향을 줄이기 위한 전략입니다. 해당 기능을 활성화하면 로테이션은 리프레시 토큰이 언제 유출됐는지 신속하게 신별하고 신규 및 유효한 리프래시 토큰이 포함된 토큰 갱신 집합을 획득하기 위해 공격자와 합법적인 클라이언트 모두를 재인증합니다. 합법적인 클라이언트만 토큰 엔드포인트에 대해 인증할 수 있다는 점을 고려할때 클라이언트만 신규 리프래시 토큰을 성공적으로 얻을 수 있습니다.

리프래시 토큰 로테이션을 활성화하려면 Realm Settings 메뉴에서 Tokens 탭으로 이동한 다음 Revoke Refresh Token 설정을 활성화합니다.

 

해당 설정을 활성화하면 신규 리프래시 토큰을 재발급하지 않고, 클라이언트가 리프레시 토큰을 재사용할 수 있는 횟수를 정의한 Refresh Token Max Reuse 설정이 추가로 제공되며 해당 횟수가 초과되면 기존 리프레시 토큰은 폐기됩니다.

Refresh Token Max Reuse 설정은 기본적으로 0으로 설정되며, 리프레시 토큰의 재사용은 한번만 가능합니다. 클라이언트가 동일한 리프래시 토큰을 재사용하려고 시도하면 Keycloak은 해당 요청을 차단하고 클라이언트가 사용자를 재인증하도록 합니다. 예를들어 값을 1로 증가시키면 클라이언트가 동일한 리프래시 토큰을 두번사용 할 수있습니다.

실제로 리프레시 토큰 로테이션은 일반적으로 해당 토큰이 유출된 경우 공격 표면을 줄이는 좋은 방법입니다. 또한 유출을 신속하게 식별할 수 있으며 발생 가능한 공격에 대응할 수 있습니다. 하지만 공용 클라이언트의 경우 리프래시 토큰 로테이션이 고려할 수 있는 유일한 보안 조치는 아닙니다.

공용클라이언트는 토큰 앤드포인트에 인증하기 위해 자격증명을 제공할 필요가 없으므로 본질적으로 안전하지 않습니다. 따라서 클라이언트 인증서가 토큰을 발급받는 클라이언트에 바인딩하는데 사용되는 발신자 제한 토큰 사용을 수행하기 위해 상호 TLS 클라이언트 인증 사용을 고려해야하며, 이를 통해 리프래시 토큰을 토큰 엔드포인트에 제공할 때 공격자가 유출된 리프레시 토큰을 사용할 수 없게 할수 있습니다.

 

10. 토큰 폐기

Keycloak에서 여러가지 방법을 통해 토큰을 폐기할 수 있습니다. 토큰은 세션과 연동되며 만료된 세션의 토큰은 Keycloak에서 더이상 유효하지 않은 것으로 간주됩니다. 

사용자와 클라이언트에 관계없이 토큰을 전체적으로 비활성화하는 가장 쉬운 방법 가운데 하나는 not-before-revocation 정책을 사용해 토큰이 시간에 따라 만료되도록 하는것입니다.

Realm Settings로 이동한 후 Tokens 탭을 선택해 realm의 활성 세션을 관리할 수 있습니다

 

Keycloak을 사용하면 기본 세션을 만료하거나 RFC 7009에 정의된 폐기 엔드포인드를 사용해 토큰을 폐기할 수 있습니다.

세션만료를 통해 토큰을 폐기하면 관리자는 세션과 연동된 모든 토큰을 자동으로 폐기할 수 있습니다.

또한 Keycloak은 RFC7009 기반의 토큰 폐기(token revocation) 엔드포인트와 같은 특정 엔드포인트를 통해 클라이언트가 토큰을 폐기할 수 있도록해 줍니다.해당 접근 방식을 사용해 클라이언트는 Keycloak이 사용하지 않는 토큰을 추적하도록 돕고, 토큰이 유출되기 쉬운 시간을 줄이며 메모리와 CPU 리소스를 절약하기 위해 관련된 데이터를 정리할 수 있습니다. 

여기에 언급된 모든 방법은 토큰 유출에 대응하거나 토큰이 더이상 사용되지 않는 즉시 토큰을 폐기하는데 도움이 됩니다.

Not-before-revocation 정책을 제외하고 다른 모든 방법은 토큰 폐기 엔드포인트를 사용할 때 realm의 모든 활성 세션을 만료하거나 클라이언트 세션만 만료해 사용자 및 클라이언트 세션을 만료함을 의미합니다. Not-Before 정책은 토큰의 유효성을 검사하는 방법에만 영향을 주며 관련 세션은 여전히 활성 상태로 유지됩니다. 

 

이번글에서는 토큰 및 세션관리에 대한 몇가지 주요 측면을 살펴봤습니다. 다음글에서는 Keycloak 확장성에 대해 작성하겠습니다.

 

 

'WEB' 카테고리의 다른 글

Keycloak 시작하기 10  (0) 2025.02.21
Keycloak 시작하기 9  (0) 2025.02.20
Keycloak 시작하기 7  (0) 2025.02.18
Keycloak 시작하기 6  (0) 2025.02.11
Keycloak 시작하기 5  (0) 2025.02.11
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크