로그인(AuthnRequest) 프로세스 흐름

  • 릴리스 버전: Yokohama
  • 업데이트 날짜 2025년 01월 30일
  • 읽기7분
  • 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를 구성합니다. 또한 인스턴스는 릴레이 상태 URL 매개변수 값을 생성하고 전송합니다.

    릴레이 상태 토큰은 서비스 제공자가 유지 관리하는 상태 정보에 대한 불투명 참조입니다. 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>릴레이 상태 URL 매개변수로 응답합니다(3단계 참조).

    SAMLResponse 및 릴레이 상태로 응답

    필요한 로그인 자격 증명을 수집한 후 SSO 서비스는 요청의 유효성을 검사하고 XHTML 양식이 포함된 문서로 응답합니다.
    <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>
    릴레이 상태 매개변수의 값은 이 단계에서 가져옵니다. 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에 저장합니다.