0. SAML 2.0 이란?
Security Assertion Markup Language 의 2.0 버전이라는 의미로, 인증/인가 프로토콜 중 하나이다.
https://jinn-o.tistory.com/320
[SAML 2.0] Security Assertion Markup Language
SAML 2.0 이란?OAuth 2.0 과 마찬가지로 인증/인가와 관련된 규칙들을 묶어서 표준화한 방식이다.다만 이상한 점이 있다. MarkUp Language 라고 정의되어 있다. 먼저, OAuth 2.0 은 주로 인가(Authorization)와 관
jinn-o.tistory.com
1. IdP? SP?
IdP 는 Indentity Provider 라는 의미로, SSO 인증서버를 의미한다.
SP 는 Service Provider 라는 의미로, 해당 SSO 인증서버를 사용하는 서비스 애플리케이션을 의미한다.
2. SP-Initiated SSO 방식?
SAML 인증 프로토콜에서 일반적으로 사용하는 방식이다. 보통 SAML 방식을 사용해서 인증한다. 라고하면 죄다 이 방식을 의미하는 것이다.
작동 방식은 다음과 같다.
① SP 가 IdP 에게 SAML Request (XML 파일)를 보낸다. 이때, RelayState 에 redirect_uri 를 첨가하여 보낸다.
② IdP 는 인증을 처리한 이후에, RelayState 에 redirect_uri 를 전달받았던 그대로 넣어서 SAML Response (XML 파일)를 SP 에게 보낸다.
③ 브라우저는 전달받은 redirect_uri 로 인증 완료 화면으로 리다이렉트한다.
SP -> IdP: SAML Request 전송
GET https://keycloak.example.com/auth/realms/{realm}/protocol/saml
?SAMLRequest=base64_encoded_saml_request
&RelayState=https://app.example.com/dashboard
이때, SAMLRequest 는 metadata.xml 파일을 base64 로 인코딩한 값이다.
RelayState 에 인증 성공 후 redirect 할 url 을 첨부하여 보낸다.
IdP -> SP: SAML Response 전송
<form method="POST" action="https://app.example.com/saml/acs">
<input type="hidden" name="SAMLResponse" value="base64_encoded_saml_response">
<input type="hidden" name="RelayState" value="https://app.example.com/dashboard">
</form>
IdP 에서 사용자를 인증하고, 인증에 성공했다면 SP 의 ACS URL 로 SAML Response 를 HTTP POST 에 담아서 전송한다. 이때 <form> 태그가 응답(Response Body) 자체에 포함되어 브라우저가 자동으로 실행되도록 설정된다.
즉, 브라우저가 IdP(Keycloak)에서 SP로 리디렉트될 때, 응답 자체가 form 태그로 구성되어 있으며, 자동으로 제출되도록 처리된다.
SP 가 SAML Response 를 검증하고, 사용자를 RelayState의 redirect_uri로 리다이렉트한다.
HTTP 302 Found
Location: https://app.example.com/dashboard
3. IdP-Initiated SSO 방식?
보통은 이 방식을 사용하지 않고, SP-Initiated SSO 방식을 사용해서 SAML 인증 방식을 구현한다.
그렇다면 이 방식은 어떤 것이며, 언제 쓰이는가?
보통은 SP가 먼저 SAML Request 를 보내야 비로소 IdP가 그에 대한 SAML Response 를 보내는 것이 맞다.
그러나 이 방식은 SP 없이, IdP 자체에서 SAML 인증을 처리해보는 방식이다.
따라서 특수한 상황이나, 테스트용으로 자주 사용된다.
사용자가 Keycloak(IdP)에서 직접 로그인 요청을 보냄.
GET https://keycloak.example.com/auth/realms/{realm}/protocol/saml/idp-initiated/my-sp
IdP(Keycloak)가 SP의 ACS URL로 SAMLResponse 전송
<form method="POST" action="https://app.example.com/saml/acs">
<input type="hidden" name="SAMLResponse" value="base64_encoded_saml_response">
<input type="hidden" name="RelayState" value="https://app.example.com/dashboard">
</form>
SP가 SAMLResponse를 검증하고, 사용자를 RelayState 값에 설정된 페이지로 리디렉션
HTTP 302 Found
Location: https://app.example.com/dashboard
4. 결론
📌 즉, SP-Initiated SSO에서는 SP가 먼저 SAMLRequest를 보내고,
IdP가 SAMLResponse를 보내며, 최종적으로 브라우저가 redirect_uri로 이동하는 방식!
📌 즉, IdP-Initiated SSO에서는 SP가 먼저 요청을 보내지 않고,
Keycloak(IdP)이 SAMLResponse를 생성해서 SP로 전송하는 방식!
두 방식 모두, 사용자에 대한 정보는 Base64 로 인코딩된 SAML Request 혹은 SAML Response 에 담겨있다. 이것을 디코딩해서 사용자를 식별하면 된다.
'Framework > Spring' 카테고리의 다른 글
[SAML 2.0] IdP 와 SP 인증을 직접 구현해보자. (3) - SP 설정 : React편 (0) | 2025.01.30 |
---|---|
[Spring MVC] WebMvcConfigurer로 cross-origin 설정을 해도 cors 오류가 나는 이유 (304 응답에서) (0) | 2025.01.30 |
[Servlet] ServletRegistrationBean : Spring 이 Servlet 을 다루는 방법 (0) | 2025.01.07 |
[Spring Security] SecurityContextHolder, 인증 정보 저장 객체 (0) | 2024.12.30 |
[SAML 2.0] IdP 와 SP 인증을 직접 구현해보자. (2) - SP 설정 : SpringBoot 편 (4) | 2024.12.20 |