Update Baron SSO 로그인 화면 3가지 방식 절차 및 흐름.md

This commit is contained in:
2026-06-22 17:01:08 +09:00
parent ad23345001
commit cf82bbd5c7

View File

@@ -216,6 +216,31 @@ flowchart LR
| Ory Public | `브라우저 또는 Nginx -> Oathkeeper -> Kratos/Hydra` | Ory public API 또는 OIDC public endpoint | | Ory Public | `브라우저 또는 Nginx -> Oathkeeper -> Kratos/Hydra` | Ory public API 또는 OIDC public endpoint |
| 내부 백채널 | `Backend -> Kratos/Hydra/Redis` | 세션 발급, OIDC accept, 대기 상태 저장 | | 내부 백채널 | `Backend -> Kratos/Hydra/Redis` | 세션 발급, OIDC accept, 대기 상태 저장 |
### 3.3 공통 토큰 저장 위치
비밀번호, 로그인 링크, QR 코드 중 어떤 방식으로 로그인하더라도 로그인 완료 후 등장하는 토큰 종류는 공통으로 이해해야 한다. Kratos가 발급하는 Baron SSO 세션 토큰과 Hydra가 발급하는 RP용 OAuth2/OIDC 토큰은 저장 주체와 용도가 다르다.
| 토큰/세션 | 발급 주체 | 받는 주체 | 일반 저장 위치 | 용도 |
| --- | --- | --- | --- | --- |
| Kratos `session_token` | Kratos | Baron Backend -> UserFront | UserFront 브라우저 저장소 또는 Kratos 세션 쿠키 | Baron SSO/UserFront에서 사용자가 로그인되어 있음을 판단 |
| Kratos 세션 쿠키 | Kratos | Baron Backend가 응답 쿠키로 전달 | 사용자 브라우저 쿠키 | 쿠키 기반 SSO 세션 확인 |
| Hydra authorization code | Hydra | 브라우저를 통해 RP callback으로 전달 | 보통 임시값이며 장기 저장하지 않음 | RP가 token endpoint에서 토큰으로 교환 |
| Hydra `access_token` | Hydra | RP | RP 앱 유형에 따라 다름. 서버형 RP는 서버 세션/서버 저장소, SPA/PKCE는 브라우저 메모리 또는 제한적 브라우저 저장소 | RP가 API 호출 시 사용하는 접근 토큰 |
| Hydra `id_token` | Hydra | RP | RP 앱 유형에 따라 다름. 보통 RP 세션 생성 후 필요한 claim만 세션에 반영 | RP가 사용자 신원 claim을 확인 |
| Hydra `refresh_token` | Hydra | RP | 서버형 RP는 서버 저장소 또는 암호화된 세션 저장소 권장. 순수 브라우저 저장은 위험 | access token 재발급 |
| RP 로컬 세션 | RP | 사용자 브라우저 | RP 도메인의 세션 쿠키 + RP 서버 세션 저장소 | RP 내부 로그인 유지 |
현재 UserFront 웹 구현은 Kratos `sessionJwt``baron_auth_token` 키로 브라우저 저장소에 보관할 수 있다. 쿠키 모드에서는 로컬 토큰을 제거하고 `baron_auth_cookie_mode` 플래그를 남겨 쿠키 기반 세션 확인으로 전환한다.
반대로 Hydra의 `access_token`, `id_token`, `refresh_token`은 Baron UserFront가 보관하는 토큰이 아니다. RP가 authorization code를 Hydra token endpoint에서 교환한 뒤 받는 토큰이므로, 저장 위치는 RP 구현 방식에 따라 결정된다.
운영 권고는 다음과 같다.
1. server-side RP는 Hydra token을 브라우저 localStorage에 두지 말고 서버 세션 또는 서버 저장소에 보관한다.
2. 브라우저에는 RP 자체 세션 쿠키만 내려주는 구조가 안전하다.
3. PKCE SPA는 access token을 가능하면 메모리 중심으로 다루고, refresh token을 브라우저 장기 저장소에 두는 방식은 신중히 검토한다.
4. 로그에는 `sessionJwt`, `access_token`, `id_token`, `refresh_token`, 쿠키 원문을 남기지 않는다.
## 4. 비밀번호 로그인 ## 4. 비밀번호 로그인
### 4.0 로그인 화면이 뜨기 전 순서 ### 4.0 로그인 화면이 뜨기 전 순서
@@ -355,12 +380,16 @@ sequenceDiagram
BE->>HY: AcceptLoginRequest(login_challenge, subject) BE->>HY: AcceptLoginRequest(login_challenge, subject)
HY-->>BE: redirectTo HY-->>BE: redirectTo
BE-->>UF: sessionJwt + redirectTo BE-->>UF: sessionJwt + redirectTo
UF->>RP: OIDC callback 이동 UF->>RP: OIDC callback 이동(code 포함)
RP->>HY: /oauth2/token에서 authorization code 교환
HY-->>RP: access_token, id_token, refresh_token 발급
else 일반 로그인 else 일반 로그인
BE-->>UF: sessionJwt BE-->>UF: sessionJwt
end end
``` ```
비밀번호 로그인에서도 토큰 저장 위치는 `3.3 공통 토큰 저장 위치`를 따른다. 즉 Kratos가 발급한 `session_token`은 UserFront 로그인 상태용으로 사용되고, RP에서 시작된 OIDC 흐름이면 Hydra가 후속으로 authorization code 및 RP용 `access_token`, `id_token`, `refresh_token`을 발급한다. Hydra 토큰은 UserFront가 아니라 RP가 자기 정책에 따라 저장한다.
## 5. 로그인 링크 ## 5. 로그인 링크
### 5.1 사용자가 보는 절차 ### 5.1 사용자가 보는 절차