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