SAML(Security Assertion Markup Language)은 XML 기반의 개방형 표준으로, 신원 공급자(IdP)와 서비스 공급자(SP) 간에 인증·인가 데이터를 교환하는 프로토콜이다. 주로 기업 환경 SSO(Single Sign-On)에 활용된다.
SAML 구성 요소
| 구성요소 | 역할 | 예시 |
|---|
| IdP (Identity Provider) | 사용자 인증 수행 | Okta, ADFS, Azure AD |
| SP (Service Provider) | 서비스 제공, IdP에 인증 위임 | Salesforce, GitHub Enterprise |
| Assertion | 인증/인가/속성 정보를 담은 XML | XML 서명된 토큰 |
| Binding | 메시지 전달 방식 | HTTP Redirect, HTTP POST |
SAML SSO 흐름 (SP-initiated)
1. 사용자 → SP 접근
2. SP → SAML AuthnRequest 생성 → IdP로 리다이렉트
3. IdP → 사용자 인증 (로그인 화면)
4. IdP → SAML Assertion(XML) 생성 → SP로 POST
5. SP → Assertion 서명 검증 → 세션 생성
6. 사용자 → SP 서비스 이용
AuthnRequest 예시:
<samlp:AuthnRequest
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
ID="_abc123"
Version="2.0"
IssueInstant="2024-01-01T00:00:00Z"
Destination="https://idp.example.com/sso"
AssertionConsumerServiceURL="https://sp.example.com/acs">
<saml:Issuer>https://sp.example.com</saml:Issuer>
</samlp:AuthnRequest>
SAML Assertion 구조
xml
<saml:Assertion>
<saml:Issuer>https://idp.example.com</saml:Issuer>
<!-- XML 디지털 서명 (RSA-SHA256) -->
<ds:Signature>...</ds:Signature>
<saml:Subject>
<saml:NameID Format="emailAddress">user@example.com</saml:NameID>
</saml:Subject>
<saml:Conditions
NotBefore="2024-01-01T00:00:00Z"
NotOnOrAfter="2024-01-01T01:00:00Z">
<saml:AudienceRestriction>
<saml:Audience>https://sp.example.com</saml:Audience>
</saml:AudienceRestriction>
</saml:Conditions>
<saml:AttributeStatement>
<saml:Attribute Name="email">
<saml:AttributeValue>user@example.com</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
</saml:Assertion>
SAML vs OAuth2/OIDC 비교
| 항목 | SAML | OAuth2/OIDC |
|---|
| 형식 | XML | JSON/JWT |
| 주 용도 | 엔터프라이즈 SSO | 모바일/API |
| 표준 연도 | 2002 | 2012 |
| 모바일 지원 | 제한적 | 우수 |
| 복잡도 | 높음 | 낮음 |
보안 고려사항
- XML Signature Wrapping(XSW) 공격 방어: Assertion ID 검증 필수
- Replay Attack 방어: NotOnOrAfter, InResponseTo 필드 검증
- Man-in-the-Middle: HTTPS 필수, 인증서 핀닝 고려
- 서명 알고리즘: SHA-1 → SHA-256 이상으로 업그레이드
관련 문서
- •[openid-connect|[OpenID Connect (OIDC)]]
- •[[certificate-pinning|인증서 피닝]]
- •[[webauthn|WebAuthn / FIDO2]]