31 lines
1.5 KiB
Markdown
31 lines
1.5 KiB
Markdown
# AP1 refresh rotation and logout
|
|
|
|
Realm 실행 profile:
|
|
|
|
- Access Token Lifespan: 300초
|
|
- Revoke Refresh Token: 활성화
|
|
- Refresh Token Max Reuse: 0
|
|
|
|
`e2e/pattern1.mjs`는 token 원문을 출력하지 않고 다음 순서를 실행한다.
|
|
|
|
1. browser Authorization Code + PKCE 로그인으로 AT₁/RT₁/ID Token을 받는다.
|
|
2. `signoutRedirect()`가 `id_token_hint`를 포함한 Keycloak logout endpoint를
|
|
호출하는지 확인한다.
|
|
3. logout 이후 새 authorization 요청에서 로그인 화면이 다시 필요한지
|
|
확인한다.
|
|
4. 새 RT₁으로 refresh하여 AT₂/RT₂를 받고 RT₂가 RT₁과 다른지 확인한다.
|
|
5. 이미 소비된 RT₁을 재사용해 성공하지 않는지 확인한다.
|
|
6. RT₁ 재사용 뒤 RT₂와 realm session 상태가 어떤 결과를 내는지 status로
|
|
기록한다. 이 결과를 사전에 family invalidation이라고 단정하지 않는다.
|
|
7. refresh token을 revoke한 뒤 같은 refresh token의 재사용은 실패하지만,
|
|
이미 발급된 self-contained access JWT는 `exp` 전까지 Resource Server에서
|
|
계속 `200`인 stateless 함정을 확인한다.
|
|
|
|
logout은 브라우저 SSO session을 종료하는 흐름이고 token revocation은 특정
|
|
token grant를 폐기하는 흐름이다. 둘은 목적과 endpoint가 다르다.
|
|
|
|
즉시 access 차단이 필요한 시스템이라면 짧은 access token TTL 외에
|
|
introspection, reference token 또는 별도 deny-list 같은 stateful 검증을
|
|
검토해야 한다. 이 AP1 구현은 JWT의 stateless 검증 특성을 의도적으로
|
|
유지한다.
|