계정 정보 API

계정 정보 API에는 각 고객에 대한 세부 정보가 포함되어 있습니다. 템플릿 사이트는 이 정보를 SSO(Single-Sign-On) 프로토콜의 일부로 사용하여 사용자의 계정을 인증합니다. 이는 구매, 로열티 사용 등에 사용됩니다.

이 API는 Expedia 상담원이 사용자 계정 세부 정보를 얻기 위한 요청의 일부로 여행객의 고유 식별자(예: 신용카드 번호)를 확인하는 데에도 사용할 수 있습니다. 받은 세부 정보는 여행객에 대한 조회 및 예약을 진행하기 전에 휴대폰으로 여행객을 인증하는 데 사용됩니다.

자세한 내용은 일반적인 데이터 및 응답 페이지를 참조해 주세요.

신용카드 암호화 및 암호 해독

Expedia는 신용카드 정보를 암호화하고 암호 해독하기 위해 업계 표준 JWE(JSON 웹 암호화) 기술, 즉 공개 키와 개인 키 쌍을 사용한 비대칭 암호화를 사용합니다.

암호화 사용 사례

암호화가 수행되어야 하는 부분은 다음과 같습니다.

  • 요청: cardNumber
  • 응답: cardDetails

요청 매개변수에서 2048비트 CA(인증 기관) 서명 RSA(Rivest Shamir Adleman) 개인 키 인증서를 설정하고 이를 Expedia와 공유해야 합니다. 그런 다음 공개 키로 JWE 및 RSA를 사용하여 cardNumber 필드를 암호화합니다.

응답 매개변수에서 2048비트 CA 서명 RSA 개인 키를 설정하고 해당 공개 키 인증서를 공유하여 파트너사와 공유합니다. 그런 다음 Expedia 공개 키로 JWE 및 RSA를 사용하여 cardDetails의 각 요소를 암호화합니다.

암호화 프로세스의 단계는 아래와 같습니다.

단계별 암호화

1단계: 공개 인증서를 가져와서 RSA 2048 공개 키를 받습니다.

  1. 256비트 길이의 RSK(무작위 대칭 키)를 생성합니다.
  2. RSA-OAEP-256 알고리즘으로 RSA 2048 공개 키를 사용하여 RSK를 암호화합니다.

2단계: 96비트 길이의 무작위 IV(초기화 벡터)를 생성합니다.

3단계: RSK, IV, 알고리즘 A256GCM으로 일반 텍스트 데이터를 암호화하여 암호 텍스트와 인증 태그 데이터를 구성합니다.

4단계: 암호 텍스트를 Base64URL 인코딩하여 Base64URL(JWE 암호 텍스트)을 생성합니다.

5단계: 인증 태그, IV, RSK 및 JWE 헤더 JSON을 Base64URL 인코딩하여 다음을 생성합니다.

  • 인증 태그 데이터: Base64URL(JWE 인증 태그)
  • IV: Base64URL(JWE 초기화 벡터)
  • RSK: Base64URL(JWE 암호화 키)
  • JWE 헤더 JSON: Base64URL(UTF8(JWE 헤더))

그런 다음 마침표('.')로 구분된 Base64URL 인코딩 부분으로 구성된 컴팩트 형식으로 JWE 객체를 직렬화하여 다음을 생성합니다.

Base64URL (UTF8)(JWE 헤더) || '.' || Base64URL(JWE 암호화 키) || '.' || Base64URL(JWE 초기화 벡터) || '.' || Base64URL(JWE 암호 텍스트) || '.' || Base64URL(JWE 인증 태그)

코드 샘플

암호화를 위한 Java 샘플

JWE 암호화는 타사 JWE 라이브러리의 도움을 받아 효율적이고 빠르게 구현할 수 있습니다. 예를 들어, 이 암호화를 위한 java 코드Nimbus JOSE+JWT 라이브러리의 도움으로 작성되었습니다.

