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