Developer Hub
자동 생성된 번역입니다.

SCA 및 PSD2 규정 준수

온라인 신용카드 결제에 적용되는 인증 규정을 이해하기

개요

규제 당국과 카드 네트워크 업체들은 온라인 결제의 보안을 강화하고 소비자를 사기 피해로부터 보호하기 위해 새로운 요건을 도입하고 있다. 이러한 규정 중 상당수는 온라인 결제 시 강력한 고객 인증(SCA)을 적용해야 한다는 요건을 포함하고 있습니다.

  • 유럽: 개정된 결제 서비스 지침(PSD2)에 따르면, 특정 면제 사항이나 ‘ out-of-scope ’에 해당하는 경우를 제외하고는 온라인 결제 거래 시 SCA를 사용해야 합니다.
  • 일본: 일본의 SCA 의무 규정에 따라 온라인 신용카드 거래 시 3D Secure(3DS) 인증을 사용해야 하며, 일부 거래 유형은 예외로 적용됩니다.

3D Secure 2(3DS 2.0)는 Rapid API 내에서 SCA 규정을 준수하기 위해 사용되는 솔루션입니다. 3DS 2.0은 EMVCo와 카드 결제 처리 업계가 공동으로 개발한 기술로, 보안과 원활한 결제 경험을 조화시키면서 규정 준수를 보장하는 솔루션입니다.

이 페이지에서는 지원되는 ‘ Rapid API ’ 결제 유형에 어떤 영향이 있는지, 그리고 여행객에게 서비스를 제공할 때 규정 준수를 위해 취할 수 있는 조치가 무엇인지 설명합니다.

규정 준수 요구 사항

SCA가 요구되는 국가에서 규정 준수 거래를 가능하게 하는 절차는 등록 판매자가 누구인지, 그리고 대금이 어떻게 지급되는지에 따라 달라집니다. Rapid API.

귀사가 공식 판매자일 경우

Expedia Affiliate Collect

Expedia Affiliate Collect를 이용하는 예약은 SCA 규정의 적용을 받지 않습니다. 규정 준수를 위해 Rapid API 의 결제 프로세스나 API 연동 변경은 필요하지 않습니다.

다만, 귀하가 등록 판매자(merchant of record)로서 SCA 규정의 적용 범위에 포함되는 여행자의 신용카드, 직불카드 또는 기타 결제 수단을 통해 대금을 청구하는 경우, 해당 규정의 영향을 받을 수 있습니다. 해당 규정은 결제 과정에서 3DS 2.0을 ‘ SCA-compliant ’ 솔루션으로 사용하도록 요구할 가능성이 높습니다. 가맹점이 SCA 규정을 준수하고 거래 실패를 방지할 수 있도록 지원하는 서비스에 대해 자세히 알아보시려면 결제 대행사에 문의해 주시기 바랍니다.

기업용 카드

귀사가 공식 판매자(Merchant of Record)이며, SCA 의무 적용 국가에서 발급된 신용카드 또는 직불카드로 Rapid API 에 대금을 결제하는 경우, 다음 카드 유형은 SCA 요건에서 면제됩니다:

  • 일회용 가상 카드
  • 개인에게 발급되는 것이 아니라 귀사에 발급되는 법인 카드입니다.

나열된 ‘ SCA-exempt ’ 카드가 적합하지 않은 경우, 귀사는 해당 카드를 발급한 은행에 직접 면제 신청을 할 수 있습니다. 면제가 승인될 경우, 해당 카드로 이루어지는 거래는 3DS 2.0을 이용한 ‘ one-time ’ 온라인 인증을 제외하고는 별도의 인증 절차가 필요하지 않습니다. 이 ‘ one-time ’ 요건은 은행에 따라 다를 수 있습니다. 면제를 받는 데 시간이 오래 걸릴 수 있으며, 은행에서 사기성 결제에 대해 책임을 물을 수도 있습니다.

Rapid API 가 공식 판매자인 경우

귀사가 Rapid API 을 공식 가맹점(Merchant of Record)으로 지정하여 Rapid에 여행자 카드를 발송하는 경우, 해당 규정의 영향을 받을 수 있습니다. 여행자가 여행사 대리인을 통하지 않고 온라인으로 예약할 경우, 관련 규정에 따라 결제 거래는 SCA를 통해 여행자 본인이 인증해야 합니다. 이 요구 사항에 대한 SCA-compliant 절차는 결제 과정에서 3DS 2.0을 사용하는 것입니다. 귀사에서 SCA 의무 적용 국가에서 발급된 신용카드 또는 직불카드 거래 시 Rapid API 을 공식 가맹점(Merchant of Record)으로 지정하고자 하는 경우, 당사의 SCA 솔루션을 도입하셔야 합니다.

>> SCA를 위한 당사의 솔루션에 대해 알아보세요

소매 대리점이나 콜센터 상담원을 통해 처리된 거래는 SCA 요건의 적용을 받지 않습니다. 이러한 거래에서 규정을 준수하려면 예약이 여행사나 상담원의 도움으로 이루어졌다는 명시적인 표시만 있으면 됩니다. 이를 표시하려면 예약 가능 여부 API의 sales_channel 필드를 사용해 주세요.

숙박 시설가 공식 판매자인 경우

귀사에서 숙박 시설 collect를 사용하고 있다면, 해당 규정의 영향을 받을 수 있습니다. '노쇼' 수수료나 보증금과 같이, 여행자가 현장에 없는 상태에서 숙박 시설가 여행자의 카드에 요금을 청구하려고 시도할 수 있는 경우가 있습니다. 결제 전에 3DS 2.0 인증이 수행되지 않은 경우, 이러한 결제는 SCA-compliant 로 간주되지 않습니다. 귀사에서 SCA 의무 적용 국가에서 발급된 신용카드나 직불카드를 사용하는 여행객을 대상으로 숙박 시설 결제 서비스를 이용하고자 한다면, 당사의 SCA 솔루션을 도입해야 합니다.