public String encryptWithJWE(String plainText){
    X509Certificate publicCertificate = <fetch public cert>
    //get RSA public key
    final X509EncodedKeySpec publicKeySpec = new 
    X509EncodedKeySpec(publicCertificate.getPublicKey().getEncoded());
    final KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    RSAPublicKey rsaPublicKey = (RSAPublicKey) keyFactory.generatePublic(publicKeySpec);
    //get keyID
    String keyID = certificateManager.getKid(publicCertificate);
    // Create JWE Header containing the needed metadata for encryption and decryption
    JWEHeader jweHeader = new JWEHeader.Builder(JWEAlgorithm.RSA_OAEP_256, EncryptionMethod.A256GCM)
        .type(JOSEObjectType.JWT)
        .customParam(IAT, System.currentTimeMillis())
        .keyID(keyID)
        .build();
/*

샘플 JWE 헤더

{
"alg":"RSA-OAEP-256",
"typ":"JWT",
"enc":"A256GCM",
"iat":<Time (in UTC) when JWE was issued, expressed in UNIX epoch time (seconds since 1 January, 1970)>,
"kid":<Key ID or subject key Identifier from the public key certificate>
}
*/
    JWEObject jweObject = new JWEObject(jweHeader, new Payload(plainText));
    RSAEncrypter encrypter = new RSAEncrypter(rsaPublicKey);
    jweObject.encrypt(encrypter);
    return jweObject.serialize();
    }

요청 시 카드 번호 암호 해독

Expedia는 요청의 cardNumber를 암호화합니다. 암호 해독 경로는 암호화 경로의 반대입니다.

  1. 암호화된 JWE를 받으면 JWE의 첫 번째 섹션인 JOSE 헤더를 디코딩하여 알고리즘, 암호화 및 keyId(alg, enc, kid)를 결정해야 합니다.
  2. 그런 다음 iat(issued-at: JWT가 발행된 시간)를 검증하여 현재 시간과 5분 이내로 차이가 나지 않는지 확인합니다. (토큰은 5분 후 만료됩니다.)
  3. 다음으로, 개인 키를 가져와 JWE 암호화 키를 암호 해독합니다.
  4. 그런 다음, 암호 해독된 RSK, JWE 초기화 벡터, JWE 인증 태그를 사용하여 JWE 암호 텍스트 매개변수를 암호 해독하고 검증할 수 있습니다.

코드 샘플

암호화를 위한 Java 샘플

JWE 암호화는 타사 JWE 라이브러리의 도움을 받아 효율적이고 빠르게 구현할 수 있습니다. 예를 들어, 이 암호화를 위한 java 코드Nimbus JOSE+JWT 라이브러리의 도움으로 작성되었습니다.

public String decryptJWE(String jweString) {
    PrivateKey privateKey = <fetch private key>;
    RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) privateKey;
    JWEObject jweObject = JWEObject.parse(jweString);
    JWEHeader jweHeader = jweObject.getHeader();validateJweHeader(jweHeader);
    RSADecrypter rsaDecrypter = new RSADecrypter(rsaPrivateKey);
    jweObject.decrypt(rsaDecrypter);
    return jweObject.getPayload().toString();
}

계정 정보 가져오기

이 필드 세트로 POST /user/v1/account를 사용하여 로열티 회원 또는 카드 소유자의 계정 정보를 가져올 수 있습니다.

헤더

필드설명샘플 값필드 유형필수 여부
partnerIdExpedia에서 제공하는 비즈니스의 고유 식별자파트너사의 브랜드String, 최대 20자
AuthorizationExpedia가 승인 서버로부터 받은 액세스 토큰을 팀에서 검증함표준 JSON 웹 토큰(JWT)String, 표준 JWT 길이아니요
Authorization2Expedia에서 전송한 JSON 웹 토큰(JWT), 파트너사 측에서 서명 및 클레임을 검증함표준 JWTString, 표준 JWT 길이아니요

요청

필드설명필드 유형필수 여부
requestId거래 요청의 고유 식별자String
membershipId고유 고객 식별자String아니요
loyaltyAccountNumber고객의 로열티 계정 번호(programAccountNumber라고도 함). 이는 로열티 작업에 membershipId 외의 식별자가 필요한 경우에만 채워져야 합니다.String아니요
programId고객이 가입한 로열티 프로그램의 식별자 또는 로열티 프로그램과 관련된 등급 이름String아니요
cardNumber고객 신용카드 번호(암호화됨)String아니요
email고객 이메일 주소String아니요

응답

필드설명필드 유형필수 여부
status거래 상태(값: Approved, Declined)String
requestId거래 요청의 고유 식별자(요청 페이로드부터)String
ProgramAccount프로그램 계정 세부 정보. 중첩된 필드는 ProgramAccount 표를 참조해 주세요.  
languageId사이트에서 표시되는 언어String아니요
channelType사이트가 최적화된 플랫폼(값: WEB, MOBILE, TABLET) 아니요

