diff --git a/Baron SSO 로그인 화면 3가지 방식 절차 및 흐름.md b/Baron SSO 로그인 화면 3가지 방식 절차 및 흐름.md index 4308855..8dd8f76 100644 --- a/Baron SSO 로그인 화면 3가지 방식 절차 및 흐름.md +++ b/Baron SSO 로그인 화면 3가지 방식 절차 및 흐름.md @@ -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