>> SCA를 위한 당사의 솔루션에 대해 알아보세요

Rapid API 솔루션

작동 방식

Rapid API 를 공식 가맹점으로 지정하거나 숙박 시설를 통해 여행자 카드로 결제를 처리하는 경우, Rapid의 API 솔루션을 도입하여 SCA 규정을 준수하는 예약 내역을 생성할 수 있습니다. 당사의 API는 예약 절차에서 3DS 2.0을 사용하여 SCA 준수를 지원합니다. 3DS 2.0을 통해 당사는 ‘ risk-based ’ 인증 방식을 지원하며, 이를 통해 은행이 여행자에게 보안 인증을 요청할 시점을 재량에 따라 결정할 수 있게 함으로써 여행자의 불편을 줄여줍니다.

3DS 2.0을 위한 해결책은 다음의 세 가지 단계로 구성됩니다:

  1. 다음과 같이 추가하면 됩니다. iframe 여행객을 위한 발급 은행의 인증 절차를 제공하는 ‘ check-out ’ 페이지로 이동합니다. 통합 문서에서는 이를 3DS iframe이라고 부릅니다.
  2. 또한 check-out 페이지에 새로운 client-side JavaScript 라이브러리를 포함시켜야 합니다. 이 라이브러리는 브라우저 데이터를 수집하고, iframe과 통신하며, iframe 내에서 SCA 환경을 표시하는 데 사용됩니다. 통합 문서에서는 이를 ‘3DS 커넥터 라이브러리’라고 부릅니다.
  3. Rapid API 은행의 납부자 정보를 수락하고, 보안 인증이 완료된 후 예약을 마무리합니다.

JavaScript 와 Rapid API 를 함께 사용할 경우, SCA가 적용된 예약 흐름에서는 이제 예약 API가 호출되기 전후에 몇 가지 추가 단계가 포함됩니다. 아래의 다이어그램은 업데이트된 예약 흐름입니다.

예약 준비는 Rapid API에서의 결제 등록과 JavaScript API에서의 데이터 수집으로 구성됩니다. 다음 단계는 Rapid API에서의 예약입니다. 마지막으로, 전체 예약 절차는 JavaScript API에서 SCA를 표시하는 것으로 시작되며, �이후 Rapid API.

변경된 예약 흐름의 각 단계에서는 한 단계의 출력 정보가 다음 단계의 입력 데이터로 사용됩니다. 데이터가 브라우저의 JavaScript와 Rapid 간에 전달되어야 합니다.

참고: 위의 다이어그램은 입문용으로 실제 API 흐름을 단순화한 것입니다. 전체 API 흐름을 자세히 알아보려면 통합 설명서를 참조해 주세요.

통합 구성 요소 세부 정보

브라우저 iframe

check-out 환경에 배치된 iframe은 여행자가 이용하는 card-issuing 은행이 소유한 URL을 호스팅합니다. 이 URL을 통해 사용자에게 인증 절차가 표시되며, traveler-supplied 에 입력된 정보는 사용자의 은행으로 직접 전송됩니다. iframe은 처음에는 숨겨져 있어야 하며, 예약 시도 후 인증 절차가 필요할 때 이를 페이지 위에 중첩하여 표시할 수 있어야 합니다.

브라우저 JavaScript 라이브러리

이 라이브러리는 ‘ check-out ’ 페이지에 추가되며, 인증 절차를 지원하기 위해 예약 시 호출됩니다. 라이브러리의 API는 아래에 설명된 기능을 지원합니다.

여행객의 기기 정보 자동 수집

예약 시도를 하기 전에, 인증을 위한 예약 절차를 준비하기 위해 여행자의 기기에 대한 정보를 수집해야 합니다. 해당 정보는 여행자의 발급 은행( issuing-bank )으로 전송되어 검토를 거치며, 이를 통해 은행은 위험을 평가하고, 해당 거래에 3DS 2.0 인증이 필요한지 여부를 결정하며, 인증 화면이 올바르게 표시되는지 확인할 수 있습니다. 3DS 2.0 사양에 따라, 여행자의 브라우저에서 언어, 색상 심도, 화면 높이, 화면 너비, 시간대, 사용자 에이전트 및 Java 활성화 여부 등의 데이터가 수집됩니다.

브라우저 iframe에서 인증 과정을 표시합니다.

예약 시도 후 라이브러리는 iframe 오버레이를 표시하고 은행의 콘텐츠를 iframe에 로드하는 데 사용됩니다. 인증 절차 중에 은행 측은 위험 평가를 뒷받침하기 위해 여행자의 기기에 대한 추가 정보를 수집할 수 있습니다. 이 절차는 예약을 완료하는 데 필요합니다.

Rapid API

Rapid API client-side # 라이브러리와 연동되는 API를 포함합니다.JavaScript API는 아래에 설명된 기능을 지원합니다.

여행객 등록 및 결제 정보

예약 시도를 하기 전에, 인증을 위한 예약 절차를 준비하기 위해 여행자에 대한 추가 정보를 수집해야 합니다. 데이터에는 POS(Point of Sale)와 여행객의 결제 정보가 포함된 여행객 계정의 세부 정보가 포함됩니다. 이 데이터는 이후 여행자의 발급 은행( issuing-bank )으로 전송되어 검토를 거치며, 이를 통해 은행은 위험을 평가하고 해당 거래에 보안 인증이 필요한지 여부를 결정합니다. Rapid Booking API의 일부인 Register Payment API를 살펴보시면 더 자세한 내용을 확인하실 수 있습니다.

결제 완료 및 예약 확인

