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

This commit is contained in:
2026-06-22 17:06:57 +09:00
parent cf82bbd5c7
commit 897e3d82c1

View File

@@ -180,31 +180,30 @@ Baron Backend = 두 시스템을 연결해서 완료 처리하는 중계자
`login_challenge`는 "이 사용자가 누구인가"를 나타내는 값이 아니다. "이 RP 로그인 요청 건이 무엇인가"를 나타내는 임시 접수번호다. 사용자가 로그인 화면에서 비밀번호, 로그인 링크, QR 코드 중 하나로 인증을 마치면 Backend가 이 접수번호를 들고 Hydra에 `AcceptLoginRequest`를 호출하여 "이 접수 건은 이 사용자로 로그인 완료"라고 알려준다.
```mermaid
flowchart LR
User[사용자 브라우저]
flowchart TD
U[사용자 브라우저]
RP[RP/업무시스템]
L7[Traefik 또는 외부 L7]
GW[Baron Gateway Nginx]
UF[UserFront 로그인 화면]
BE[Baron Backend]
EDGE[L7/Traefik + Baron Gateway Nginx]
OK[Oathkeeper]
UF[UserFront]
BE[Baron Backend]
KR[Ory Kratos]
HY[Ory Hydra]
Redis[Redis]
R[Redis]
User -->|업무시스템| RP
RP -->|OIDC 인증 요청 /oidc/oauth2/auth| L7
User -->|Baron SSO 화면/API 요청| L7
L7 --> GW
GW -->|/| UF
GW -->|/api/v1/*| BE
GW -->|/auth/*| OK
GW -->|/oidc/*| OK
OK --> KR
U -->|RP 보호 페이지| RP
RP -->|/oidc/oauth2/auth| EDGE
EDGE -->|/oidc/*, /auth/*| OK
OK --> HY
BE --> Redis
OK --> KR
HY -->|login_challenge로 화면 이동| U
U -->|로그인 화면 요청 /| EDGE
EDGE --> UF
UF -->|/api/v1/*| EDGE
EDGE --> BE
BE --> KR
BE --> HY
BE --> R
```
운영 관점에서는 다음 경로를 구분해서 설명하면 이해하기 쉽다.
@@ -344,46 +343,72 @@ sequenceDiagram
### 4.4 흐름도
아래 흐름도는 "로그인 화면 표시 전 OIDC 요청 접수"와 "비밀번호 입력 후 세션 발급"을 한 번에 이어서 보여준다.
아래 흐름도는 화면이 잘리지 않도록 세 단계로 나누어 표시한다.
주의할 점은 4번의 `/oidc/* -> Hydra` 단계가 비밀번호나 access token을 검사하는 단계가 아니라는 것이다. 이 단계는 RP의 OIDC 인증 요청을 Hydra가 접수하고, `client_id``redirect_uri` 등을 확인한 뒤 `login_challenge`를 만들어 UserFront 로그인 화면으로 보내는 단계다.
#### 4.4.1 RP 접속부터 로그인 화면 표시까지
```mermaid
sequenceDiagram
autonumber
actor User as 사용자
participant RP as RP/업무시스템
participant L7 as L7/Traefik
participant GW as Baron Gateway Nginx
participant Edge as L7/Nginx
participant OK as Oathkeeper
participant UF as UserFront
participant BE as Baron Backend
participant KR as Ory Kratos
participant HY as Ory Hydra
participant UF as UserFront
User->>RP: 업무시스템 접속
RP-->>User: /oidc/oauth2/auth?client_id=... 로 리다이렉트
User->>L7: GET /oidc/oauth2/auth?client_id=...
L7->>GW: OIDC 요청 전달
GW->>OK: /oidc/* 경로 전달
RP->>RP: RP 세션 확인
RP-->>User: /oidc/oauth2/auth로 리다이렉트
User->>Edge: GET /oidc/oauth2/auth?client_id=...
Edge->>OK: /oidc/* 전달
OK->>HY: Hydra /oauth2/auth 전달
HY->>HY: RP 요청 검증 login_challenge 생성
HY->>HY: RP 요청 검증, login_challenge 생성
HY-->>User: UserFront 로그인 화면으로 리다이렉트
User->>UF: 로그인 화면 표시
User->>Edge: UserFront 화면 요청
Edge->>UF: / 경로 전달
UF-->>User: 로그인 화면 표시
```
#### 4.4.2 비밀번호 인증과 SSO 세션 생성
```mermaid
sequenceDiagram
autonumber
actor User as 사용자
participant UF as UserFront
participant Edge as L7/Nginx
participant BE as Baron Backend
participant KR as Ory Kratos
User->>UF: 이메일/휴대폰 + 비밀번호 입력
UF->>L7: POST /api/v1/auth/password/login
L7->>GW: API 요청 전달
GW->>BE: /api/v1/auth/password/login
UF->>Edge: POST /api/v1/auth/password/login
Edge->>BE: /api/v1/auth/password/login
BE->>KR: Kratos password 인증
KR-->>BE: session_token, cookie
BE-->>UF: sessionJwt 또는 sessionJwt + redirectTo
```
#### 4.4.3 RP OIDC 로그인 후속 처리
```mermaid
sequenceDiagram
autonumber
participant UF as UserFront
participant BE as Baron Backend
participant HY as Ory Hydra
participant RP as RP/업무시스템
alt login_challenge 있음
BE->>HY: AcceptLoginRequest(login_challenge, subject)
HY-->>BE: redirectTo
BE-->>UF: sessionJwt + redirectTo
UF->>RP: OIDC callback 이동(code 포함)
RP->>HY: /oauth2/token에서 authorization code 교환
RP->>HY: /oauth2/token에서 code 교환
HY-->>RP: access_token, id_token, refresh_token 발급
else 일반 로그인
else 일반 UserFront 로그인
BE-->>UF: sessionJwt
end
```
@@ -497,26 +522,25 @@ UserFront 응답 필드명: sessionJwt
### 5.4 흐름도
아래 흐름도는 가로 폭이 커지지 않도록 로그인 링크 초기화, 승인 대기, OIDC 후속 처리로 나누어 표시한다.
#### 5.4.1 로그인 링크 초기화
```mermaid
sequenceDiagram
autonumber
actor User as 사용자
participant UF as 요청 브라우저(UserFront)
participant L7 as L7/Traefik
participant GW as Baron Gateway Nginx
participant Edge as L7/Nginx
participant BE as Baron Backend
participant Redis as Redis
participant KA as Ory Kratos/Admin
participant KR as Ory Kratos/Courier
participant HY as Ory Hydra
participant RP as RP/업무시스템
participant Redis as Redis
participant Channel as Email/SMS
participant Approver as 링크 승인 기기
User->>UF: 로그인 링크 탭에서 이메일/휴대폰 입력
UF->>L7: POST /api/v1/auth/enchanted-link/init
L7->>GW: API 요청 전달
GW->>BE: init 요청
UF->>Edge: POST /api/v1/auth/enchanted-link/init
Edge->>BE: init 요청
BE->>BE: 입력값 정리 및 전화번호 정규화
BE->>KA: IdpProvider.UserExists(loginId)로 identity 조회
KA-->>BE: 사용자 존재 여부 반환
@@ -524,6 +548,18 @@ sequenceDiagram
BE->>Redis: pendingRef 상태 저장(status=pending)
KR-->>Channel: 로그인 링크 또는 코드 발송
BE-->>UF: pendingRef, expiresIn, interval
```
#### 5.4.2 요청 브라우저 대기와 승인
```mermaid
sequenceDiagram
autonumber
actor User as 사용자
participant UF as 요청 브라우저
participant BE as Baron Backend
participant Redis as Redis
participant Approver as 링크 승인 기기
loop 요청 브라우저 대기
UF->>BE: POST /api/v1/auth/enchanted-link/poll(pendingRef)
@@ -535,6 +571,20 @@ sequenceDiagram
Approver->>BE: POST /api/v1/auth/magic-link/verify 또는 /login/code/verify
BE->>Redis: pendingRef 승인 처리(status=approved/success)
UF->>BE: poll 재시도
```
#### 5.4.3 Kratos 세션 발급과 Hydra OIDC 완료
```mermaid
sequenceDiagram
autonumber
participant UF as 요청 브라우저
participant BE as Baron Backend
participant Redis as Redis
participant KR as Ory Kratos
participant HY as Ory Hydra
participant RP as RP/업무시스템
BE->>KR: Kratos 코드 검증/세션 발급 요청
KR-->>BE: Kratos session_token 반환
BE->>Redis: session_token을 pendingRef 성공 상태에 저장
@@ -543,7 +593,7 @@ sequenceDiagram
HY-->>BE: redirectTo 반환
BE-->>UF: sessionJwt + redirectTo
UF->>RP: redirectTo 따라 RP callback 이동(code 포함)
RP->>HY: /oauth2/token에서 authorization code 교환
RP->>HY: /oauth2/token에서 code 교환
HY-->>RP: access_token, id_token, refresh_token 발급
else UserFront 일반 로그인(login_challenge 없음)
BE-->>UF: sessionJwt 필드로 Kratos session_token 전달
@@ -631,22 +681,22 @@ Redis 저장 예시:
### 6.4 흐름도
QR 흐름도는 화면 폭을 줄이기 위해 L7과 Nginx를 `L7/Nginx`로 묶어 표현한다.
```mermaid
sequenceDiagram
autonumber
actor User as 사용자
participant PC as 요청 PC(UserFront)
participant L7 as L7/Traefik
participant GW as Baron Gateway Nginx
participant Edge as L7/Nginx
participant BE as Baron Backend
participant Redis as Redis
participant Mobile as 이미 로그인된 승인 기기
participant KR as Ory Kratos
User->>PC: QR 코드 탭 선택
PC->>L7: POST /api/v1/auth/qr/init
L7->>GW: API 요청 전달
GW->>BE: QR init
PC->>Edge: POST /api/v1/auth/qr/init
Edge->>BE: QR init
BE->>Redis: pendingRef/status=pending 저장
BE->>Redis: qrRef -> pendingRef 매핑 저장
BE-->>PC: qrCode URL, pendingRef, expiresIn