"그림 5 NAVER WORKS와 고객사 간 SAML 2.0 기반 SSO"의 5~6 단계에 해당하는 로직을 구현한다. 고객사 SSO 시스템에서 고객사 인증 및 SSO에 필요한 처리를 한 후, SAML Response를 생성하여 NAVER WORKS 인증 시스템의 ACS URL로 redirect한다.
URL은 NAVER WORKS 인증 시스템에서 로그인 페이지 요청 시 SAML Request의 'AssertionConsumerServiceURL' 값이다.
예) https://NAVERWORKS인증시스템URL/acs/mycompany.com
주의
- ACS URL은 사용자 환경 및 NAVER WORKS 정책에 따라 언제든지 바뀔 수 있는 값이므로, 반드시 SAML Request의 'AssertionConsumerServiceURL'을 사용해야 한다.
POST
SAML Request에서 ProtocolBinding을 HTTP-POST로 지정하므로, 반드시 POST를 사용해야 한다.
| 파라미터 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| SAMLResponse | String | Y | SAML 2.0 Response 명세에 따른 문자열(Base64로 인코딩한 값) |
| RelayState | String | Y | NAVER WORKS 인증 시스템에서 로그인 페이지 요청 시 전달했던 RelayState값 |
<?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 ID | String | Y | 고객사 SSO 시스템에서 발행하는 ID |
| Response InresponseTo | String | Y | SAML Request에 포함된 ID |
| Response IssueInstant | Date(UTC) | Y | SAML Response 생성 일시 |
| Signature | String | Y | 전자 서명 |
| Assertion ID | String | N | 고객사 SSO 시스템에서 발행하는 ID |
| Assertion IssueInstant | Date(UTC) | N | SAML Response 생성 일시 |
| Subject NameID | String | Y | 로그인한 사용자의 User Key (External Key or WORKS Account) |
| SubjectConfirmationData InResponseTo | String | Y | SAML Request에 포함된 ID |
| SubjectConfirmationData NotOnOrAfter | Date(UTC) | Y | SAML Response 시작 일시 |
| SubjectConfirmationData Recipient | String | Y | ACS URL |
| Conditions NotBefore | Date(UTC) | Y | SAML Response 시작 일시 |
| Conditions NotOnOrAfter | Date(UTC) | Y | SAML Response 종료 일시 |
| Audience | String | Y | ACS URL |
| AuthnStatement AuthnInstant | Date(UTC) | Y | SAML Response 생성 일시 |
| AuthnStatement SessionIndex | String | Y | 고객사 SSO 시스템에서 발행하는 ID |
| AuthnStatement SessionNotOnOrAfter | Date(UTC) | N | NAVER WORKS의 세션 만료 일시. 단, NAVER WORKS 정책에 따라 자동 연장될 수 있다. |
참고
- NAVER WORKS의 세션은 SessionNotOnOrAfter에 만료된다. 단, NAVER WORKS 정책에 따라 사용 시 자동 연장될 수 있다.
- 사용자의 Device 환경에 따라 SessionNotOnOrAfter를 다르게 제어하도록 구현할 수 있다.
- SessionNotOnOrAfter을 설정하지 않았다면 기본 로그인 시간은 24시간(웹 브라우저), 30일(모바일앱, PC앱)로 설정된다.
*공공은 1시간(웹 브라우저), 24시간(모바일앱), 30일(PC앱)로 설정
<?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>NAVER WORKS에서 SAML Response 검증 후 발생 가능한 오류 코드는 다음과 같다.
| 코드 | 메시지 | 설명 |
|---|---|---|
| 510 | Invalid SAMLResponse. | SAMLResponse XML이 올바르지 않음 |
| 511 | Signature validation Failed. | 서명이 잘못됨 |
| 512 | SAMLResponse decoding failed. | Base64 인코딩 안 됨 |
| 513 | SAMLResponse inflate failed. | SAMLResponse 압축 해제 오류 |
| 514 | Signature is missing. | 서명이 없음 |
| 515 | Invalid SAMLResponse. (StatusCode is not Success) | SAMLResponse가 올바르지 않음(statusCode 오류) |
| 520 | Invalid NameID. (520) | NamedId가 올바르지 않음 |
| 530 | Works login Failed. (530) | 로그인 실패 |
| 531 | Invalid User. (531) | NAVER WORKS 사용자가 아닌 NamedId(userKey) |
| 532 | No authority to use. | 로그인 제한 사용자 |
| 534 | Invalid IDC. | 로그인한 IDC가 올바르지 않음 |
| 535 | Invalid Acs Url. | ACS URL이 올바르지 않음 |
| 536 | Certification time is incorrect. | 인증 가능한 시간이 아님 |
| 537 | Invalid tenant. | SSO를 사용하지 않는 고객사 |
| 551 | Error in IDP API. | 고객사의 Login API에서 오류 발생 |
| 552 | SAMLResponse or RelayState is not exist. | 고객사의 Login API에서 필수 데이터 누락 |
| 561 | Unexpected Error. (561) | 알 수 없는 오류 |
| 594 | Login Fail. (594) | 로그인 실패 |
| 595 | Invalid Access. (595) | 잘못된 접근 |
| 596 | Invalid Access. (596) | 잘못된 접근 |
| 598 | Login Fail. (598) | 인증서 조회 실패 |
| 599 | Login Fail. (599) | 알 수 없는 오류 |