Rapid API 을 통해 예약 시도를 하고 브라우저에서 SCA 절차가 완료된 후에는 Rapid를 한 번 더 호출해야 합니다. 배경에서 인증이 실제로 성공적으로 완료되었는지 확인하여 예약을 확정할 수 있도록 하겠습니다. Rapid Booking API의 ‘결제 세션 전체’를 살펴보시면 더 자세한 내용을 확인하실 수 있습니다.

예약 흐름

Partner Profile Rapid Support에서 3DS 2.0이 활성화된 경우, Price Check API는 Create Booking API 대신 Register Payments API로 연결되는 링크를 반환합니다. 다음 다이어그램은 여행객이 예약을 시작한 후에 필요한 API 호출 시퀀스입니다. 시퀀스에는 JavaScript 라이브러리 및 Rapid에 대한 호출이 모두 포함됩니다.

먼저 JavaScript 라이브러리를 초기화한 다음 Rapid API를 사용하여 결제 세션을 생성합니다. 흐름이 JavaScript로 돌아가 결제 세션을 초기화하면 Rapid API를 사용하여 예약합니다. 인증 절차가 필요하지 않은 경우 예약이 완료됩니다. 인증 절차가 필요한 경우, JavaScript 을 사용하여 iframe으로 3DS 2.0을 표시하고 다음을 통해 결제 세션을 완료하십시오. Rapid API.

예약이 인증을 위해 준비될 때, 인증이 항상 필요한 것은 아닙니다. 인증 필요 여부는 결제에 사용된 신용카드의 발급 은행에 따라 결정됩니다. 이러한 결정은 트랜잭션 진행 중에 이루어지며, Create Booking API 응답에 표시됩니다.

다음 다이어그램은 보류 및 재개 사용 시 필요한 API 호출 시퀀스를 나타냅니다.

>> ‘일시 중지’ 및 ‘재개’ 기능 알아보기

먼저 JavaScript 라이브러리를 초기화한 다음, Rapid API를 사용하여 결제 세션을 생성합니다. 다음으로 JavaScript API로 결제 세션을 초기화한 후 Rapid API로 예약합니다. 인증 절차가 필요하지 않은 경우, Rapid API 로 이동하여 예약을 계속 진행하십시오. 인증이 필요한 경우, JavaScript API를 통해 iframe으로 3DS 2.0을 표시하고, Rapid API, 를 통해 결제 세션을 완료한 후, Rapid API 를 사용하여 예약을 재개하십시오.

참고: 위의 다이어그램은 입문용으로 실제 API 흐름을 단순화한 것입니다. 전체 API 흐름을 자세히 알아보려면 통합 설명서를 참조해 주세요.

3DS 2.0 서비스 이용에 필요한 기술적 요구 사항에 대한 자세한 내용은 EMVCo의 3D Secure 프로토콜 및 핵심 기능 사양.

Rapid API 및 3DS 2.0 통합 가이드

SCA를 지원하려면 Rapid API 를 ‘3DS 커넥터’라고 불리는 새로운 JavaScript 라이브러리와 통합해야 합니다. 이 두 가지는 ‘ check-out ’ 페이지에서 3DS 2.0을 표시하고 예약을 확정하는 데 함께 사용됩니다. 이 솔루션은 Expedia Collect 및 Property Collect 비즈니스 모델을 모두 지원합니다.

3DS 2.0을 통해 예약을 처리하는 데 필요한 API 호출 순서는 아래에 요약되어 있으며, 자세한 내용은 다음 섹션에서 설명합니다:

  1. JavaScript 설정 메서드
  2. Rapid 결제 등록 API
  3. JavaScript 세션 초기화 메서드
  4. Rapid 예약 API
  5. JavaScript 챌린지 메서드
  6. Rapid 결제 완료 API

이 순서를 허용하려면 Rapid Partner Support를 통해 개별 파트너 프로필에 대해 3DS 2.0을 활성화해야 합니다.

Rapid API

파트너 프로필에 대해 인증이 활성화된 경우, 3DS 2.0을 적용한 수정된 예약 절차를 지원하기 위해 API 응답 내용이 달라집니다.

가용성 API

규정에서 허용하는 경우 인증 면제를 받으려면 API 요청 내의 ‘ sales_channel ’ 필드 값이 정확해야 합니다. 이 수치는 다른 여러 요인과 함께 카드 발급 은행에서 예약 시 결정을 내리는 과정에서 검토됩니다. SCA의 적용에서 제외되는 것은 에이전트 도구뿐입니다. 이를 지정하려면 sales_channel 값을 agent_tool로 설정해 주세요.

요금 확인 API

API 응답에는 예약 생성 API 대신 결제 등록 API 링크가 포함됩니다.

3DS 2.0이 활성화된 경우의 응답 예시:

{
    "status": "matched",
    "occupancies": {
        //...(example omitted for length)
    },
    "links": {
        "payment_session": {
            "method": "POST",
            "href": "/v3/payment-sessions?token=QldfCGlcUAVgBDRwdWXBBL"
        }
    }
}

결제 등록 API

이는 SCA 예약 흐름의 두 번째 단계이며, JavaScript setup메서드가 실행된 후에 이루어집니다.

이 요청에는 non-SCA 예약 절차의 일부인 결제 정보와, 인증을 성공적으로 수행하기 위한 새로운 필드가 포함됩니다. 이 중 encoded_browser_metadataversion 필드는 JavaScript API의 setup method에서 반환됩니다.

응답에는 payment_session_idencoded_init_config가 포함됩니다. 이는 JavaScript 라이브러리의 initSession 메서드에 입력으로 지정됩니다. 응답에 포함된 예약 링크는 initSession메서드 실행 후에 사용해야 합니다.

요청 예:

