"이 사용자는 인증됐습니다"라는 인증서, SAML Assertion
앞선 글에서 우리는 IdP가 사용자의 로그인에 성공하면, SP에게 **SAML Assertion**이라는 걸 전달한다는 걸 배웠습니다. 이 Assertion은 마치 "이 사람은 누구다"라는 사실을 증명하는 디지털 신분증 같은 역할을 하죠.
그럼 그 안에는 어떤 정보가 들어있고, 어떻게 위조되지 않도록 보호되는 걸까요?
SAML Assertion의 구성요소
SAML Assertion은 XML 기반 문서입니다. 아주 단순하게 요약하면 다음과 같은 구조로 되어 있습니다:
이 안에는 다음과 같은 중요한 정보들이 들어 있습니다:
| Issuer | Assertion을 발급한 IdP |
| NameID | 사용자의 고유 식별자 (보통 이메일) |
| Conditions | 유효 시간 등 제한 조건 |
| Attribute | 사용자 속성 (부서, 직급, 권한 등) |
| Signature | 디지털 서명 (위조 방지) |
디지털 서명: 누가 이걸 보증하나요?
이 Assertion에서 가장 중요한 건 바로 **서명(Signature)**입니다. Assertion은 **IdP의 개인키(private key)**로 서명되며, SP는 **사전에 등록한 IdP의 공개키(public key)**로 검증합니다.
즉, SP는 "이 Assertion이 진짜 IdP가 발행한 것인지"를 서명을 통해 확인하는 겁니다.
이를 통해 아래와 같은 보안이 보장됩니다:
- 위조 방지: 누가 중간에서 내용을 바꿔도 서명 검증에 실패
- 발행자 확인: Issuer와 공개키가 매칭되는지 확인 가능
- 무결성 검증: 중간에 수정되었는지 여부 파악 가능
시간 조건(Conditions)으로 재사용/도난 방지
SAML Assertion에는 반드시 유효 시간 조건이 포함됩니다:
즉, 이 Assertion은 특정 시점에만 사용 가능하고, 몇 분이 지나면 무효 처리됩니다. 이는 **재사용 공격(replay attack)**을 막는 중요한 장치입니다. 예를 들어 누군가 이전 Assertion을 가로챘다고 해도, 유효 시간이 지나면 쓸 수 없습니다.
Assertion은 어떻게 전달될까?
Assertion은 브라우저를 통해 SP로 전달됩니다. 대표적인 방식 두 가지:
- HTTP Redirect
- Assertion이 URL에 base64 인코딩되어 전달됨
- 보안 부담이 있음 (짧고 단순한 인증 흐름에 적합)
- HTTP POST
- 브라우저가 자동으로 POST 폼을 전송함
- 대부분의 보안 환경에서는 이 방식을 사용
브라우저는 사용자가 보지 못할 만큼 빠르게 이 Assertion을 SP로 옮겨줍니다. SP는 이 Assertion을 받아 검증하고, 로그인 세션을 생성합니다.
Assertion이 위조되면 어떤 일이?
Assertion이 만약 공격자에 의해 위조되었다면?
- 이름(NameID)을 admin으로 바꿨다거나,
- 유효 시간을 길게 늘렸다거나,
- 권한 속성(Attribute)을 조작했다면?
그러면 SP는 이를 검증할 때 서명이 맞지 않아서 거부합니다.
SP는 반드시 Assertion 전체 구조를 검증 절차를 통해 확인합니다:
- XML 구조의 유효성 검사
- 서명 검증 (공개키로)
- 시간 조건 검사
- 발급자 정보 일치 확인
지금까지 흐름 정리
지금까지 우리는 다음 단계를 모두 살펴봤습니다:
- 사용자가 로그인
- IdP가 인증 성공
- IdP가 SAML Assertion 생성
- 브라우저가 SP로 전달
- SP가 Assertion을 검증
- 로그인 성공!
다음 편 예고: 자동 로그인과 세션의 비밀
다음 6편에서는 이렇게 인증된 사용자가 다른 서비스로 이동해도 자동 로그인되는 구조를 따라가 봅니다. 또한 세션 쿠키, 토큰 유지, 싱글 로그아웃(SLO) 같은 개념도 다루게 될 거예요.
'호주 IT 취업' 카테고리의 다른 글
| [SSO 로그인 흐름 6편] 한 번 로그인했는데 왜 다 되는 거야? – 자동 로그인과 세션의 비밀 (0) | 2025.06.20 |
|---|---|
| 호주 이직 전 반드시 확인: PayCalculator로 실수령액 계산하는 법 (6) | 2025.06.19 |
| [SSO 로그인 흐름 4편] "아이디 입력했어요!" 그 다음엔? – SAML 인증 흐름 따라가기 (1) | 2025.06.18 |
| [SSO 로그인 흐름 3편] 서버와의 첫 만남 – 안전한 연결을 위한 ‘악수’ 과정 (TCP + HTTPS) (1) | 2025.06.17 |
| [SSO 로그인 흐름 2편] 로그인 버튼을 누르면 무슨 일이? – DNS와 캐시의 여정 (0) | 2025.06.16 |