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 에 담겨있다. 이것을 디코딩해서 사용자를 식별하면 된다.

+ Recent posts