- SAML(Single Assertion Markup Language)은 XML 형식의 보안 관련 메시지를 교환하기 위한 규칙을 정의하는 표준
- 주로 3개 이상의 독립된 엔티티 간 메시지 교환에 사용됨
- 일반적인 시나리오는 서로 다른 회사에서 만든 두 소프트웨어 시스템과 사용자가 관련된 경우
- 두 시스템은 사용자에 대한 정보를 교환해야 함
- 커스텀 인티그레이션 할 수도 있지만 유지보수가 어려움
- SAML은 시스템 간에 동일한 규칙을 따르게 하여 복잡한 통합 작업을 단순화함
SAML 메시지 형식
- SAML 메시지는 XML 형식으로 이루어짐
- 메시지 구문을 정의하고 메시지 내용을 안전하게 처리하는 방법을 알려줌
-
<Response>
태그를 받으면 <Assertion>
태그를 찾아야 한다는 것 등을 알 수 있음
- 디지털 서명이 어떻게 생겼는지, 보안 문제를 피하기 위해 메시지를 어떻게 처리해야 하는지에 대한 지침을 제공함
SAML의 유연성
- SAML은 유연성을 강조하여 설계됨. 원칙적으로는 SAML로 많은 작업을 할 수 있음, 하지만 그 유연성이 복잡성으로 이어짐
- SAML 사양에는 수많은 예외사항이 있고, 많은 if와 예를 들어가 있어서 엣지 케이스를 추가함
- SAML은 오래됐기 때문에 일부 사람들은 유연성을 활용함
- 실제 운영 환경, 특히 레거시 시스템에서는 SAML이 비정상적인 동작을 하는 경우가 있음
- 대부분은 SAML의 작은 하위 집합에만 집중하면 삶이 더 편해짐
SAML의 실제 사용 목적
- SAML은 주로 Single Sign-On(SSO)에 사용됨
- SAML은 몇 가지 이상한 SSO 유형을 정의하지만, 일반적으로 Web Browser SSO Profile을 사용함
- 최종 사용자는 중앙 집중식 시스템에 먼저 인증한 다음 원하는 소프트웨어 애플리케이션에 액세스함
- 사용자는 애플리케이션에 직접 인증하지 않음
- 예를 들어 Okta를 사용하여 이메일에 액세스한 적이 있다면 Web Browser SSO Profile을 사용한 것임
SSO에 관련된 엔터티
- SSO에는 3가지 주체가 관련됨:
- 사용자: 애플리케이션을 사용하려는 사람
- 서비스 제공자(SP): 애플리케이션 자체
- ID 제공자(IDP): 사용자가 인증에 사용할 중앙 서비스
- 각 고객의 IDP는 데이터베이스로 간주할 수 있음. 사람들에 대한 데이터를 추적함
- 회사는 종종 ID 제공자를 사용하여 직원을 부서에 할당하고 다양한 권한을 부여함
- SAML을 통해 사용자를 로그인할 때마다 IDP에서 정보를 가져와야 함. SSO에서는 주로 IDP에 사용자 ID 확인을 요청
- IDP와 사전 구성된 신뢰 관계가 필요함
- SAML SSO를 사용하는 모든 고객은 애플리케이션에서 자체 설정이 필요
- 하지만, IDP와 직접 메시지를 주고받지는 않음. SAML SSO에서는 서비스 제공자와 ID 제공자가 사용자의 브라우저를 통해 통신함
SAML 엔터티 간 상호 작용 방식
- 일반적인 SAML SSO 프로세스:
- 사용자가 웹 브라우저에서 애플리케이션의 일부에 액세스하려고 함
- 사용자에게 유효한 보안 컨텍스트가 있는지 확인
- 사용자에게 유효한 보안 컨텍스트가 없으므로 로그인 페이지 표시
- 사용자가 일부 정보(예: 이메일 주소)를 입력하면 적절한 로그인 방법을 결정하는 데 사용됨
- 사용자를 IDP의 웹 주소로 리디렉션하고 사용자의 브라우저를 통해 SAML 메시지를 IDP에 전달
- IDP는 사용자에게 자격 증명을 묻는 메시지를 표시. 사용자가 성공적으로 인증됨
- IDP는 사용자의 인증에 대한 정보를 전달하는 SAML 메시지와 함께 사용자를 애플리케이션으로 다시 리디렉션함
- SAML 메시지를 처리하고 사용자에 대한 보안 컨텍스트를 설정해야 한다고 판단함
- 사용자에게 애플리케이션의 원하는 부분에 대한 액세스 권한을 부여함
- ID 공급자에서 SAML SSO 프로세스를 시작할 수도 있음
- 이 경우 인증 요청을 보내지 않고 인증 응답을 받게 됨
- SAML SSO 지원을 구현할 때 IDP에서 시작한 SSO에 대비해야 함
SAML에서 교환되는 메시지
- SAML SSO에서 주로 2가지 메시지가 관심사임
- 서비스 제공자에서 IDP로 가는 메시지를 SAML 요청(request)이라고 함
- IDP에서 서비스 제공자로 돌아오는 메시지를 SAML 응답(response)이라고 함
- SAML 요청은 실제로 그리 복잡하지 않음. XML을 HTTP 리디렉션을 통해 보내는 것으로 충분함
-
<AuthnRequest>
태그에 ID를 포함하여 IDP가 원래 요청과 연결된 <Response>
를 공유할 수 있도록 함
-
<Issuer>
태그로 감싼 데이터도 IDP에 보내서 누구인지 알려줌
- SAML 응답은 더 까다로움. 일반적으로 POST를 통해 전송됨
-
<Response>
는 개념적으로 몇 개의 <Assertion>
태그를 감쌈
-
<Assertion>
은 사용자에 대한 클레임(누구인지, IDP로 어떻게 인증했는지 등)을 감쌈
- Assertion을 처리하여 사용자를 로그인할지 여부를 결정함
주의사항
- 여기서는 많은 세부 사항, 특히 보안상 중요한 내용들을 생략했음
- SAML에 개인적으로 관심이 있거나 전문적으로 깊이 조사할 이유가 없다면 SAML 기반 로그인을 직접 구현하는 것은 권장하지 않음. 시간 낭비임
- SAML을 가능한 한 빨리 설정하고 싶다면 우리가 SAML을 추상화한 오픈소스 SSOReady 를 제공함. 시간과 고통을 많이 절약해 줄 것임