로그인(AuthnRequest) 프로세스 흐름
SAML 2.0은 웹 브라우저에서 IdP(ID 공급자), SP(서비스 공급자) 및 주체(사용자) 간에 정보를 교환하는 웹 브라우저 SSO 프로필을 지정합니다.
ID 공급자는 SAML 인증 서비스를 제공하는 모든 SSO 서비스(예: SSOCircle)일 수 있습니다. 서비스 제공자는 언제나 인스턴스입니다. 메시지 플로우는 서비스 제공자의 보안 자원에 대한 요청으로 시작됩니다.
SP에서 대상 자원 요청
보안 주체는 서비스 제공자에게 대상 자원을 요청합니다.
https://instance.service-now.com/
인스턴스는 요청을 검사하여 SAMLRequest 및 RelayState URL 매개변수가 있는지 확인합니다. 존재하는 경우 사용자는 이미 IdP로 유효성을 검사했으며 2-6단계를 건너뛸 수 있습니다.
ID 제공자에 대한 AuthnRequest 발급
인스턴스는 SAMLRequest 값을 사용하여 IdP에 보낼 AuthnRequest를 구성합니다. 또한 인스턴스는 RelayState URL 매개 변수 값을 생성하고 보냅니다.
RelayState 토큰은 서비스 공급자에서 유지 관리되는 상태 정보에 대한 불투명한 참조입니다. SAMLRequest 매개변수의 값은 <samlp:AuthnRequest> 요소의 수축 및 base64 인코딩 값입니다.<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="identifier_1" Version="2.0" IssueInstant="2004-12-05T09:21:59Z" AssertionConsumerServiceIndex="0"><saml:Issuer>https://sp.example.com/SAML2</saml:Issuer><samlp:NameIDPolicy AllowCreate="true" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/></samlp:AuthnRequest>그런 다음 통합은 <samlp:AuthnRequest> 요소를 URL로 인코딩하여 SAMLRequest URL 매개변수로 전송합니다.
SSO 서비스는 URL 디코딩, base64 디코딩 및 요청 팽창 순서대로 <samlp:AuthnRequest> 요소를 처리합니다. 그런 다음 보안 검사를 수행합니다. 사용자에게 유효한 보안 컨텍스트가 없는 경우 IdP는 로그인 자격 증명을 묻는 메시지를 표시하여 사용자를 식별합니다. 사용자가 이미 로그인한 경우 IdP는 SAMLResponse<tt> 및 <tt>RelayState URL 매개변수로 응답하기만 하면 됩니다(3단계 참조).
SAMLResponse 및 RelayState로 응답
<formmethod="post"action="https://instance.service-now.com/navpage.do" ...><input type="hidden" name="SAMLResponse" value="response ..." /><input type="hidden" name="RelayState" value="token ..." />
...
<input type="submit" value="Submit" /></form>RelayState 매개 변수의 값은 이 단계에서 가져옵니다. SAMLResponse 매개변수의 값은 다음 <samlp:Response> 요소의 base64 인코딩입니다.<samlp:Responsexmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="s2cdc74f37f923e26fe1aeec42b70a93d24230334f" InResponseTo="90AA6073F01567BFB0DF194F596314E2" Version="2.0" IssueInstant="2010-04-29T23:21:51Z" Destination="https://dloomac.service-now.com/navpage.do"><saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">http://idp.ssocircle.com</saml:Issuer><samlp:Status xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"><samlp:StatusCode xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" Value="urn:oasis:names:tc:SAML:2.0:status:Success"></samlp:StatusCode></samlp:Status><saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="s23e536bfc51b8487d4d3299dec162d9c2e338823b" IssueInstant="2010-04-29T23:21:51Z" Version="2.0"><saml:Issuer>http://idp.ssocircle.com</saml:Issuer><Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
...
</Signature><saml:Subject><saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" NameQualifier="http://idp.ssocircle.com" SPNameQualifier="https://dloomac.service-now.com/navpage.do">david.loo@service-now.com</saml:NameID><saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"><saml:SubjectConfirmationData InResponseTo="90AA6073F01567BFB0DF194F596314E2" NotOnOrAfter="2010-04-29T23:31:51Z" Recipient="https://dloomac.service-now.com/navpage.do" /></saml:SubjectConfirmation></saml:Subject><saml:Conditions NotBefore="2010-04-29T23:11:51Z" NotOnOrAfter="2010-04-29T23:31:51Z"><saml:AudienceRestriction><saml:Audience>https://dloomac.service-now.com</saml:Audience></saml:AudienceRestriction></saml:Conditions><saml:AuthnStatement AuthnInstant="2010-04-29T23:21:51Z" SessionIndex="s2dbf89ab99001e0e8cdaed67266d9d4b21b968a04"><saml:AuthnContext><saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef></saml:AuthnContext></saml:AuthnStatement></saml:Assertion></samlp:Response>SAMLResponse 확인
SAMLResponse 값은 base64로 디코딩되고 팽창되어 3단계에서 XML 문서를 표시합니다. 로그인 스크립트는 //Subject/NameID 요소에서 XML 값을 추출하고 이를 사용하여 사용자 테이블에서 기존 사용자를 조회합니다.
또한 로그인 스크립트는 //AuthnStatement/@SessionIndex 요소에서 세션 ID를 추출하여 LogoutRequest에 저장합니다.