SAML Response 생성

"그림 5 NAVER WORKS와 고객사 간 SAML 2.0 기반 SSO"의 5~6 단계에 해당하는 로직을 구현한다. 고객사 SSO 시스템에서 고객사 인증 및 SSO에 필요한 처리를 한 후, SAML Response를 생성하여 NAVER WORKS 인증 시스템의 ACS URL로 redirect한다.

Request URL {#saml-request-url}

URL은 NAVER WORKS 인증 시스템에서 로그인 페이지 요청 시 SAML Request의 'AssertionConsumerServiceURL' 값이다.

예) https://NAVERWORKS인증시스템URL/acs/mycompany.com

주의

  • ACS URL은 사용자 환경 및 NAVER WORKS 정책에 따라 언제든지 바뀔 수 있는 값이므로, 반드시 SAML Request의 'AssertionConsumerServiceURL'을 사용해야 한다.

HTTP Method {#saml-request-method}

POST

SAML Request에서 ProtocolBinding을 HTTP-POST로 지정하므로, 반드시 POST를 사용해야 한다.

Request {#saml-request-parameter}

파라미터타입필수 여부설명
SAMLResponseStringYSAML 2.0 Response 명세에 따른 문자열(Base64로 인코딩한 값)
RelayStateStringYNAVER WORKS 인증 시스템에서 로그인 페이지 요청 시 전달했던 RelayState값

SAML Response 명세 {#saml-request-response-body}

<?xml version="1.0" encoding="UTF-8"?><saml2p:Responsexmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" ID="{고객사 SSO 시스템에서 발행하는 ID}"InResponseTo="{SAML Request에 포함된 ID}" IssueInstant="{SAML Response 생성 일시}" Version="2.0"><Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\">          {디지털 서명}</Signature><saml2p:Status><saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" /></saml2p:Status><saml2:Assertionxmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="{고객사 SSO 시스템에서 발행하는 ID}" IssueInstant="{SAML Response 생성 일시}" Version="2.0"><saml2:Subject>      <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">{로그인한 사용자의 User Key}</saml2:NameID>      <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">        <saml2:SubjectConfirmationData InResponseTo="{SAML Request에 포함된 ID}" NotOnOrAfter="{SAML Response 종료 일시}" Recipient="{ACS URL}" />      </saml2:SubjectConfirmation>    </saml2:Subject>    <saml2:Conditions NotBefore="{SAML Response 시작 일시}" NotOnOrAfter="{SAML Response 종료 일시}">      <saml2:AudienceRestriction>        <saml2:Audience>{ACS URL}</saml2:Audience>      </saml2:AudienceRestriction>    </saml2:Conditions>    <saml2:AuthnStatement AuthnInstant="{SAML Response 생성 일시}" SessionIndex="{고객사 SSO 시스템에서 발행하는 ID}"SessionNotOnOrAfter="{NAVER WORKS 세션 만료 일시}"></saml2:AuthnStatement>  </saml2:Assertion></saml2p:Response>

SAML Response의 각 항목은 다음과 같다.

항목타입필수 여부설명
Response IDStringY고객사 SSO 시스템에서 발행하는 ID
Response InresponseToStringYSAML Request에 포함된 ID
Response IssueInstantDate(UTC)YSAML Response 생성 일시
SignatureStringY전자 서명
Assertion IDStringN고객사 SSO 시스템에서 발행하는 ID
Assertion IssueInstantDate(UTC)NSAML Response 생성 일시
Subject NameIDStringY로그인한 사용자의 User Key (External Key or WORKS Account)
SubjectConfirmationData InResponseToStringYSAML Request에 포함된 ID
SubjectConfirmationData NotOnOrAfterDate(UTC)YSAML Response 시작 일시
SubjectConfirmationData RecipientStringYACS URL
Conditions NotBeforeDate(UTC)YSAML Response 시작 일시
Conditions NotOnOrAfterDate(UTC)YSAML Response 종료 일시
AudienceStringYACS URL
AuthnStatement AuthnInstantDate(UTC)YSAML Response 생성 일시
AuthnStatement SessionIndexStringY고객사 SSO 시스템에서 발행하는 ID
AuthnStatement SessionNotOnOrAfterDate(UTC)NNAVER WORKS의 세션 만료 일시.
단, NAVER WORKS 정책에 따라 자동 연장될 수 있다.

참고

  • NAVER WORKS의 세션은 SessionNotOnOrAfter에 만료된다. 단, NAVER WORKS 정책에 따라 사용 시 자동 연장될 수 있다.
  • 사용자의 Device 환경에 따라 SessionNotOnOrAfter를 다르게 제어하도록 구현할 수 있다.
  • SessionNotOnOrAfter을 설정하지 않았다면 기본 로그인 시간은 24시간(웹 브라우저), 30일(모바일앱, PC앱)로 설정된다.
    *공공은 1시간(웹 브라우저), 24시간(모바일앱), 30일(PC앱)로 설정

SAML Response Example {#saml-request-response-body-example}

<?xml version="1.0" encoding="UTF-8"?><saml2p:Response	xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" 	ID="aidalcbpncbpebcnglhhgkkbojkgbplhhhlecbjb" InResponseTo="gbggljimijodibeomaehmnmjniogjebpjckecbdg" IssueInstant="2018-02-14T10:39:05.956Z" Version="2.0">    <Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\">        ……    </Signature>    <saml2p:Status>        <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />    </saml2p:Status>    <saml2:Assertion        xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="pbfijmklioghpbickikmeanhemnmijnmchhibenb" IssueInstant="2018-02-14T10:39:05.956Z" Version="2.0">        <saml2:Subject>            <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">admin@company.com</saml2:NameID>            <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">                <saml2:SubjectConfirmationData InResponseTo="gbggljimijodibeomaehmnmjniogjebpjckecbdg" NotOnOrAfter="2018-02-14T10:44:05.956Z" Recipient="https://auth.worksmobile.com/acs/compay.com" />            </saml2:SubjectConfirmation>        </saml2:Subject>        <saml2:Conditions NotBefore="2018-02-14T10:39:05.956Z" NotOnOrAfter="2018-02-14T10:44:05.956Z">            <saml2:AudienceRestriction>                <saml2:Audience>https://auth.worksmobile.com/acs/company.com</saml2:Audience>            </saml2:AudienceRestriction>        </saml2:Conditions>        <saml2:AuthnStatement AuthnInstant="2018-02-14T10:39:05.956Z" SessionIndex="lepcacjgfnpciekmhhjbeljadfapemdoncmhlkol" SessionNotOnOrAfter="2018-02-15T10:39:05.956Z">        </saml2:AuthnStatement>    </saml2:Assertion></saml2p:Response>

SAML Response 검증 후 오류 코드 {#saml-request-response-error-code}

NAVER WORKS에서 SAML Response 검증 후 발생 가능한 오류 코드는 다음과 같다.

코드메시지설명
510Invalid SAMLResponse.SAMLResponse XML이 올바르지 않음
511Signature validation Failed.서명이 잘못됨
512SAMLResponse decoding failed.Base64 인코딩 안 됨
513SAMLResponse inflate failed.SAMLResponse 압축 해제 오류
514Signature is missing.서명이 없음
515Invalid SAMLResponse. (StatusCode is not Success)SAMLResponse가 올바르지 않음(statusCode 오류)
520Invalid NameID. (520)NamedId가 올바르지 않음
530Works login Failed. (530)로그인 실패
531Invalid User. (531)NAVER WORKS 사용자가 아닌 NamedId(userKey)
532No authority to use.로그인 제한 사용자
534Invalid IDC.로그인한 IDC가 올바르지 않음
535Invalid Acs Url.ACS URL이 올바르지 않음
536Certification time is incorrect.인증 가능한 시간이 아님
537Invalid tenant.SSO를 사용하지 않는 고객사
551Error in IDP API.고객사의 Login API에서 오류 발생
552SAMLResponse or RelayState is not exist.고객사의 Login API에서 필수 데이터 누락
561Unexpected Error. (561)알 수 없는 오류
594Login Fail. (594)로그인 실패
595Invalid Access. (595)잘못된 접근
596Invalid Access. (596)잘못된 접근
598Login Fail. (598)인증서 조회 실패
599Login Fail. (599)알 수 없는 오류