OpenID Connect SSO 개요
OpenID Connect(OIDC)는 주요 기술 회사에서 채택한 OAuth 2.0 기반 인증 프로토콜입니다.
기본 SSO
선택한 기능에 관계없이 기본 SSO의 설정 요구 사항은 동일합니다. 로열티 또는 신용카드 구현을 추가하려면 추가 정보가 필요합니다.
설정 요구 사항
템플릿 사이트에 대한 OIDC SSO 액세스를 올바르게 설정하려면 다음과 같이 몇 가지 사항이 필요합니다.
- API(인증, 토큰, userProfile, JWKS)
- ClientId
- 클라이언트 암호
- ResponseMode
- isNonceEnabled
- customerDetailsAPIKey(사용 가능한 경우)
인증 흐름

엔드포인트 승인
GET /authorize 엔드포인트는 인증 및 승인에 사용됩니다. 사용자가 로그인하면 인증 부여 또는 인증 코드를 반환합니다. 이는 사용자를 다른 사이트로 리디렉션하여 인증을 위해 로그인 정보를 입력하도록 유도하는 브라우저 리디렉션입니다.
요청 매개변수
| 매개변수 | 설명 | 데이터 유형 | 샘플 값 | 필수 여부 |
|---|---|---|---|---|
client_id | 클라이언트를 식별합니다. IDP(ID 공급자)에 사전 등록된 값과 일치해야 합니다. 수동 클라이언트 등록 중에 또는 동적 클라이언트 등록 API를 통해 얻습니다. | String | 예 | |
nonce | 재전송 공격을 완화하는 데 사용됩니다. 이 값은 ID 토큰으로 반환됩니다. | String | 예 | |
prompt | 검증에 필요한 상호 작용 유형입니다. "비어 있는" 경우, 사용자가 아직 인증되지 않았다면 로그인해야 합니다. "none"인 경우, IDP는 로그인 요청을 하지 않으며, 로그인된 상태라면 인증 코드를 반환하고, 그렇지 않은 경우 오류를 반환합니다. | String | 유효한 값: 없음 또는 비어 있음 | — |
redirect_uri | 인증 코드 또는 토큰을 전송해야 하는 콜백 위치입니다. 클라이언트 등록 시 IDP에 사전 등록된 값과 일치해야 합니다. | String | 예 | |
response_type | code(IDP) 값입니다. | String | 예 | |
response_mode | 승인 응답이 반환되는 방법입니다. | String | 유효한 값: query | — |
scope | 프로필 세부 정보를 가져오는 데 사용되는 액세스 토큰입니다. 인증 요청에 필요합니다. | String | OpenID, profile, email | 예 |
state | 상호 작용의 상태입니다. 이 값은 토큰으로 반환되며, 사용자는 이를 통해 클릭하고 인증을 받고, 원래 관심을 가졌던 페이지로 돌아갈 수 있습니다. 값에는 영숫자, 쉼표, 마침표, 밑줄, 하이픈 문자가 포함될 수 있습니다. | String | 예 | |
ui_locales | 사용자가 사용자 인터페이스에 대해 선호하는 언어 및 문자 체계. | String | en_CA, fr_CA | — |
audience | 수신 예정자. | String | 파트너들이 정의한 바에 따르면 | — |
응답 매개변수
| 매개변 수 | 설명 | 데이터 유형 | 필수 여부 |
|---|---|---|---|
code | 클라이언트를 식별하는 인증 코드입니다. IDP에 사전 등록된 값과 일치해야 합니다. 수동 클라이언트 등록 중에 또는 동적 클라이언트 등록 API를 통해 얻습니다. | String | 예 |
state | 상호 작용의 상태입니다. 이 값은 토큰으로 반환되며, 사용자는 이를 통해 클릭하고 인증을 받고, 원래 관심을 가졌던 페이지로 돌아갈 수 있습니다. 값에는 영숫자, 쉼표, 마침표, 밑줄, 하이픈 문자가 포함될 수 있습니다. | String | 예 |
승인 URL 예시
https://example.com/authorize?client_id={clientID}&response_type=code&state=d6b93799-404b-4205-9bb3-c579b1180428&scope=openid email profile&nounce=234567687867&redirect_uri=https://{ExpediaDomain}/sso/auth예시 콜백 URL
https://{ExpediaDomain}/sso/auth?code=12345678&state=d6b93799-404b-4205-9bb3-c579b1180428토큰 엔드포인트
POST /token엔드포인트는 인증 그랜트 또는 코드를 제시하여 액세스 토큰과 ID 토큰을 획득하는 데 사용되는 백엔드 API 호출입니다.
요청 매개변수
| 매개변수 | 설명 | 데이터 유형 | 필수 여부 |
|---|---|---|---|
grant_type | IDP가 토큰 생성을 승인하는 데 사용하는 메커니즘입니다. 값: authorization_code | String | 예 |
redirect_uri | 승인이 전송된 콜백 위치를 지정합니다. 이 값은 원래 authorization_code 생성에 사용되는 redirect_uri와 일치해야 하며, 그렇지 않으면 토큰 엔드포인트가 실패합니다. | String | 예 |
code | /authorize 호출 응답에서 받은 클라이언트 식별 코드입니다. | String | 예 |
요청 헤더
| 필드 | 설명 | 데이터 유형 | 샘플 값 | 필수 여부 |
|---|---|---|---|---|
accept | "application/json"이어야 합니다. | String | application/json | 예 |
authorization | 클라이언트 ID와 암호를 Base64로 인코딩합니다. HTTP 승인 헤더에 인코딩된 정보를 사용합니다. | String | Basic<Base64로 인코딩된 클라이언트 ID 및 암호> | 예 |
Content-Type | "application/x-www-form-urlencoded"여야 합니다. | String | application/x-www-form-urlencoded | 예 |
응답 매개변수
| 필드 | 설명 | 데이터 유형 |
|---|---|---|
access_token | 액세스 토큰 | String |
token_type | 토큰의 대상 | String |
expires_in | 액세스 토큰의 만료 시간(초) | Integer |
scope | 액세스 토큰에 포함된 범위 | String |
id_token | OpenID 범위가 부여된 경우 반환되는 식별자 | String |
ID_token
ID_token은 클레임이라는 인증 정보가 포함된 JSON 웹 토큰(JWT)입니다. Expedia 템플릿 솔루션은 아래 표와 같이 header, payload, signature 클레임을 사용합니다.
헤더 클레임
| 필드 | 설명 | 데이터 유형 | 필수 여부 |
|---|---|---|---|
alg | 사용된 디지털 서명 알고 리즘 식별(항상 RS256) | String | — |
kid | 키 ID: ID 토큰을 확인하는 데 사용되는 공개 키 식별. 해당 공개 키는 JSON 웹 키 세트(JWKS)를 통해 찾을 수 있습니다. | String | 예 |
페이로드 클레임
| 필드 | 설명 | 데이터 유형 | 필수 여부 |
|---|---|---|---|
amr | 인증 방법에 대한 식별자인 JSON 문자열 배열 | Array | — |
aud | 이 ID 토큰이 의도한 대상 식별(애플리케이션의 OAuth 2.0 클라이언트 ID 중 하나) | String | 예 |
auth_time | 최종 사용자가 인증된 시간, Unix 시간(초)으로 표현됨 | Integer | — |
exp | ID 토큰이 만료되는 시간, Unix 시간(초)으로 표현됨 | Integer | 예 |
iat | ID 토큰이 발행된 시간, Unix 시간(초)으로 표현됨 | Integer | — |
idp | ID 공급자의 지표 | String | 예 |
iss | 이 ID 토큰을 발행한 승인 서버의 URL | String | — |
jti | 디버깅 및 해지 목적을 위한 이 ID 토큰에 대한 고유 식별자 | String | 예 |
sub | 승인 호출의 주체(사용자)에 대한 고유 식별자 | String | — |
ver | ID 토큰의 의미 체계 버전 | Integer | 예 |
서명 클레임
서명 검증: 해당 JWKS endpoint 및 알고리즘에 해당하는 키( client_id 를 통해 검색됨)를 사용하여 서명을 검증합니다.
토큰 예시 CURL
curl --location 'https://example.com/token’ \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic {encoded ClientID:clientSecret}' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'redirect_uri=https://{ExpediaDomain}/sso/auth’ \
--data-urlencode 'code={Authorization code after login as part of callback to Expedia /sso/auth endpoint}'토큰 응답 예시
{
"access_token": "eyJhbGciOi.JSUzI1NiIsImtpZCI6Ilk1MkFDVXd3QV9SUzI1NiIsInBp.LmF0bSI6ImlrY20ifQ",
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6.IllEQnJQdlllYlRwa1laODZoaGk1MkFDVX.d3QV9SUzI1NiJ9",
"token_type": "Bearer",
"expires_in": 1799
}사용자 정보 엔드포인트
GET /userinfo엔드포인트는 제공된 액세스 토큰을 기반으로 인증된 사용자에 대한 클레임을 반환하는 백엔드 API 호출입니다. 이 함수는 사용자 프로필 데이터를 반환하며, 이 데이터는 사이트의 계정 헤더에 고객 이름을 표시하는 데 사용됩니다. 이를 통해 프로그램 계정을 경유하여 로열티 등급 정보를 불러올 수 있습니다.
참고: 응답에 필수 매개변수가 포함되지 않으면 사이트의 고객 경험에 문제가 발생할 수 있습니다. 예를 들어, 템플릿 사이트에는 고객 이름 이 표시되지 않으며, 익스피디아 측에서 로열티 프로그램 가입과 연동하는 데 필요한 프로그램 계정 정보도 누락될 것입니다.
요청 헤더
| 필드 | 설명 | 데이터 유형 | 샘플 값 | 필수 여부 |
|---|---|---|---|---|
ClientId | 클라이언트를 식별합니다. IDP(ID 공급자)에 사전 등록된 값과 일치해야 합니다. 수동 클라이언트 등록 중에 또는 동적 클라이언트 등록 API를 통해 얻습니다. | String | 예 | |
Authorization | 사용자 인증을 위해 자격 증명이나 토큰을 전송하는 데 사용되는 HTTP 헤더 | String | 소지자 [access_token] | 예 |
응답
| 필드 | 설명 | 데이터 유형 | 샘플 값 | 필수 여부 |
|---|---|---|---|---|
membershipId | 고객 계정을 고유하게 식별하는 식별자 | String | 예 | |
optIn | 고객이 마케팅 이메일 수신을 동의한 경우의 부울 플래그 | 부울 | 참/거짓 | — |
languageId | 사용자가 선호하는 언어 | String | En, fr | — |
channelType | 사용자가 애플리케이션과 상호작용하는 다양한 플랫폼 | String | 웹, 모바일, 태블릿 | — |
firstName | 고객의 이름 | String | 예 | |
middleName | 고객의 중간 이름 | String | — | |
lastName | 고객의 성 | String | — | |
email | 고객의 이메일 주소 | String | — | |
programAccount | Loyalty-related 정보 | programAccount | 객체에 대한 자세한 내용은 Add loyalty -> 아래의 ‘ programAccount ’ 섹션을 참조해 주십시오. | — |
CardDetails | 고객의 신용카드 정보 | CardDetails | 객체에 대한 자세한 내용은 Restrict payment card -> 아래의 ‘ Payload details ’ 섹션을 참조해 주십시오. | — |
사용자 정보 CURL 예시
curl --location 'https://example.com/userinfo' \
--header 'client_id: {clientId}' \
--header 'Authorization: Bearer {acess_token from token endpoint}'사용자 정보 응답 예시
{
"membershipId": "12345678",
"languageID": "en",
"middleName": "MiddleName",
"lastName": "LastName",
"firstName": "FirstName",
"email": "test@expediagroup.com",
"programAccount": {
"programId": "Gold",
"loyaltyAccountBalance": {
"value": "10000",
"currency": "Points"
}
}
}로열티 추가
템플릿 사이트의 일부로, 고객이 여행 상품을 구매할 때 로열티 포인트를 적립할 수 있는 기능을 포함할 수 있습니다. 원하신다면, 귀사의 템플릿을 통해 고객이 적립한 로열티 포인트를 사용하여 여행 상품을 구매할 수 있도록 설정할 수도 있습니다.
표준 구현과 동일한 설정 요구 사항이 적용되며, 여러 가지 값도 마찬가지입니다. 다르게 적용되는 값만 여기에 포함되어 있습니다.
표준 user information 외에도, 로열티 프로그램 설정에는 다음 값들이 포함됩니다.
programAccount
| 필드 | 설명 | 데이터형 | 필수 여부 |
|---|---|---|---|
programId | 고객이 가입한 로열티 프로그램의 식별자 또는 로열티 프로그램과 관련된 등급 이름 | String | 예 |
loyaltyAccountNumber | 고객의 로열티 계정 번호. 로열티 작업에 고유 membershipId 외의 보조 식별자가 필요한 경우에만 채워져야 합니다. | String | — |
lastFourDigitsOfCreditCard | 고객이 예약에 사용한 신용카드의 마지막 4자리 숫자 | Integer | — |
accountName | 프로그램 이름(등급 이름과 다른 경우) | String | — |
loyaltyConversionRatio | 결제액이 적립 포인트로 전환되는 비율(예: $1 = 1포인트) | Double | — |
loyaltyAccountBalance | 고객이 적립한 로열티 포인트의 현재 잔액 | 금액 (대상에 대한 자세한 내용은 아래 ‘금액’ 항목을 참조해 주십시오) | — |
금액
| 필드 | 설명 | 데이터형 | 필수 여부 |
|---|---|---|---|
value | 로열티 잔액. loyaltyAccountBalance 아래에 중첩됩니다. | 긴 예약 마감 | 예 |
currency | 로열티 프로그램에서 사용하는 적립 통화(예: CAD, USD, 포인트, 마일). loyaltyAccountBalance 아래에 중첩됩니다. | String | 예 |
결제 카드 제한
여행객들이 예약 시 귀사의 신용카드를 반드시 사용하도록 귀사의 사이트를 설정해 드릴 수 있습니다. 이는 선택 사항입니다. 모든 템플릿 솔루션은 모든 주요 신용카드나 직불카드, 그리고 (미국의 경우) PayPal을 허용할 수 있습니다.
신용카드를 안전하게 저장
조직의 맞춤형 신용카드를 사용하여 구매하도록 선택하는 경우 안전하게 사용할 수 있습니다. 이를 처리하는 방법은 다음과 같습니다.
- 카드 정보는 고객의 Expedia 프로필에 연결된 토큰화된 형태로 저장됩니다. 암호화되지 않은 상태로 저장되는 경우는 없습니다.
- 암호화되지 않은 카드 데이터에 누구도 액세스할 수 없으며, 암호 해독은 안전한 IAM 자격 증명을 사용해서만 수행됩니다.
- 카드가 결제 페이지에 미리 로드되어 있는 경우 카드 번호가 아닌 카드 설명만 표시됩니다.
- 고객은 저장된 카드로 예약을 완료하려면 카드의 CVC를 입력해야 합니다.
설정 요구 사항
표준 구현의 설정 요구 사항 외에도 신용카드를 추가하려면 다음이 필요합니다.
- AuthnRequest 매개변수에 사용할 엔드포인트
- 서명 인증을 위한 공개 키
Expedia의 개인 키를 사용하여 AuthnRequest 페이로드에 서명하고 공개 키를 사용하여 파트너사에 서명 검증을 제공합니다.
페이로드 세부 정보
표준 구현에 설명된 속성과 함께 고객이 사이트에 로그인하면 신용카드 SSO가 두 가지 거래 매개변수를 안전한 Expedia SSO 엔드포인트로 전송하기 시작합니다.
- 사용자 정보 API: 서명 및 암호화된 어설션이 포함된 인코딩 및 서명된 응답 페이로드입니다.
- RelayState: 랜딩 페이지 URL에 대한 딥 링크입니다.
페이로드에는 다음과 같은 신용카드 정보도 포함됩니다.
| 필드 | 설명 | 필수 여부 |
|---|---|---|
cardNumber | 청구할 카드 번호 | 예 |
cardType | 사용한 카드 유형(예: Visa, MasterCard, American Express) | 예 |
expirationDate | 사용한 카드의 만료 날짜 | 예 |
BillingAddress | 사용한 카드와 연결된 청구 주소 | 예 |
addressCategoryCode | 청구할 주소 유형(예: 집 또는 사무실). BillingAddress 아래에 중첩됩니다. | 예 |
firstAddressLine | 청구 주소의 첫 번째 줄. BillingAddress 아래에 중첩됩니다. | 예 |
secondAddressLine | 청구 주소의 두 번째 줄. BillingAddress 아래에 중첩됩니다. | — |
thirdAddressLine | 청구 주소의 세 번째 줄. BillingAddress 아래에 중첩됩니다. | — |
cityName | 청구 주소의 도시. BillingAddress 아래에 중첩됩니다. | 예 |
provinceName | 청구 주소의 주/도. BillingAddress 아래에 중첩됩니다. | 예 |
postalCode | 청구 주소의 우편 번호. BillingAddress 아래에 중첩됩니다. | 예 |
countryCode | 청구 주소의 국가 코드. BillingAddress 아래에 중첩됩니다. | 예 |
침묵 sign-in
' sign-in '를 'Silent'로 설정하면 ID 제공자와의 유효한 세션이 이미 존재할 때 자동 인증이 활성화됩니다. 사용자가 다른 브라우저 탭이나 애플리케이션에서 인증된 상태라면, 기존 세션이 재사용되어 자격 증명을 입력하라는 메시지가 표시되지 않고 자동으로 로그인됩니다.
이 기능은 logged-in 의 상태를 유지하기 위해 브라우저 쿠키를 관리하는 방식에 의존합니다. 표준 로그인 및 SSO 흐름 모두에 동일한 인증 엔드포인트를 사용합니다. 활성 세션이 감지되면, 재인증 절차 없이 요청이 지정된 SSO 리디렉션 URL로 리디렉션됩니다.
cookie-based 의 세션 지속성 문제로 인해, SSO는 EU 일반 데이터 보호 규정(GDPR) 준수 요건의 적용을 받지 않는 판매 지점에서만 활성화할 수 있습니다. SSO 흐름을 활성화하려면 신원 제공자 설정에서 당사의 리디렉션 URL을 구성해야 합니다. 익스피디아는 통합 과정에서 리디렉션 URL을 제공할 예정입니다.
네트워크 허용 목록
이 목록은 템플릿 사이트와 익스피디아 환경 간의 안전한 통신을 위한 요구 사항을 정의합니다. AWS 아웃바운드 IP 범위와 함께, 로컬 또는 lower-environment 테스트에 사용되는 IP 주소를 제공해 드리겠습니다. 익스피디아에서 들어오는 트래픽이 차단되지 않도록 하려면 이 IP 주소들을 허용 목록에 추가해야 합니다.
또한 당사에서 해당 IP 주소들을 허용 목록에 추가할 수 있도록 귀사의 아웃바운드 IP 주소를 당사에 알려주셔야 합니다.
참고: 이 IP 주소들이 (양쪽 중 한쪽 또는 양쪽 모두의) 허용 목록에 추가되지 않으면, 발신 및 수신 SSO 호출 모두에서 연결 문제가 발생할 수 있습니다.
익스피디아 엔드포인트
인증 호출을 활성화하려면 신원 제공자에서 다음 값을 사용하여 redirect_uri 를 구성해야 합니다:
{WLTP domain}/sso/auth: 로그인 흐름에서 인증 호출 후 SSO 리디렉션 엔드포인트로 전송{WLTP domain}/validateCurrentSession: 무표시 sign-in 흐름에서 인증 호출 후 SSO 리디렉션 엔드포인트
참고: 익스피디아는 세션 시간 제한을 기본적으로 60분으로 설정해 두었습니다. 60분이 지나면 토큰을 갱신해야 합니다.