Skip to content

fix(oidc): end-session 이 만료 id_token_hint 를 수용 (RP-Initiated Logout §2) - #79

Merged
mack-erel merged 2 commits into
mainfrom
fix/oidc-end-session-expired-id-token-hint
Jul 7, 2026
Merged

fix(oidc): end-session 이 만료 id_token_hint 를 수용 (RP-Initiated Logout §2)#79
mack-erel merged 2 commits into
mainfrom
fix/oidc-end-session-expired-id-token-hint

Conversation

@mack-erel

Copy link
Copy Markdown
Owner

요약

GET/POST /oidc/end-session 이 만료된 id_token_hint 를 거부해 정상 로그아웃이 400 {"error":"invalid_id_token_hint"} 로 실패하는 버그 수정.

OIDC RP-Initiated Logout 1.0 §2 는 id_token_hint 가 만료된 ID Token 이어도 됨(MAY be expired)을 명시하고, 만료만을 이유로 요청을 거부해서는 안 된다고 규정한다. verifyIdToken 에는 정확히 이 용도의 ignoreExpiry 옵션이 이미 존재했으나(주석에도 명시), end-session 의 두 호출부가 넘기지 않아 발생한 누락이다.

실제 증상: id_token TTL(약 10분) 초과 후 RP 가 로그인 시점 id_token 을 hint 로 로그아웃 요청 → 항상 400. RP 로컬 세션만 지워지고 IdP SSO 세션은 남는 "부분 로그아웃" 상태 발생.

변경 내용

  • src/routes/oidc/end-session/+server.ts — GET/POST 두 verifyIdToken 호출부에 ignoreExpiry: true 추가. 만료 검사만 무시하고 나머지 방벽은 전부 유지:
    • 서명 검증 (우리 서명키 RS256)
    • expectedIssuer 일치
    • sub 와 현재 세션 사용자 일치
    • client_id 명시 시 aud 일치
    • events claim 보유 토큰(BC logout token) 거부 — type-confusion 방어
  • verifyIdToken 의 기본 동작(옵션 없을 때 만료 거부)은 변경 없음. 다른 사용처(introspection 등)에는 전파하지 않음.

테스트

test/integration/end-session.test.ts 신규 (실 DB 하네스, 7케이스):

  • 만료 hint 수용: GET/POST 모두 로그아웃 수행 + 등록된 post_logout_redirect_uri 로 302 (state 전파), 세션 revoke 확인
  • 만료 무시는 만료에만 한정: 서명 위조 / issuer 불일치 / sub 불일치 / aud 불일치 / BC logout token 은 여전히 거부 (거부 시 세션 미revoke 확인)
  • 수정 없이 실행하면 7케이스 중 3케이스가 실패함을 확인 (테스트가 버그를 실제로 잡음)
  • 다른 컨텍스트의 만료 거부 회귀는 기존 test/unit/crypto-keys.test.ts 케이스가 커버

전체 스위트 233/233 통과, bun run check 0 errors, prettier/eslint 통과.

🤖 Generated with Claude Code

mack-erel and others added 2 commits July 7, 2026 15:45
verifyIdToken 에 ignoreExpiry 옵션이 이미 있으나 end-session GET/POST 가
넘기지 않아 만료 토큰이 invalid_id_token_hint 로 거부됨. 스펙상 id_token_hint 는
만료돼도 유효한 힌트이므로 ignoreExpiry:true 전달. 서명/issuer/sub/aud/events
검증은 유지 — 만료 검사만 무시.

통합 테스트(end-session.test.ts) 추가: 만료 힌트 수용(GET/POST) 및
서명 위조·issuer 불일치·sub 불일치·aud 불일치·BC logout token 거부 유지 검증.

Co-Authored-By: Claude Fable 5 <[email protected]>
@mack-erel
mack-erel merged commit cfd8d00 into main Jul 7, 2026
6 checks passed
@mack-erel
mack-erel deleted the fix/oidc-end-session-expired-id-token-hint branch July 7, 2026 06:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant