결제 수단 매니페스트

W3C 최초 공개 작업 초안,

이 버전:
https://www.w3.org/TR/2017/WD-payment-method-manifest-20171212/
최신 공개 버전:
https://www.w3.org/TR/payment-method-manifest/
편집자 초안:
https://w3c.github.io/payment-method-manifest/
이슈 추적:
GitHub
편집자:
Dapeng Liu (Alibaba)
Domenic Denicola (Google)
Zach Koch (Google)

초록

이 명세는 결제 수단 매니페스트로 알려진, 결제 수단이 Web Payments 생태계에 참여하는 방식과 그러한 파일이 사용되는 방식을 설명하는 기계 판독 가능 매니페스트 파일을 정의한다.

이 문서의 상태

이 절은 공개 당시 이 문서의 상태를 설명한다. 다른 문서가 이 문서를 대체할 수 있다. 현재 W3C 공개 문서 목록과 이 기술 보고서의 최신 개정판은 W3C 기술 보고서 색인(https://www.w3.org/TR/)에서 찾을 수 있다.

Web Payments Working Group은 그룹이 아직 처리하지 않은 모든 버그 보고 목록을 유지한다. 이 초안은 워킹 그룹에서 아직 논의해야 하는 일부 보류 중인 이슈를 강조한다. 이러한 이슈가 유효한지 여부를 포함하여 그 결과에 대한 결정은 내려지지 않았다. 미해결 이슈에 대한 제안 명세 텍스트가 포함된 풀 리퀘스트를 적극 권장한다.

이 문서는 Web Payments Working Group이 작업 초안으로 공개했다. 이 문서는 W3C 권고안이 되는 것을 목표로 한다.

이 문서는 최초 공개 작업 초안이다.

최초 공개 작업 초안으로 공개되었다고 해서 W3C 회원의 승인을 의미하지 않는다. 이는 초안 문서이며 언제든지 다른 문서로 갱신, 대체 또는 폐기될 수 있다. 진행 중인 작업 이외의 것으로 이 문서를 인용하는 것은 부적절하다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성했다. W3C는 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지한다. 해당 페이지에는 특허를 공개하는 방법에 대한 지침도 포함되어 있다. 개인이 필수 청구항을 포함한다고 믿는 특허에 대해 실제 지식이 있는 경우, 그 개인은 W3C 특허 정책 6절에 따라 해당 정보를 공개해야 한다.

이 문서는 2017년 3월 1일 W3C 프로세스 문서의 적용을 받는다.

1. 소개

이 절과 그 하위 절은 비규범적이다.

1.1. 사용 사례

이 명세는 다음 사용 사례를 다루고자 한다:

이는 결제 수단식별자URL 기반인 모든 결제 수단이 두 가지 핵심 정보를 포함하는 JSON 형식의 결제 수단 매니페스트 파일을 제공해야 한다는 요구사항을 통해 달성된다:

1.2. 매니페스트 접근

결제 수단 식별자 URL이 식별하는 리소스에는 기계 판독 가능 결제 수단 매니페스트가 직접 포함되어 있지 않다. 이는 종종 "https://alicepay.com/"과 같은 범용 URL이며, 사람이 읽을 수 있는 콘텐츠에 더 적합하다. 대신 HTTP Link 헤더가 결제 수단 매니페스트를 찾는 사용자 에이전트를 다른 위치로 안내하는 데 사용된다. [RFC8288]

AlicePay라는 예시 결제 수단에 대해, 결제 수단 식별자 "https://alicepay.com/"가 있다면, 사용자 에이전트는 다음과 같이 해당 결제 수단 식별자 URL에 요청을 보낼 수 있다:

HEAD / HTTP/2
Host: alicepay.com
User-Agent: Mellblomenator/9000

그러면 서버는 다음과 같이 응답한다:

HTTP/2 204
Link: </pay/payment-manifest.json>; rel="payment-method-manifest"

1.3. 예시 매니페스트 파일

§1.2 매니페스트 접근의 예를 이어가면, AlicePay 결제 수단https://alicepay.com/pay/payment-manifest.json에서 다음 결제 수단 매니페스트 파일을 제공할 수 있다:

{
  "default_applications": ["https://alicepay.com/pay/app/webappmanifest.json"],
  "supported_origins": [
    "https://bobpay.xyz",
    "https://alicepay.friendsofalice.example"
  ]
}

이는 사용자 에이전트가 AlicePay용 결제 앱을 설치하지 않은 경우, "https://alicepay.com/pay/app/webappmanifest.json"의 웹 앱 매니페스트를 참조하여 하나를 찾을 수 있음을 나타낸다.

또한 이 기본 결제 앱 외에도, AlicePay는 표시된 두 출처에서 호스팅되는 결제 앱도 AlicePay에 사용할 수 있도록 허용함을 나타낸다. 이는 사용자 에이전트가 해당 출처에서 호스팅되는 결제 앱이 AlicePay 지원을 주장하는 것을 발견하면, 그 앱들이 AlicePay 결제 수단의 결제 앱으로 동작하도록 허용할 수 있음을 의미한다.

해당 결제 수단에 대해 제3자 결제 앱이 지원되지 않는 경우, 매니페스트 파일은 "supported_origins" 키를 생략할 수도 있으며, 모든 제3자가 해당 결제 수단을 지원할 수 있음을 나타내기 위해 출처 배열 대신 "*" 값을 사용할 수도 있다.

2. 매니페스트 형식

유효한 결제 수단 매니페스트 파일은 JSON 객체로 구문 분석 가능한 내용을 포함하는 UTF-8 인코딩 파일이다. 결과 JSON 객체는 가능한 키 "default_applications" 및 "supported_origins"를 사용하여 최대 두 개의 항목을 포함해야 한다.

default_applications 키의 값이 존재하는 경우, 비어 있지 않은 JSON 배열이어야 한다. 배열의 각 항목은 결과로 구문 분석된 URL스킴이 "https"인 절대-URL 문자열이어야 한다.

supported_origins 키의 값이 존재하는 경우, 문자열 "*"이거나 비어 있지 않은 JSON 배열이어야 한다. 후자의 경우, 배열의 각 항목은 HTTPS 출처를 나타내는 절대-URL 문자열이어야 한다. 형식적으로, 해당 문자열은 결과로 구문 분석된 URL출처직렬화한 것과 같아야 한다.

웹 개발자는 모든 결제 수단 매니페스트유효하도록 보장해야 한다.

파일 내용에 대한 모든 적합성 요구사항과 마찬가지로, 이것들은 구현자 대상이 아니라 웹 개발자 대상이다. §3 처리 모델에 제시된 정확한 처리 모델이 유효하지 않은 것을 포함하여 모든 결제 수단 매니페스트 파일을 구현자가 처리하는 방식을 지배한다.

다음 결제 수단 매니페스트유효하지 않지만, 현재 명시된 처리 모델 알고리즘은 여전히 이를 허용한다:
{
  "default_applications": ["https://alicepay.com/pay/app/webappmanifest.json"],
  "created_by": "Alice",
  "created_in": "Wonderland"
}

이는 예를 들어 향후 처리 모델이 새 표준 "created_by" 키의 의미를 정의하도록 확장되고, 그것이 문자열 대신 객체여야 한다고 요구하는 경우 바뀔 수 있다. 이와 같은 상황을 피하기 위해, 웹 개발자는 자신의 결제 수단 매니페스트유효성을 보장함으로써 불쾌한 놀라움을 피하는 것이 가장 좋다.

3. 처리 모델

3.1. Payment Request API에 대한 수정

이 명세는 PaymentRequest(methodData, details, options) 생성자를 수정하여 Payment Request 생태계의 나머지 부분과 통합된다. 알고리즘이 완료되어 새로 생성된 PaymentRequest 객체를 반환하기 전에 다음 단계를 추가한다. 다음에서 request를 생성 중인 PaymentRequest 인스턴스라고 하자. [PAYMENT-REQUEST]

  1. identifiersrequest.[[serializedMethodData]] 안의 각 쌍의 첫 번째 항목으로 구성된 목록이라고 하자.

  2. client현재 설정 객체라고 하자.

  3. identifiersclient가 주어졌을 때 결제 수단 매니페스트를 수집한다.

이 단계들이 전체 과정을 시작한다. §3 처리 모델의 나머지는 이 과정이 궁극적으로 사용자에게 새로운 결제 앱을 사용할 수 있게 하는 방식의 정의와 관련된다.

이 명세가 여러 구현자의 관심을 얻게 되면, 이 절을 여기서 monkeypatch로 유지하는 대신 Payment Request API 명세 자체로 옮길 것으로 예상한다.

3.2. 결제 수단 매니페스트 수집

결제 수단 식별자 목록 identifiers환경 설정 객체 client가 주어졌을 때, 사용자 에이전트는 결제 수단 매니페스트를 수집하기 위해 다음 단계를 실행할 수 있다:

  1. identifiersclient가 주어졌을 때 결제 수단 매니페스트를 가져오고, 이것이 manifestsMap으로 비동기적으로 완료될 때까지 기다린다. 결과가 실패이면 반환한다.

  2. manifestsMap의 각 identifiermanifest에 대해 반복한다:

    1. parsedmanifest검증 및 구문 분석한 결과라고 하자. 이것이 실패를 반환하면 continue한다.

    2. parsed기본 애플리케이션 안의 각 url에 대해 반복한다:

      1. client가 주어졌을 때 url웹 앱 매니페스트를 가져오고, 그것이 webAppManifestString으로 비동기적으로 완료될 때까지 기다린다. 결과가 실패이면 continue한다.

      2. webAppManifestwebAppManifestString이 주어졌을 때 웹 앱 매니페스트 처리 단계를 실행한 결과라고 하자.

        웹 앱 매니페스트 처리 단계는 매우 관대하며, 실패하는 대신 빈 객체 또는 중요한 필드가 빠진 객체를 반환한다. 사용자 에이전트는 다음 단계에서 자신의 목적에 충분한 데이터를 포함하는지 확인하기 위해 처리된 웹 앱 매니페스트를 별도로 검증해야 한다.

      3. 사용자 에이전트 고유의 방식으로, 결과 처리된 웹 앱 매니페스트 webAppManifest를 사용하여 identifier로 식별되는 결제 수단에 적용 가능한 결제 앱을 설치한다.

        향후에는 그 serviceworker 필드를 참조하고, 이를 사용하여 Payment Handler API 명세에 부합하는 웹 기반 결제 앱을 설치함으로써 결과 처리된 웹 앱 매니페스트를 사용자 에이전트와 독립적인 방식으로 사용할 수 있게 하는 것이 계획이다. [PAYMENT-HANDLER]

    3. 지원되는 출처identifier와 연결하여, 사용자 에이전트가 나중에 이를 사용해 identifier로 식별되는 결제 수단에 표시할 수 있는 제3자 결제 앱을 결정할 수 있도록 한다.

3.3. 결제 수단 매니페스트 가져오기

목록JavaScript 문자열 supportedMethods환경 설정 객체 client가 주어졌을 때, 결제 수단 매니페스트를 가져오려면 다음 단계를 수행한다. 이 알고리즘은 (비어 있을 수 있음)으로 비동기적으로 완료되며, 이는 URL에서 바이트 시퀀스로의 맵으로, 결제 수단 식별자를 해당 매니페스트의 내용에 매핑한다.

  1. identifierURLs를 빈 목록이라고 하자.

  2. supportedMethods의 각 string에 대해 반복한다:

    1. identifierURLstring기본 URL 구문 분석한 결과라고 하자. 결과가 실패이면 continue한다.

      결과는 URL 기반 결제 수단 식별자가 아닌 모든 결제 수단 식별자, 즉 표준화된 결제 수단 식별자에 대해 실패가 된다.

    2. identifierURL검증한 결과가 false이면, continue한다.

    3. 선택적으로, continue한다.

      이 단계는 구현이 사용자 에이전트 고유의 이유로 제공된 결제 수단 식별자 중 일부를 건너뛸 수 있게 한다. §4 보안 및 개인정보 고려사항은 사용자 에이전트가 특정 식별자만 수집하는 것을 선호할 수 있는 몇 가지 이유를 논의한다.

    4. identifierURLidentifierURLs추가한다.

  3. manifestsMap을 빈 이라고 하자.

  4. identifierURLs의 각 identifierURL에 대해 반복한다:

    1. identifierRequest요청으로 새로 만들되, 그 메서드는 `HEAD`, urlidentifierURL, clientclient, mode는 "cors", credentials mode는 "omit", redirect mode는 "error"로 한다.

    2. identifierRequestFetch한다. 응답 identifierResponseprocess response하려면:

      1. identifierResponse네트워크 오류이거나 identifierResponse상태ok 상태가 아니면 continue한다.

      2. linkHeaders를 `Link`와 identifierResponse헤더 목록이 주어졌을 때 헤더 목록 값 추출의 결과라고 하자.

      3. manifestURLString을 null이라고 하자.

      4. linkHeaders의 각 linkHeader에 대해 반복한다:

        1. linkHeaderlink-value production에 따라 구문 분석한다. 구문 분석할 수 없으면 continue한다. [RFC8288]

        2. 구문 분석된 헤더가 이름이 문자열 "rel"과 ASCII 대소문자 구분 없는 일치이고, 값이 문자열 "payment-method-manifest"와 ASCII 대소문자 구분 없는 일치인 매개변수를 포함하면, manifestURLString을 구문 분석된 헤더의 URI-Reference production이 제공하는 문자열로 설정하고 break한다.

      5. manifestURLString이 null이 아니면:

        1. manifestURLidentifierResponseurl이 제공한 base URL로 manifestURLString기본 URL 구문 분석한 결과라고 하자. 결과가 실패이면 continue한다.

        2. manifestURL스킴이 "https"가 아니면 continue한다.

        3. manifestRequest요청으로 새로 만들되, 그 urlmanifestURL, clientclient, mode는 "cors", credentials mode는 "omit", redirect mode는 "error"로 한다.

        4. manifestRequestFetch한다. 응답 manifestResponseprocess response end-of-body하려면:

          1. manifestResponse네트워크 오류이거나 manifestResponse상태ok 상태가 아니면 continue한다.

          2. bodymanifestResponsebody라고 하자.

          3. body가 null이면 continue한다.

          4. readerbody에서 reader를 가져온 결과라고 하자.

          5. promisereaderbody에서 모든 바이트 읽기를 수행한 결과라고 하자.

          6. promise바이트 시퀀스 bytesfulfillment되면, manifestsMap[identifierURL]을 bytes설정한다.

  5. 위 단계에서 시작된 모든 진행 중인 fetch 알고리즘이 완료되면, 지정된 process responseprocess response end-of-body 단계를 포함하여, 이 알고리즘을 manifestsMap으로 비동기적으로 완료한다.

3.4. 결제 수단 매니페스트 검증 및 구문 분석

구문 분석된 결제 수단 매니페스트는 두 필드를 포함하는 구조체이다:

기본 애플리케이션

URL정렬된 집합, 비어 있을 수 있음

지원되는 출처

문자열 "*" 또는 출처정렬된 집합

결제 수단 매니페스트를 포함한다고 주장하는 바이트 시퀀스 bytes검증 및 구문 분석하려면, 다음 단계를 수행한다. 결과는 구문 분석된 결제 수단 매니페스트 또는 실패이다.

  1. parsed를 사용자 에이전트가 정의한 JavaScript realm에서 bytes가 주어졌을 때 바이트에서 JSON 구문 분석을 수행한 결과라고 하자. 이것이 예외를 throw하면 실패를 반환한다.

  2. Type(parsed)이 Object가 아니면 실패를 반환한다.

  3. defaultApps를 빈 정렬된 집합이라고 하자.

  4. defaultAppsValueGet(parsed, "default_applications")이라고 하자.

  5. defaultAppsValue가 undefined가 아니면:

    1. IsArray(defaultAppsValue)가 false이면 실패를 반환한다.

    2. defaultAppsListCreateListFromArrayLike(defaultAppsValue, « String »)이라고 하자. 이것이 예외를 throw하면 실패를 반환한다.

    3. defaultAppsList크기가 0이면 실패를 반환한다.

    4. defaultAppsList의 각 defaultAppString에 대해 반복한다:

      1. defaultAppURLdefaultAppString기본 URL 구문 분석한 결과라고 하자. 결과가 실패이면 실패를 반환한다.

      2. defaultAppURL스킴이 "https"가 아니면 실패를 반환한다.

      3. defaultAppURLdefaultApps추가한다.

  6. supportedOrigins를 빈 정렬된 집합이라고 하자.

  7. supportedOriginsValueGet(parsed, "supported_origins")이라고 하자.

  8. supportedOriginsValue가 "*"이면, supportedOrigins를 "*"로 설정한다.

  9. 그렇지 않고 supportedOriginsValue가 undefined가 아니면:

    1. IsArray(supportedOriginsValue)가 false이면 실패를 반환한다.

    2. supportedOriginsListCreateListFromArrayLike(supportedOriginsValue, « String »)이라고 하자. 이것이 예외를 throw하면 실패를 반환한다.

    3. supportedOriginsList크기가 0이면 실패를 반환한다.

    4. supportedOriginsList의 각 supportedOriginString에 대해 반복한다:

      1. supportedOriginURLsupportedOriginString기본 URL 구문 분석한 결과라고 하자. 결과가 실패이면 실패를 반환한다.

      2. supportedOriginURL스킴이 "https"가 아니면 실패를 반환한다.

      3. supportedOriginURLusername 또는 password가 빈 문자열이 아니면 실패를 반환한다.

      4. supportedOriginURLpath크기가 0이 아니면 실패를 반환한다.

      5. supportedOriginURLquery 또는 fragment가 null이 아니면 실패를 반환한다.

      6. supportedOriginURLoriginsupportedOrigins추가한다.

  10. defaultApps가 제공한 기본 애플리케이션과, supportedOrigins가 제공한 지원되는 출처를 가진 새 구문 분석된 결제 수단 매니페스트를 반환한다.

"default_applications" 또는 "supported_origins"의 빈 배열은 구문 분석을 실패하게 한다. 즉, 이것은 유효한 결제 수단 매니페스트가 아니며, 위 알고리즘에 의해 거부된다:
{
  "default_applications": ["https://alicepay.com/pay/app/webappmanifest.json"],
  "supported_origins": []
}

3.5. 웹 앱 매니페스트 가져오기

결제 앱의 결정이 임베딩된 HTML 문서와 독립적으로 발생하기 때문에, 기본 결제 앱에 대한 정보를 제공하는 웹 앱 매니페스트를 얻는 절차는 일반적인 웹 앱 매니페스트를 얻는 단계와 다르다.

URL url환경 설정 객체 client가 주어졌을 때, 기본 결제 앱의 웹 앱 매니페스트를 가져오려면 다음 단계를 수행한다. 이 알고리즘은 스칼라 값 문자열 또는 실패로 비동기적으로 완료된다.

  1. request요청으로 새로 만들되, 그 urlurl, clientclient, mode는 "cors", credentials mode는 "omit", redirect mode는 "error"로 한다.

  2. requestFetch한다. 응답 responseprocess response end-of-body하려면:

    1. response네트워크 오류이거나 response상태ok 상태가 아니면, 이 알고리즘을 실패로 비동기적으로 완료한다.

    2. bodyresponsebody라고 하자.

    3. body가 null이면, 이 알고리즘을 실패로 비동기적으로 완료한다.

    4. readerbody에서 reader를 가져온 결과라고 하자.

    5. promisereaderbody에서 모든 바이트 읽기를 수행한 결과라고 하자.

    6. promise바이트 시퀀스 bytesfulfillment되면, 이 알고리즘을 bytesUTF-8 디코딩한 결과로 비동기적으로 완료한다.

    7. promiserejection되면, 이 알고리즘을 실패로 비동기적으로 완료한다.

4. 보안 및 개인정보 고려사항

결제 수단 매니페스트 수집은 최종 사용자의 활동에 관한 정보를 결제 서비스에 드러낼 수 있다. 예를 들어, 하나의 웹사이트에서만 지원되는 결제 수단은 해당 결제 제공자가 그 웹사이트를 방문하는 사용자의 IP 주소를 알아낼 수 있게 할 수 있다.

이를 완화하는 한 가지 방법은 사용자가 설치했거나 명시적으로 관심을 표현한 결제 앱에 대해서만 매니페스트를 가져오는 것이다. 이는 사용자의 IP 주소를 해당 당사자들과만 공유하도록 위험을 제한한다.

w3c/payment-method-manifest/11결제 수단 매니페스트 세계에서 결제 앱 매칭과 보안

5. IANA 고려사항

이 등록은 커뮤니티 검토를 위한 것이며, 검토, 승인, 그리고 IANA 등록을 위해 IESG에 제출될 것이다.

관계 이름

payment-method-manifest

설명

Web Payments 생태계 안의 특정 결제 수단을 설명하는 결제 수단 매니페스트로 연결한다.

참조

https://w3c.github.io/payment-method-manifest/

참고

이러한 링크가 가져와질 것으로 예상되는 구체적인 방식은 §3.3 결제 수단 매니페스트 가져오기를, 그것들이 사용되는 더 큰 맥락은 §3.2 결제 수단 매니페스트 수집을 참조한다.

감사의 말

§3 처리 모델은 Rouslan Solomakhin이 원래 개요를 작성한 알고리즘에 크게 기반한다.

색인

이 명세에서 정의하는 용어

참조로 정의된 용어

참고문헌

규범 참고문헌

[APPMANIFEST]
Marcos Caceres; et al. Web App Manifest. URL: https://w3c.github.io/manifest/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.github.io/ecma262/
[ENCODING]
Anne van Kesteren. Encoding Standard. Living Standard. URL: https://encoding.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PAYMENT-METHOD-ID]
Adrian Bateman; et al. Payment Method Identifiers. URL: https://w3c.github.io/payment-method-id/
[PAYMENT-REQUEST]
Adrian Bateman; et al. Payment Request API. URL: https://w3c.github.io/payment-request/
[PROMISES-GUIDE]
Domenic Denicola. Writing Promise-Using Specifications. 2016년 2월 16일. W3C TAG Finding. URL: https://www.w3.org/2001/tag/doc/promises-guide
[RFC8288]
M. Nottingham. Web Linking. 2017년 10월. Proposed Standard. URL: https://tools.ietf.org/html/rfc8288
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/

정보 참고문헌

[PAYMENT-HANDLER]
Adrian Hope-Bailie; et al. Payment Handler API. URL: https://w3c.github.io/payment-handler/