{
    "version": "1",
    "browser_accept_header": "*/*",
    "encoded_browser_metadata": "ZW5jb2RlZF9icm93c2VyX21ldGFkYXRh",
    "preferred_challenge_window_size": "medium",
    "merchant_url": "https://server.adomainname.net",
    "customer_account_details": {
        "authentication_method": "guest",
        "authentication_timestamp": "2027-02-12T11:59:00.000Z",
        "create_date": "2027-09-15",
        "change_date": "2027-09-17",
        "password_change_date": "2027-09-17",
        "add_card_attempts": 1,
        "account_purchases": 1
    },
    "payments": [
        {
            "type": "customer_card",
            "card_type": "VI",
            "number": "4111111111111111",
            "security_code": "123",
            "expiration_month": "08",
            "expiration_year": "2027",
            "billing_contact": {
                "given_name": "John",
                "family_name": "Smith",
                "email": "smith@example.com",
                "phone": "4875550077",
                "address": {
                    "line_1": "555 1st St",
                    "line_2": "10th Floor",
                    "line_3": "Unit 12",
                    "city": "Seattle",
                    "state_province_code": "WA",
                    "postal_code": "98121",
                    "country_code": "US"
                }
            },
            "enrollment_date": "2027-09-15"
        }
    ]
}

응답 예:

{
    "payment_session_id": "76d6aaea-c1d5-11e8-a355-529269fb1459",
    "encoded_init_config": "QSBiYXNlNjQgZW5jb2RlZCBvYmplY3Qgd2hpY2ggY29udGFpbnMgY29uZmlndXJhdGlvbiBuZWVkZWQgdG8gcGVyZm9ybSBkZXZpY2UgZmluZ2VycHJpbnRpbmcgYW5kL29yIDNEUyBNZXRob2Qu",
    "links": {
        "book": {
            "method": "POST",
            "href": "/v3/itineraries?token=MY5S3j36cOcLfLBZjPYQ1abhfc8CqmjmFVzkk7euvWaunE57LLeDgaxm516m"
        }
    }
}

예약 생성 API

이는 SCA 예약 흐름의 네 번째 단계이며, JavaScript initSession메서드가 실행된 후에 수행됩니다. 이번 요청에는 SCA와 관련된 새로운 필드가 포함되지 않을 것입니다. 필요한 모든 정보는 Register Payment API에서 반환된 예약 링크의 토큰에 포함되어 있습니다. 성공 시 응답에는 항상 itinerary_id가 포함됩니다. 그러나 3DS 2.0 인증이 필요할 수 있으므로, 이것만으로는 예약이 확정된 것으로 볼 수 없습니다.

필요한 경우, 응답에는 또한 .이 포함됩니다 encoded_challenge_config. 결제 등록에서 반환된 encoded_challenge_configpayment_session_id는 JavaScript challenge 메서드에 매개변수로 전달되어야 합니다.

응답에는 complete_payment_session에 대한 새 링크도 포함됩니다. 이 링크는 JavaScript 라이브러리의 challenge 메서드 후에 사용해야 합니다.

3DS 2.0 인증이 필요하지 않은 경우, 예약이 확정되며 응답에는 retrieve, cancel및 (선택 사항인) resume링크가 포함됩니다.

예시: 3DS 2.0 인증이 필요한 경우 예약 생성 응답:

{
    "itinerary_id": "8999989898988",
    "links": {
        "complete_payment_session": {
            "method": "PUT",
            "href": "/v3/itineraries/8999989898988/payment-sessions?token=MY5S3j36cOcLfLBZjPYQ1abhfc8CqmjmFVzkk7euvWaunE57LLeDgaxm516m"
        }
    },
    "encoded_challenge_config": "ABElifsiejfacies2@033asfe="
}

결제 세션 완료 API

이는 SCA 예약 흐름의 여섯 번째 단계이며, JavaScript challenge메서드가 실행된 후에 진행됩니다. 이 API는 결제를 완료하고, 보안 인증 시도가 성공 여부와 관계없이 완료되었음을 Rapid API 에 알리기 위해 필요합니다.

이번 요청에는 SCA와 관련된 새로운 필드가 포함되지 않을 것입니다.

응답이 성공하면, 예약 확인 정보가 포함되며, 여기에는 itinerary_idretrieve, cancel, 그리고 선택 사항으로 resume링크가 포함됩니다.

응답 예:

{
    "itinerary_id": "8999989898988",
    "links": {
        "retrieve": {
            "method": "GET",
            "href": "/v3/itineraries/8999989898988?token=MY5S3j36cOcLfLBZjPYQ1abhfc8CqmjmFVzkk7euvWaunE57LLeDgaxm516m"
        }
    }
}

Iframe 및 JavaScript 라이브러리 구현

SCA 예약 워크플로를 사용할 때는 ‘ check-out ’ 페이지에 새로운 iframe과 JavaScript 라이브러리를 포함해야 합니다. ‘3DS iframe’이라고 불리는 이 iframe은 다음을 사용하여 인증 절차를 표시합니다. 3D-Secure 2.0. 3DS Connector 라이브러리라고 하는 JavaScript 라이브러리는 발급 은행으로 정보 전송을 지원하고 은행의 콘텐츠를 iframe에 로드합니다.

Iframe 추가하기

3DS iframe은 처음에는 숨겨져 있다가 결제를 처리하기 위해 인증 요청이 필요할 때 표시될 수 있는 컨테이너에 있어야 합니다.

컨테이너 디자인은 호스팅 페이지에 맞게 사용자 설정할 수 있습니다. 아래는 부트스트랩 모달을 사용하여 안내용으로 제작된 구현 예시입니다.

<div id="threeDsIframeModal" class="modal" role="dialog">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-body iframe-container">
                <div class="embed-responsive embed-responsive-16by9">
                    <iframe id="threeDsIframe" src="<<3DS iframe URL>>"> </iframe>
                </div>
            </div>
        </div>
    </div>
</div>

iframe의 소스는 다음 두 값 중 하나로 설정되어야 합니다.

URL 유형URL참고
프로덕션https://static.pay.expedia.com/3ds/threeDsIframe.html생산 인증을 지원합니다
샌드박스 테스트https://static.pay.expedia.com/3ds/sandboxThreeDsIframe.html인증 테스트를 지원합니다

