Update Baron SSO 로그인 화면 3가지 방식 절차 및 흐름.md
This commit is contained in:
@@ -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 사용자가 보는 절차
|
||||||
|
|||||||
Reference in New Issue
Block a user