Skip to content

[oauth] 활성 IdP 세션 조회 및 개별 종료 - #439

Open
ZaMan0806 wants to merge 3 commits into
feature/oauth-oidc-id-tokenfrom
feature/oauth-session-management
Open

[oauth] 활성 IdP 세션 조회 및 개별 종료#439
ZaMan0806 wants to merge 3 commits into
feature/oauth-oidc-id-tokenfrom
feature/oauth-session-management

Conversation

@ZaMan0806

Copy link
Copy Markdown
Collaborator

개요

SSO 로드맵 우선순위 5 — 세션 관리 기능 중 조회와 개별 종료를 구현합니다. (전체 세션 종료는 #437에서 비밀번호 변경 시 자동 실행으로 이미 처리했습니다.)

스택 PR입니다. base는 #438입니다.

본문

변경 내용

GET /v1/oauth/idp-sessions — 현재 쿠키가 가리키는 계정의 활성 세션 목록
DELETE /v1/oauth/idp-sessions/{targetSessionId} — 개별 세션 종료

인증 모델

이 엔드포인트들은 세션 쿠키 자체를 자격 증명으로 씁니다. bearer token이 아니라 브라우저가 쿠키와 함께 직접 호출하는 흐름이기 때문입니다. 조회·삭제 대상을 그 쿠키의 계정으로 한정하므로, 다른 계정의 세션에 접근할 경로가 생기지 않습니다.

다른 계정의 세션을 종료하려는 요청은 존재하지 않는 세션과 동일한 404로 응답합니다. 403과 404를 구분하면 세션 ID를 넣어보는 것만으로 "그 세션이 실재하는지"를 알아낼 수 있기 때문입니다. 이 동작은 테스트로 못박았습니다.

기기 구분 정보

목록이 쓸모 있으려면 "어느 기기인지"가 보여야 해서 userAgentcreatedAt을 세션에 기록합니다.

userAgent핸드오프(GET) 시점에 채웁니다. 세션을 만드는 POST /v1/oauth/authorize는 BFF의 서버-투-서버 호출이라 그 시점의 User-AgentBFF의 것입니다. 브라우저가 직접 오는 핸드오프에서만 사용자의 실제 값을 얻을 수 있습니다.

기존에 발급된 세션에는 두 값이 없으므로 nullable로 두었습니다.

검증

  • 신규 테스트 12건 포함 183건 통과, ktlintCheck build 통과
  • 뮤테이션 테스트:
    • 소유권 검사 제거(남의 세션 종료 가능) → 2건 실패
    • 자기 세션 종료 시 쿠키 미만료 → 1건 실패
    • 조회 시 계정 한정 해제 → 4건 실패

프론트엔드 필요 작업

  • 세션 관리 화면 — 목록 표시 + 개별 종료 버튼
  • current: true인 항목은 "현재 기기"로 표시하고, 종료 시 로그아웃됨을 안내하면 좋습니다.

남은 과제 (로드맵)

  • 로그아웃 전파(back-channel logout) — SP가 여러 개로 늘어난 뒤 판단
  • 세션 절대 만료 / 동시 세션 수 제한
  • IdP 세션 생성·사용·만료 메트릭 (SSO 적중률 측정)
  • OauthUserPrincipal / OauthAuthenticationToken 중복을 datagsm-common으로 승격 검토

"어떤 기기에서 로그인 중인지" 확인하고 특정 기기만 로그아웃할 수 있게 한다.

- GET /v1/oauth/idp-sessions — 현재 쿠키가 가리키는 계정의 활성 세션 목록
- DELETE /v1/oauth/idp-sessions/{targetSessionId} — 개별 세션 종료

세션 쿠키 자체를 자격 증명으로 쓰고, 조회·삭제 대상을 그 쿠키의 계정으로
한정한다. 다른 계정의 세션을 종료하려는 요청은 존재하지 않는 세션과 같은
404로 응답해, 세션 존재 여부까지 탐지되지 않게 한다.

기기 구분을 위해 userAgent와 createdAt을 세션에 기록한다. userAgent는
핸드오프(GET) 시점에 채운다. 세션을 만드는 POST는 BFF의 서버-투-서버
호출이라 User-Agent가 BFF의 것이기 때문이다. 기존 세션에는 두 값이 없으므로
nullable로 둔다.
@ZaMan0806
ZaMan0806 added this pull request to stack #434 September 9, 2026 14:26

@pr-agent-demo pr-agent-demo Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overview

  • OAuth IdP 세션 관리 기능을 추가하는 스택 PR입니다.
  • 현재 세션 쿠키를 기준으로 활성 세션 목록 조회개별 세션 종료 엔드포인트를 제공합니다.
  • 세션에 userAgentcreatedAt을 기록해 기기/로그인 시각을 구분할 수 있도록 합니다.

Intent

  • SSO 세션 관리 로드맵 중 “활성 세션 조회”와 “개별 세션 종료”를 구현하기 위한 목적입니다.
  • 사용자가 현재 로그인된 다른 기기 세션을 확인하고, 필요 시 특정 세션만 종료할 수 있도록 하려는 의도로 보입니다.
  • 다른 계정의 세션 존재 여부를 노출하지 않도록 404 응답을 통일하는 보안 설계도 함께 반영했습니다.

Risk

  • 전체 위험도: 중간
  • 검토자가 특히 살펴볼 영역:
    • 세션 쿠키 기반 인증 로직의 정확성
    • 타 계정 세션 접근/삭제 방지 로직
    • userAgent 저장 시 길이 제한, 변조 가능성
    • Redis 엔티티 변경에 따른 기존 세션 호환성
    • 현재 세션 종료 시 쿠키 처리, 프론트엔드 연동 영향도

0 inline comment(s)

@github-actions github-actions Bot added the waiting for review:검토 대기 확인을 대기하고 있습니다 label Sep 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

waiting for review:검토 대기 확인을 대기하고 있습니다

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant