SAML 브라우저 SSO 플로

SAML 브라우저 SSO 플로 (Web Browser SSO)

SSO(Single Sign-On)가 실제로 어떻게 동작하는지 한 가지 플로로 설명해 줄 수 있는 게 바로 **웹 브라우저 SSO 프로필(Web Browser SSO Profile)**이에요. 사용자가 SP(서비스 제공자)의 보호된 리소스를 요청하면, SP는 사용자 브라우저를 IdP(신원 공급자)로 돌려보내고, 인증된 사용자라는 결과를 담은 <Response>를 다시 받아 접근을 허가하는 흐름이지요. 여기서 주고받는 두 끝점, Single Sign-On ServiceAssertion Consumer Service의 이름을 기억해 두면 플로가 한눈에 들어와요.

출처: Profiles for the OASIS Security Assertion Markup Language (SAML) V2.0

본문

두 끝점부터 잡고 가요

  • Single Sign-On Service — IdP 쪽에 있는 인증 요청 프로토콜 끝점이에요. 사용자 브라우저가 <AuthnRequest>(또는 그것을 나타내는 artifact)를 여기로 전달받아요.
  • Assertion Consumer Service — SP 쪽에 있는 끝점이에요. <Response> 메시지(또는 artifact)가 브라우저를 거쳐 여기로 도착해요.

여섯 단계의 흐름

  1. HTTP 요청 to SP: 사용자(User Agent)가 SP의 보호된 리소스를 아직 보안 컨텍스트 없이 요청해요.
  2. SP가 IdP 결정: SP는 자신이 선호하는 바인딩을 지원하는 IdP의 끝점 위치를 구해요. 방법은 구현에 따라 다르고, SAML IdP 디스커버리 프로필을 쓸 수도 있어요.
  3. SP → IdP로 <AuthnRequest> 발행: SP는 사용자 브라우저가 IdP로 전달할 <AuthnRequest> 메시지를 만들어요. 이 메시지 전달에는 HTTP Redirect, HTTP POST, HTTP Artifact 바인딩을 쓸 수 있어요.
  4. IdP가 사용자 식별: IdP가 그 사람이 누구인지 식별해요. 새로 인증을 요구할 수도 있고, 이미 맺어진 인증 세션을 재사용할 수도 있어요.
  5. IdP → SP로 <Response> 발행: IdP는 사용자 브라우저가 SP로 전달할 <Response> 메시지를 내보내요. 이때 HTTP POST 또는 HTTP Artifact 바인딩을 사용하고, 메시지에는 (최소한) 인증 어써션이 들어가요. HTTP Redirect는 응답이 대부분 사용자 에이전트의 URL 길이 한계를 넘어서므로 MUST NOT 사용해요.
  6. SP가 접근 허용/거부: SP는 받은 응답에 따라 사용자에게 자기 오류를 돌려주거나, 보안 컨텍스트를 세우고 요청한 리소스를 돌려줘요.

그림으로 보면

User Agent           Identity Provider          Service Provider
   |                         |                         |
   |  1. 보호된 리소스 요청    |                         |
   |-------------------------->                         |
   |                         |    2. IdP 결정 (방법 다양) |
   |                         |<------------------------|
   |  3. <AuthnRequest> 발행 |                         |
   |<------------------------>|                         |
   |  4. IdP가 사용자 식별     |                         |
   |  (방법은 프로필 밖)       |                         |
   |  5. <Response> 발행       |                         |
   |------------------------->|                         |
   |  6. 접근 허용/거부 결정   |                         |
   |<-------------------------|                         |

ForceAuthnIsPassive

<AuthnRequest>ForceAuthn 속성이 true면 IdP는 기존 세션에 기대지 않고 새로 사용자 신원을 확인하도록 강제돼요. 반대로 IsPassive가 있으면 IdP가 사용자를 실제 로그인 화면에 끌어들이지 못하게 돼요. 이 두 속성은 "얼마나 강하게, 얼마나 조용히 인증할지"를 조절한다고 볼 수 있어요.

RelayState

SP가 원래 요청과 그 뒤의 상호작용을 이어주고 싶을 때, 각 바인딩이 제공하는 RelayState 메커니즘을 쓸 수 있어요. SP는 보안이 필요하지 않은 경우 외에는 RelayState 값에 원래 요청 내용을 되도록 조금만 노출하도록 해요.

더 알아보기

  • SAML 싱글 로그아웃 플로 — SSO로 시작된 세션을 한 번에 끝내는 흐름.
  • SAML 어써션<Response>가 운반하는 인증 어써션의 구조.
  • SAML 바인딩<AuthnRequest>/<Response>를 HTTP로 옮기는 Redirect·POST 방식.
  • SAML 메타데이터 — 두 끝점과 바인딩 지원을 기술하는 엔티티 문서.