테스트 URL은 테스트를 지원하며, 이 주제는 문서 후반부에서 다룹니다. 테스트 중에 iframe의 내용을 제한하려면 iframe에 sandbox 속성을 지정할 수 있지만, 다음 항목은 허용해야 합니다:

sandbox = 'allow-scripts allow-forms allow-same-origin';

JavaScript 라이브러리 추가하기

3DS Connector 라이브러리는 3DS iframe과 통신하고 iframe 콘텐츠를 제공하는 발급 은행에 데이터를 전송합니다. 아래는 결제 페이지에 라이브러리를 추가하는 방법의 예입니다.

<head>
    <script src="<<3DS connector script URL>>" integrity="<<actual integrity value>>"></script>
</head>

Script 요소의 source 및 integrity 속성은 아래 값으로 설정해야 합니다.

라이브러리 버전속성
1.3.39srchttps://static.pay.expedia.com/3ds/1.3.39/pay-3ds-js-libs-connector.min.js
integritysha384-par0I4Q5cfljwzqw2mAggM4dKdYzGyj4uZiL4cMviGjI3qVzEgWGuZ2075mYutbT
1.3.65srchttps://static.pay.expedia.com/3ds/1.3.65/pay-3ds-js-libs-connector.min.js
integritysha384-gYopPw6xE5DZwnZXGavkwnvs3NkDOobnHqjroUnSHpGXvs/J9xjHX/8aGzKtSgWI
2.0.1srchttps://static.pay.expedia.com/3ds/2.0.1/pay-3ds-js-libs-connector.min.js
integritysha384-1ntftSOl8ZSqJ/m7qqxXTNGOx3JLbF7Uw5YX8i/ageTjgmTnUMZ3ROpxxMiUkYma

** 참고:** 향후 새 버전이 출시되면 원본 URL과 무결성 정보가 변경될 수 있습니다. 최신 버전이 기존 통합을 중단해서는 안 됩니다. 이전 버전의 스크립트에는 계속 액세스할 수 있습니다.

SCA를 위해 3DS와 JavaScript 활용하기

라이브러리에서는 JavaScript Promise를 사용해야 합니다. 다음은 안내를 위한 구현 예시이며, JavaScript 메서드와 Rapid 간에 데이터가 교환되는 방식을 보여줍니다.