ProgramAccount

필드설명샘플 값필수 여부
programId고객이 가입한 로열티 프로그램의 식별자 또는 로열티 프로그램과 관련된 등급 이름Aventura Gold
accountName프로그램 이름(programId와 다른 경우)Aventura아니요
loyaltyAccountNumber고객의 로열티 계정 번호(programAccountNumber라고도 함). 이는 로열티 작업에 membershipId 외의 식별자가 필요한 경우에만 채워져야 합니다.1234567아니요
lastFourDigitsOfCreditCard고객이 예약에 사용한 신용카드의 마지막 4자리 숫자0000아니요
loyaltyConversionRatio결제액이 적립 포인트로 전환되는 비율(예: $1 = 1포인트) 아니요
loyaltyAccountBalance고객이 적립한 로열티 포인트의 현재 잔액2003

사용자 정보

필드설명샘플 값필수 여부
userId고객을 위한 고유 식별자. membershipId와 동일합니다. 
name고객 이름, 중간 이름, 성  
firstName고객의 이름. name 아래에 중첩됩니다.Bob
middleName고객의 중간 이름. name 아래에 중첩됩니다.Robert아니요
lastName고객의 성. name 아래에 중첩됩니다.Jones
contactInfo주소, 이메일, 전화번호를 포함한 고객 연락처 정보 아니요
address고객 주소(상세 주소, 도시, 주/도, 우편번호 포함). contactInfo 아래에 중첩됩니다.  
streetAddress고객의 상세 주소. address 아래에 중첩됩니다.123 Main St.아니요
city고객의 상세 주소 내 도시. address 아래에 중첩됩니다.Boston아니요
state고객의 상세 주소 내 주/도. address 아래에 중첩됩니다.MA아니요
country고객의 상세 주소 내 국가. address 아래에 중첩됩니다.USA아니요
postalCode고객의 상세 주소 내 우편번호. address 아래에 중첩됩니다.02112아니요
taxProvince고객이 세금을 납부할 주/도. address 아래에 중첩됩니다.MA아니요
email고객의 이메일 주소. contactInfo 아래에 중첩됩니다.brjones@somewhere.com아니요
contactNumber고객의 전화번호. contactInfo 아래에 중첩됩니다.555-555-5555아니요
userType고객이 단일(기본) 사용자인지 아니면 조직과 관련되어 있는지 여부 아니요
dateOfBirth고객의 생년월일 아니요
cardDetails거래에 사용된 신용카드에 대한 세부 정보. 채워진 경우 일부 중첩된 항목을 암호화해야 합니다. 아니요
cardNumber *거래에 사용된 신용카드 번호(암호화됨). cardDetails 아래에 중첩됩니다. 
cardType사용된 카드 유형(암호화됨). cardDetails 아래에 중첩됩니다. 
expirationDate *MM/YYYY 형식의 카드 만료 날짜(암호화됨). cardDetails 아래에 중첩됩니다. 
billingAddress거래에 사용된 카드의 청구 주소. cardDetails 아래에 중첩됩니다.  
firstAddressLine *청구 주소의 첫 번째 줄(암호화됨). billingAddress 아래에 중첩됩니다. 
secondAddressLine청구 주소의 두 번째 줄. billingAddress 아래에 중첩됩니다. 아니요
thirdAddressLine청구 주소의 세 번째 줄. billingAddress 아래에 중첩됩니다. 아니요
city청구 주소의 도시 요소. billingAddress 아래에 중첩됩니다. 아니요
province청구 주소의 주/도 요소. billingAddress 아래에 중첩됩니다. 아니요
countryCode청구 주소의 국가 요소. billingAddress 아래에 중첩됩니다. 아니요
postalCode *청구 주소의 우편번호 요소(암호화됨). billingAddress 아래에 중첩됩니다. 

참고: cardDetails 필드를 채우는 경우 * 표시가 있는 필드는 필수 항목입니다. 이러한 필드의 모든 데이터는 암호화됩니다.

API 세부 정보

신용카드 정보가 없는 경우

신용카드 정보가 있는 경우

이 페이지가 도움이 되었나요?
이 콘텐츠를 어떻게 개선하면 좋을까요?
더 나은 만드는 데 도움을 주셔서 감사합니다!