[oauth] IdP 로그아웃 및 비밀번호 변경 시 세션 무효화 - #437
Open
ZaMan0806 wants to merge 2 commits into
Open
Conversation
로그아웃 기능이 없어 세션 쿠키가 만료(기본 8시간)될 때까지 유지되던 공백을 메운다. 공용 PC에서 특히 문제가 된다. - POST /v1/oauth/logout 추가. 세션을 삭제하고 쿠키를 즉시 만료시킨다. 세션이 없어도 동일하게 204를 반환해, 쿠키 값만 가진 쪽에 유효한 세션인지 판별할 단서를 주지 않는다. - 쿠키 발급/만료를 IdpSessionCookieFactory로 모았다. 브라우저는 name/path/domain이 일치해야 기존 쿠키를 덮어쓰므로, 두 형태를 따로 조립하면 속성이 어긋나는 순간 로그아웃이 조용히 실패한다. - 비밀번호 변경 시 해당 계정의 IdP 세션을 전부 삭제한다. 기존에는 refresh token만 지워, 탈취된 세션 쿠키로 새 인가를 계속 받을 수 있었다. 역방향 조회를 위해 email에 @indexed를 추가했다. 이미 발급된 access token은 만료 전까지 유효하므로, 각 SP는 자기 토큰이 만료될 때까지 로그인 상태로 보인다. 전파(back-channel logout)는 별도 과제다.
ZaMan0806
added this pull request to stack #434
September 9, 2026 14:26
There was a problem hiding this comment.
-
Overview:
IdP 세션 로그아웃 API를 추가하고, 세션 쿠키 발급/만료 로직을IdpSessionCookieFactory로 통일했습니다. 또한 비밀번호 변경 시 해당 계명의 IdP 세션을 모두 삭제하도록 했습니다. -
Intent:
공용 PC 등 환경에서 세션이 오래 유지되는 문제를 줄이고, 계정 탈취 후에도 기존 세션 쿠키로 계속 인가되는 것을 막기 위한 보안 강화를 목적으로 합니다. -
Risk:
전반적으로 보안 관련 변경이라 중도~높은 주의가 필요합니다. 특히 로그아웃 API의 CSRF 안전성, 쿠키 속성 불일치로 인한 로그아웃 실패 가능성, 그리고 로그아웃 시에도 남아 있는 refresh token/access token의 영향 범위를 검토해야 합니다. 비밀번호 변경 시 email 기준 세션 삭제 로직의 정확성도 확인이 필요합니다.
0 inline comment(s)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
개요
SSO 로드맵 우선순위 2 — 로그아웃 및 전파의 최소 구현과, 우선순위 5에서 떼어낸 "비밀번호 변경 시 세션 무효화" 를 함께 처리합니다. 로드맵이 이 둘을 묶어 권장한 항목입니다.
본문
왜 필요한가
로그아웃 기능이 아예 없었습니다. 세션 쿠키가 만료(기본 8시간)될 때까지 유지되어 공용 PC에서 특히 위험합니다.
그리고 비밀번호를 바꿔도 기존 IdP 세션이 그대로 살아있었습니다. 비밀번호 변경은 계정 탈취 대응인 경우가 많은데, 세션이 남아 있으면 공격자가 기존 쿠키로 계속 새 인가를 받을 수 있습니다. 기존 코드는 refresh token만 지우고 있었습니다.
변경 내용
1.
POST /v1/oauth/logout세션을 삭제하고 쿠키를 즉시 만료시킵니다. 세션이 이미 없어도 동일하게 204를 반환합니다 — 존재 여부를 알려주면 쿠키 값만 가진 쪽에 유효한 세션인지 판별할 단서를 주게 되고, 사용자 입장에서 결과는 어차피 같습니다.
2.
IdpSessionCookieFactory도입브라우저는
name/path/domain이 모두 일치해야 기존 쿠키를 덮어씁니다. 발급과 만료를 각각 따로 조립하면 속성이 어긋나는 순간 로그아웃이 조용히 실패하므로, 두 형태를 같은 자리에서 만들도록 모았습니다.3. 비밀번호 변경 시 세션 전체 삭제
역방향 조회를 위해
IdpSessionRedisEntity.email에@Indexed를 추가했습니다. 같은 모듈의OauthRefreshTokenRedisEntity가 이미 쓰는 방식과 동일합니다.검증
ktlintCheck build통과Max-Age=0제거 → 2건 실패Path불일치 → 1건 실패알려진 한계
이미 발급된 access token은 만료 전까지 유효하므로, 각 SP는 자기 토큰이 만료될 때까지(기본 1시간) 로그인 상태로 보입니다. 완전한 전파(back-channel logout)는 SP별
backchannel_logout_uri등록이 필요해 SP가 여러 개로 늘어난 뒤 판단하는 것이 낫다고 보고 별도 과제로 남겼습니다.절충안으로 access token 만료를 15~30분으로 줄이면 로그아웃 후 그 시간 내에 모든 SP가 자연스럽게 수렴합니다(
OAUTH_ACCESS_TOKEN_EXPIRATION).프론트엔드 필요 작업
POST /v1/oauth/logout(쿠키가 실려야 하므로 credentials 포함)