// Initialize the library
let connector = new PayThreeDSConnector.ThreeDSConnector("threedsiframe", "https://static.pay.expedia.com");
RapidIntegration.priceCheck(priceCheckLink)
  .then(priceCheckResponse => {
    paymentSessionLink = priceCheckResponse.links.payment_session.href;
    // Setup an authentication session with the library
    return connector.setup({ referenceId: ’1000’ })
  }).then(setupResponse => {
    console.log("Setup Response: ", setupResponse);

    // Send information from setup to Rapid’s Register Payments API
    return RapidIntegration.registerPayment(paymentSessionLink,
           setupResponse);
  }).then(paymentSessionResponse => {
    console.log("Register Payments Response: ", paymentSessionResponse);
    paymentSessionId = paymentSessionResponse.paymentSessionId;
    bookLink = paymentSessionResponse.links.book.href;
    if (paymentSessionResponse.encoded_init_config) {
      // If the payment session response contains an encoded_init_config
      // field, initialize an authentication session with the library
      // using information returned from Rapid’s Register Payments API
      connector.initSession({
        paymentSessionId: paymentSessionId,
        encodedInitConfig: paymentSessionResponse.encodedInitConfig
      }).then(initSessionResponse => {
        console.log("Init Session Response: ", initSessionResponse);
        // Then create a booking with Rapid’s Book API
        return RapidIntegration.createBooking(bookLink,
               paymentSessionId);
      })
    } else {
      // Otherwise, create a booking with Rapid’s Book API directly
      return RapidIntegration.createBooking(bookLink, paymentSessionId);
    }
  }).then(createBookingResponse => {
    console.log("Create Booking Response: ", createBookingResponse);
    itineraryId = createBookingResponse.itinerary_id;
    if (createBookingResponse.encoded_challenge_config) {
      // If the Create Booking API contains an encoded_challenge_config field,
      // display the authentication challenge window
      $(’#threeDsIframeModal).modal(’show’);
      completePaymentSessionLink = createBookingResponse.links.complete_payment_session.href;
      // Perform the challenge using the information returned from Rapid’s Register Payments API
      // and Create Booking API
      connector.challenge({
        paymentSessionId: paymentSessionId,
        encodedChallengeConfig: createBookingResponse.encodedChallengeConfig
      }).then(challengeResponse => {
        console.log("Challenge Response: ", challengeResponse);
        // Complete a booking with Rapid’s Complete Payment Session API
        return RapidIntegration.completePaymentSession(completePaymentSessionLink, itineraryId);
      }).then(completePaymentSessionResponse => {
        console.log("Complete Payment Session Response: ", completePaymentSessionResponse);
        return completePaymentSessionResponse;
      }).finally(() => {
        // Close the authentication challenge window
        $(’#threeDsIframeModal’).modal(’hide’);
      });
    } else {
      return createBookingResponse;
    }
  }).then(bookingResponse => {
    ...
  });

참고:RapidIntegration 클래스에 대한 언급은 예제의 일부일 뿐, 3DS 커넥터 라이브러리의 일부는 아닙니다. 이는 API로의 정보 전송을 지원하는 래퍼를 보여 주기 위한 것입니다.

예제에서는 런타임 시 정해져야 하는 매개변수에 대해 정적 값을 사용합니다(예: referenceId).

Check-out 페이지 디자인 지침

3DS 인증을 지원하는 카드 브랜드의 경우, 해당 브랜드의 지침에 따라 로고 및 브랜드 이미지를 표시해야 할 수 있습니다.

카드 브랜드인증 브랜딩로고 및 지침
MastercardMastercard Identity Check https://brand.mastercard.com/debit/mastercard-brand-mark/downloads.html
VisaVisa Securehttps://www.merchantsignage.visa.com/brand_guidelines

참고: 다른 카드 브랜드의 로고 및 안내 사항은 정보가 확보되는 대로 순차적으로 추가될 예정입니다.

3DS Connector JavaScript 라이브러리 설명서

클래스: ThreeDSConnector

생성자: new ThreeDSConnector(threeDsIFrameId, threeDsIFrameOrigin)

매개변수:

이름유형설명
threeDsIFrameIdstring3DS iframe의 ID입니다.
threeDsIFrameOriginstring3DS iframe의 소스입니다. 3DS iframe과 통신할 때 발신 창 메시지를 대상으로 하고 수신 메시지를 필터링하는 데 사용됩니다.

설정

화면 크기, 색상 심도 등 백엔드 3DS 서비스에 필요한 브라우저의 기본 정보를 수집하여 결제 세션을 설정합니다.

메서드 시그니처: setup(setupRequest)

매개변수:

이름유형
setupRequestSetupRequest

반품: 약속 SetupResponse

초기화

3DS를 통한 인증을 위해 세션을 초기화합니다. 초기화 과정에서 추가 데이터가 브라우저에서 수집될 수 있습니다. 카드 발급사에서 요구하는 경우 3DS 메서드 URL을 iframe에 로드하여 카드 발급사의 액세스 제어 서버가 브라우저에서 직접 데이터를 수집하도록 지원할 수 있습니다. 클라이언트는 주문을 생성하기 전에 완료 콜백이 호출될 때까지 기다리지 않아도 됩니다.

메서드 시그니처: initSession(initSessionRequest)

매개변수:

이름유형
initSessionRequestInitSessionRequest

반품: 다음을 약속합니다.InitSessionResponse

챌린지

카드 발급사에서 요구하는 경우, 3DS 인증 절차를 진행하십시오.

메서드 시그니처: challenge(challengeRequest)

매개변수:

이름유형
challengeRequestChallengeRequest

반품: 약속 ChallengeResponse

클래스: SetupRequest

설정 호출의 요청 구조입니다.

속성:

이름유형설명
referenceIdstring여행객의 결제 세션을 식별하기 위한 참조 ID입니다. 로깅 및 추적에 사용됩니다. 밑줄을 사용하여 연결된 APIKey와 Customer-Session-ID를 사용합니다. 예: [APIKey]_[SessionID]

클래스: SetupResponse

설정 호출의 응답입니다.

속성:

| 이름 유형 | 설명 | |----|----|----| | version | string | 라이브러리의 버전으로, 라이브러리로의 URL 경로에 있는 버전과 동일합니다. | | encodedBrowserMetadata | string | 수집된 브라우저 세부 정보를 포함하는 인코딩된 개체입니다. 클라이언트는 이를 구문 분석하지 않고 불분명한 데이터로 처리하여 백엔드 결제 서비스에 전달해야 합니다. |

클래스: InitSessionRequest

initSession 메서드의 요청 구조입니다.

속성:

이름유형설명
paymentSessionIdstringRapid 결제 등록 API에서 반환하는 고유 ID입니다.
encodedInitConfigstringRapid 결제 등록 API에서 반환하는 초기화에 필요한 데이터가 포함된 config 개체의 인코딩된 목록입니다.

클래스: InitSessionResponse

initSession 메서드에 대한 응답 구조입니다.

속성:

이름유형설명
statusCodestringinitSession 호출의 상태입니다.
messagestring선택 사항으로, 실패 이유를 나타냅니다.

가능한 statusCode 값:

설명
SUCCESS초기화가 성공적으로 완료되었습니다.
SKIPPED초기화가 수행되지 않았습니다.
FAILED초기화에 실패했습니다. 메시지 필드에는 실패와 관련된 추가 정보가 나와 있습니다.
TIMEOUT허용 시간 내에 초기화가 완료되지 않았습니다. 제한 시간은 10초입니다.

참고:initSessionresponse statusCode 값이 모두 해당되는 경우, Rapid Booking API를 통해 진행하십시오.

클래스: ChallengeRequest

챌린지 메서드의 요청 구조입니다.

속성:

statusCode 값encoded_Challenge_config 값 테스트설명
SUCCESSW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNVQ0NFU1MifV0사용자 iframe 상호 작용 없음
SUCCESS/FAILEDW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNIT1cifV0사용자 iframe 상호 작용 없음
FAILEDW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIkZBSUxFRCJ9XQ사용자 iframe 상호 작용 없음
TIMEOUTW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlRJTUVPVVQifV0
ERRORW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIkVSUk9SIn1d

가능한 statusCode 값

설명
SUCCESS3DS 챌린지가 성공적으로 완료되었습니다.
SKIPPED외부 애플리케이션 오류가 발생했습니다.
FAILED카드 소유자가 인증 챌린지에 올바르게 응답하지 못하여 3DS 챌린지가 제대로 완료되지 않았습니다.
TIMEOUT허용 시간 내에 챌린지가 완료되지 않았습니다. 제한 시간은 1,200초입니다.

참고: 모든 challengeResponse statusCode값에 대해서는, 결제 세션을 완료하려면 Rapid API 로 진행하십시오.

Rapid API 및 3DS 2.0을 사용한 테스트

Rapid API 및 3DS 커넥터 메서드와의 연동은 해당 API에서 지원하는 특정 시나리오에 해당하는 입력 매개변수 값을 사용하여 테스트할 수 있습니다.

Rapid API

Rapid API, 를 테스트하려면 HTTP 요청에 ‘ test ’라는 추가 HTTP 헤더를 포함하고, 해당 API에서 지원하는 값 중 하나를 사용하여 지원되는 시나리오를 테스트하십시오.

SCA 예약 흐름 내에서 Rapid API 에서 제공하는 테스트 응답을 사용하여 3DS 커넥터 라이브러리 메서드를 테스트할 수도 있습니다.

결제 등록

다음 테스트 헤더 값은 API 응답과 다른 HTTP 응답 코드에서 상이한 encoded_init_config 값을 산출합니다. encoded_init_config 는 JavaScript 라이브러리의 initSession 호출에 전달되어 3DS Connector 라이브러리 내에서 다양한 테스트 사례를 트리거할 수 있습니다.

테스트 헤더 값HTTP 코드 및 응답initSession 테스트 사례
standard201 – Standard ResponseSUCCESS
init_skip201 - Response Without encodedInitConfig지원되지 않음
init_fail201 – Standard ResponseFAILED
init_timeout201 – Standard ResponseTIMEOUT
internal_server_error500 – Internal Server Error
internal_server_error503 - Server Unavailable

참고: init_skip 3DS 커넥터( Library.t_config) 내의 다양한 테스트 케이스를 initSession로 전달하여 SKIPPED 상태의 statusCode를 강제로 발생시킬 수 있습니다.

예약 생성

non-SCA 예약 흐름에 대한 예약 테스트 요청에 정의된 테스트 헤더 외에도, SCA 워크플로우에서는 추가적인 테스트 헤더 값이 지원됩니다.

>> 예약 테스트 요청 살펴보기

테스트 헤더 값은 서로 다른 encodedChallengeConfig 값을 생성하며, 이는 JavaScript 라이브러리의 challenge 호출로 전달되어 다양한 테스트 사례를 트리거할 수 있습니다.

테스트 헤더 값HTTP 코드 및 응답initSession 테스트 사례
complete_payment_session201 – Response with complete payment session linkSUCCESS without user iframe Interaction
complete_payment_session_show201 – Response with complete payment session linkSUCCESS/FAILED with user iframe interaction
complete_payment_session_fail201 – Response with complete payment session linkFAILED without user iframe interaction
complete_payment_session_timeout201 – Response with complete payment session linkTIMEOUT
complete_payment_session_error201 – Response with complete payment session linkERROR

결제 세션 완료

테스트 헤더 값으로 인해 결제를 완료하고 예약을 확인하려고 할 때 일어날 수 있는 다양한 오류 사례가 발생합니다.

테스트 헤더 값HTTP 코드 및 응답
payment_declined400 - Payment declined response
price_mismatch409 - Price mismatch response
rooms_unavailable410 - Rooms unavailable response

3DS Connector 라이브러리 및 iframe

특정 매개변수 값이 지원되는 메서드 응답과 일치해야 외부 종속성 없이 3DS Connector를 테스트할 수 있습니다. 이 동작은 iframe이 테스트 샌드박스 URL로 로드된 경우에만 지원됩니다.

세션 초기화

지원되는 InitSessionResponse statusCode 값은 initSessionRequest encodedInitConfig를 변경하여 테스트할 수 있습니다.

statusCode 값encodedInitConfig 값 테스트
SUCCESSW3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJTVUNDRVNTIn1d
FAILEDW3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJGQUlMRUQifV0=
TIMEOUTW3sicHJvdmlkZXJJZCI6IDAsICJz YW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJUSU1FT1VUIn1d
SKIPPED현재 지원되지 않습니다.

참고:encoded_init_config ’ 값은 Register Payments API에서 지원하는 테스트 헤더를 사용하여 생성할 수도 있습니다.

챌린지

지원되는 challengeResponse statusCode 값은 challengeRequest encondedChallengeConfig를 변경하여 테스트할 수 있습니다.

statusCode 값encoded_Challenge_config 값 테스트설명
SUCCESS/FAILEDW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlNIT1cifV0사용자 iframe 상호 작용 없음
FAILEDW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIkZBSUxFRCJ9XQ사용자 iframe 상호 작용 없음
TIMEOUTW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmd lT3V0cHV0Q29uZmlnIjogIlRJTUVPVVQifV0
ERRORW3sicHJvdmlkZXJJZCI6IDA sICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIkVSUk9SIn1d

encodedInitConfig값은 Booking API의 SCA 흐름에서 지원되는 테스트 헤더를 사용하여 생성할 수도 있습니다.

참고: iframe을 통해 사용자 입력을 기반으로 챌린지 상태 코드 값이 SUCCESS 또는 FAILED인지 테스트할 때, 챌린지 메서드의 응답은 iframe 내의 시뮬레이션된 인증 인터페이스가 완료될 때까지 대기합니다.

3DS iframe의 UI 예:

3DS iframe의 예

사용 예

아래는 안내용으로 제작된 구현 예입니다. 이 예에서는 사전 정의된 매개변수 값을 통해 사용자가 iframe과 상호 작용할 필요 없이 3DS 챌린지의 라이브러리를 테스트하는 방법을 보여줍니다.

var c = new PayThreeDSConnector.ThreeDSConnector(’threedsiframe’, ’https://static.pay.expedia.com’); // change to match the 3DS iframe ID
c.setup({ referenceId: ’1000’ })
    .then((setupResponse) => {
        console.log(’Setup Output: ’, setupResponse);
        return c.initSession({
            paymentSessionId: 1,
            encodedInitConfig: ’ W3sicHJvdmlkZXJJZCI6IDAsICJzYW5kYm94SW5pdE91dHB1dENvbmZpZyI6ICJTVUNDRVNTIn1d’,
        }); // SUCCESS
    })
    .then((initResponse) => {
        console.log(’InitSession Output: ’, initResponse);
        $(’#threedsIframeModal’).modal(); // replace with code to show the modal containing the 3DS iframe
        return c.challenge({
            paymentSessionId: 1,
            encodedChallengeConfig:
                ’ W3sicHJvdmlkZXJJZCI6IDAsICJzYW5kYm94Q2hhbGxlbmdlT3V0cHV0Q29uZmlnIjogIlNVQ0NFU1MifV0=’,
        }); // SUCCESS
    })
    .then((challengeResponse) => {
        console.log(’Challenge Output: ’, challengeResponse);
    })
    .finally(() => {
        $(’#threedsIframeModal’).modal(’hide’); // replace with code to hide the modal containing the 3DS iframe
    });

3DS 인증 및 숙박 시설 수집

숙박 시설 collect로 예약할 경우, 익스피디아는 카드 결제를 진행하지 않습니다. 대신, 이를 숙박 시설로 보내 처리하도록 합니다. 숙박 시설에서는 이 정보를 바탕으로 체크인 전에 카드를 인증할 수 있습니다. 여행자는 다음 장소에서 직접 결제해야 합니다. check-in.

그러나 여행객이 체크인하지 못하는 상황이 발생할 수 있는데, 이 경우 숙박 시설은 노쇼 수수료를 부과할 수 있습니다. 이러한 결제 건은 여행자가 현장에 없는 상태에서 카드 결제가 이루어지기 때문에 SCA 규정의 적용을 받을 수 있습니다.

거래가 영향을 받는 경우 결제에 실패할 수 있고, 청구가 규정을 준수하지 않으면 카드 브랜드에서 숙박 시설에 위약금을 부과할 수 있습니다.

숙박 시설과의 관계를 보호하고 파트너에게 지속적으로 서비스를 제공할 수 있도록 Expedia Group은 숙박 시설에 규정 준수를 위한 옵션을 제공합니다. 영향을 받은 숙박 시설는 이제 Expedia Group 를 활용하여 대신 인증을 받을 수 있습니다. 이를 통해 숙박 시설는 자사의 사업을 보호할 수 있으며, Rapid API 는 계속해서 숙박 시설의 다양한 제품군을 제공할 수 있게 됩니다.

Rapid API 숙박 시설 콘텐츠 파일과 숙박 시설 콘텐츠에 <payment_registration_recommended=true>플래그를 제공하며, 이를 통해 프로젝트에 숙박 시설가 잠재적으로 관련되어 있을 때 이를 식별하는 데 도움이 될 수 있습니다.

통합에 미칠 수 있는 영향

보안 인증이 필요할 수 있는 숙박 시설를 제공하려면, 예약 경로에서 3DS를 지원해야 합니다. 3DS를 지원하지 않는 경우, card-issuing 은행 측에서 해당 거래에 인증이 필요하다고 판단하면 이 숙박 시설 예약이 실패할 수 있습니다.

미국 신용카드 협회( 숙박 시설, Rapid API )가 ‘ no-show ’ 수수료를 부과할 경우, 해당 협회가 등록 판매자로 간주됩니다. 카드 청구서에 표시되는 결제 내역의 명칭은 숙박 시설가 아닌 귀사의 조직에서 정하게 됩니다. 이 텍스트를 사용자 지정하려면 Rapid 파트너 지원 팀에 문의해 주세요.

카드 브랜드의 요구 사항 및 ‘ Rapid API ’ 출시 절차를 준수하기 위해, 다음의 경우 ‘Accepted Payments’ API를 사용하여 check-out 페이지에 ‘ processing_country ’를 표시하십시오. no-show. 이는 Rapid API 가 등록 판매자인 모든 거래에 필수이며, 3DS가 사용되고 ‘거래 승인 취소( no-show )’가 발생하는 경우에 해당될 수 있습니다.

통합에 미치는 영향을 완화하는 방법

Rapid API 연동 기능이 예약 절차에서 보안 인증을 지원하지 않는 경우, 해당 숙박 시설 상품의 판매를 중단함으로써 예약 실패 위험을 줄일 수 있습니다. Rapid Partner Support에 문의하여, 해당 숙박 시설 요금 정보가 가용성 API 응답에서 제외되도록 요청하십시오.

대리인 도구를 사용할 경우, 관련 규정에 따라 해당 거래는 SCA 적용 대상에서 제외됩니다. 이를 표시하려면 예약 가능 여부 API의 sales_channel 필드를 사용해 주세요.

오류 처리

예약 생성 API 및 결제 세션 완료 API를 사용하면 예약 및 결제 거래를 확정할 수 있습니다.

재정 손실을 방지하고 고객 운영 문제를 피하려면 통합 시 다음 지침을 고려해야 합니다.

소스기능추천 시간 제한 설정오류 복구 절차필요한 조치
Rapid API결제 등록 토큰을 위한 사전 예약 요금 확인10초다시 시도하거나 다른 숙박 시설, 객실 또는 요금 선택
JavaScript3DS Connector 설정10초동일한 요청 재시도
Rapid API결제 세션 등록10초["Expect: 100-Continue"] 처리 없이 동일한 요청을 다시 시도합니다.](https://tools.ietf.org/html/rfc7231#section-6.2.1 ’Follow link’)
JavaScript결제 세션 시작10초동일한 요청 재시도
Rapid API예약 생성90초동일한 요청 재시도모든 오류의 경우 affiliate_reference_id로 예약 검색
JavaScript인증 챌린지 표시10초동일한 요청 재시도
JavaScriptchallenge.statusCode 대기180~1,200초결제 세션 완료 요청
Rapid API결제 세션 완료90초동일한 요청 재시도모든 오류의 경우 affiliate_reference_id로 예약 검색
Rapid API모든 오류의 경우 affiliate_reference_id로 예약 검색30초동일한 요청 재시도모든 오류의 경우: API 응답 코드 404 또는 200으로 예약의 최종 상태를 확인하려면 재시도 전에 90초 대기
이 페이지가 도움이 되었나요?
이 콘텐츠를 어떻게 개선하면 좋을까요?
더 나은 Developer Hub를 만드는 데 도움을 주셔서 감사합니다!