OAuth 2.0 SSO 개요
OAuth 2.0은 애플리케이션이 HTTP 서비스에 대해 사용자 계정이 제한된 액세스 권한을 얻을 수 있도록 지원하는 승인 프레임워크입니다. 사용자 계정을 호스팅하는 서비스에 사용자 인증을 위임하고 타사 애플리케이션이 사용자 계정에 액세스할 수 있도록 승인하는 방식으로 작동합니다. OAuth 2.0은 웹 및 데스크톱 애플리케이션과 모바일 기기를 위한 승인 흐름을 제공합니다.
기본 SSO
선택한 기능에 관계없이 기본 SSO에는 몇 가지 특정 데이터, 특히 공개 키가 필요합니다. 로열티 또는 신용카드 구현을 추가하려면 추가 정보가 필요합니다.
설정 정보
템플릿 사이트에 대한 OAuth 2.0 SSO 액세스를 올바르게 설정하려면 다음과 같이 몇 가지 사항이 필요합니다.
- API(승인, 토큰, userProfile)
- ClientId
- 클라이언트 암호
- ResponseMode
- isNonceEnabled
- customerDetailsAPIKey(사용 가능한 경우)
권한 부여 흐름

엔드포인트 인증
GET /authorize 엔드포인트는 인증 및 승인에 사용됩니다. 사용자가 로그인하면 권한 부여 또는 코드를 반환합니다. 인증을 위해 자격 증명을 제출하도록 안내하는 브라우저 리디렉션입니다.
| 필드 | 설명 | 데이터 유형 | 샘플 값 | 필수 여부 |
|---|---|---|---|---|
client_id | 클라이언트를 식별합니다. IDP(ID 공급자)에 사전 등록된 값과 일치해야 합니다. 수동 클라이언트 등록 중에 또는 동적 클라이언트 등록 API를 통해 얻습니다. | String | 예 | |
nonce | 재전송 공격을 완화하는 데 사용됩니다. 이 값은 ID 토큰으로 반환됩니다. | String | 예 | |
prompt | 검증에 필요한 상호 작용 유형입니다. "비어 있음"이면 사용자가 아직 인증되지 않은 경우 로그인해야 합니다. '없음'인 경우 IDP는 로그인 메시지를 표시하지 않지만 로그인한 경우 인증 코드를 반환하고 그렇지 않은 경우 오류를 반환합니다. | String | 유효한 값: none 또는 EMPTY | — |
redirect_uri | 인증 코드 또는 토큰을 전송해야 하는 콜백 위치입니다. 클라이언트 등록 시 IDP에 사전 등록된 값과 일치해야 합니다. | String | 예 | |
response_type | code(IDP) 값입니다. | String | 예 | |
response_mode | 승인 응답이 반환되는 방법입니다. | String | 유효한 값: query | — |
scope | 프로필 세부 정보를 가져오는 데 사용되는 액세스 토큰입니다. 인증 요청에 필요합니다. | String | 프로필 및 이메일 | 예 |
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=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 |
샘플 토큰 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",
"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섹션을 참조하세요. | — |
샘플 사용자 정보 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 | 예 |
Silent sign-in
자동 인증( sign-in )을 사용하면 ID 공급업체에 유효한 세션이 이미 존재하는 경우 자동 인증을 사용할 수 있습니다. 사용자가 다른 브라우저 탭이나 애플리케이션에서 인증된 경우 기존 세션이 재사용되며 자격 증명을 입력하라는 메시지가 표시되지 않고 로그인됩니다.
이 기능은 logged-in 상태를 유지하기 위해 브라우저 쿠키를 유지하는 데 의존합니다. 표준 로그인과 SSO 흐름 모두에 동일한 권한 부여 엔드포인트를 사용합니다. 활성 세션이 감지되면 재인증을 트리거하지 않고 요청이 지정된 SSO 리디렉션 URL로 리디렉션됩니다.
SSO는 cookie-based 세션 지속성으로 인해 EU의 GDPR(일반 데이터 보호 규정) 준수 요구 사항이 적용되지 않는 판매점에 대해서만 사용하도록 설정할 수 있습니다. SSO 플로우를 사용하려면 ID 공급자 설정에서 리디렉션 URL을 구성해야 합니다. 익스피디아는 연동 중에 리디렉션 URL을 제공합니다.
네트워크 허용 목록
이 목록은 템플릿 사이트와 Expedia 환경 간의 안전한 통신을 위한 요구 사항을 정의합니다. 로컬 또는 lower-environment 테스트에 사용되는 IP 주소와 함께 AWS 이그레스 IP 범위를 제공합니다. 익스피디아의 인바운드 트래픽이 차단되지 않도록 하려면 이러한 IP를 허용 목록에 추가해야 합니다.
또한 조직의 아웃바운드 IP 주소를 당사와 공유하여 당사 측에서 허용 목록에 추가할 수 있도록 해야 합니다.
참고: 이러한 IP가 허용 목록에 추가되지 않으면(한쪽 또는 양쪽 모두) 아웃바운드 및 인바운드 SSO 호출 모두에서 연결에 문제가 발생합니다.
Expedia 엔드포인트
인증 호출을 사용하려면 ID 공급자의 redirect_uri에서 이 값으로 구성해야 합니다:
{WLTP domain}/sso/auth: 로그인 흐름에 대한 인증 호출을 게시하는 SSO 리디렉션 엔드포인트{WLTP domain}/validateCurrentSession: SSO 리디렉션 엔드포인트가 조용한 sign-in 흐름에 대한 인증 호출을 게시합니다.
참고: Expedia는 표준 최대 세션 시간 제한을 60분으로 설정했습니다. 60분 후에는 토큰을 새로 고쳐야 합니다.