セキュアペイメント確認

W3C 候補勧告ドラフト,

本書についての詳細
このバージョン:
https://www.w3.org/TR/2026/CRD-secure-payment-confirmation-20260319/
最新公開バージョン:
https://www.w3.org/TR/secure-payment-confirmation/
編集者ドラフト:
https://w3c.github.io/secure-payment-confirmation/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/secure-payment-confirmation/
実装レポート:
https://wpt.fyi/results/secure-payment-confirmation
フィードバック:
GitHub
仕様内
編集者:
(Google)
元編集者:
(Google)
協力者:
Ian Jacobs (W3C)
Nick Burris (Google)
Darwin Yang (Google)
テストスイート:
https://wpt.fyi/results/secure-payment-confirmation/

概要

Secure Payment Confirmation (SPC) は、決済取引中の認証を簡略化するための Web API です。これは、認証を加盟店間で拡張し、幅広い認証プロトコルで利用でき、利用者が取引内容を確認したという暗号学的な証拠を生成するよう設計されています。

本書のステータス

このセクションは、本書が公開された時点でのステータスについて説明しています。現在の W3C 公開文書の一覧および本技術レポートの最新版は W3C 標準およびドラフト一覧 でご覧いただけます。

本書は Web Payments ワーキンググループ勧告プロセスに従い、候補勧告ドラフト (Candidate Recommendation Draft) として公開したものです。

前回の候補勧告スナップショット以降の変更点については GitHub 変更履歴 をご参照ください。

候補勧告として公開されたことは、W3C およびそのメンバーによる支持を意味するものではありません。候補勧告ドラフトは、前回の候補勧告からワーキンググループが次回の候補勧告スナップショットに含める予定の変更点を反映しています。

本書はドラフト文書であり、今後随時更新・差替・廃止される可能性があります。作業中の文書以外として引用するのは不適切です。

本仕様が勧告案(Proposed Recommendation)へ進むためには、ユーザーエージェントで 2 つ以上の独立した相互運用可能な実装が必要です。詳細は 実装レポートをご覧ください。

この候補勧告は 2023年8月1日より前に勧告案へ進むことは想定されていません。

Web Payments ワーキンググループは 課題一覧を管理しています。

候補勧告として公開されたことは、W3C およびそのメンバーによる支持を意味するものではありません。候補勧告ドラフトは、前回の候補勧告からワーキンググループが次回の候補勧告スナップショットに含める予定の変更点を反映しています。

本書は W3C 特許ポリシーに基づき活動するグループによって作成されました。W3C はグループの成果物に関して行われた特許の 公開開示一覧を管理しています。そのページには特許の開示方法も記載されています。対象特許に関する実際の知識を有する者は 必要クレームを含むと認識した場合、W3C 特許ポリシー第 6 項に従い情報を開示する必要があります。

本書は 2025年8月18日版 W3C プロセス文書 に準拠しています。

1. はじめに

このセクションとそのサブセクションは規範的ではありません。

本仕様は、ウェブ上の決済フローで強力な認証方法を利用可能にするAPIを定義します。[webauthn-3]と同様の認証利点およびユーザープライバシー重視を提供しつつ、決済処理のニーズに対応する強化を目指しています。

同様に[webauthn-3]と、本仕様はユーザーが関与する2つのプロセスを定義します。1つ目は§ 3 登録(以前の「登録」)で、ユーザーとRelying Partyとの関係を構築します。2つ目は§ 4 認証 - 安全な決済確認の決済方法で、Relying Party(場合によっては仲介決済サービスプロバイダー経由)からのチャレンジに、ユーザーが特定の決済に同意するために応答します。

本仕様の目的には、チェックアウト時の認証の摩擦を減らすことがあり、その一側面は、ユーザーが1回の登録で可能な認証回数を最大化することです。つまり、Relying Partyの同意があれば、理想的にはユーザーが「一度登録」すれば、初回登録した加盟店のオリジンだけでなく、他の加盟店オリジン(および決済サービスプロバイダー経由)でも認証できるようにすることです。

そのため、安全な決済確認の重要な機能は、加盟店(または他の事業体)がRelying Partyの代理で認証セレモニーを開始できることです。Relying Partyは認証情報作成時に、この動作を許可するようオプトインする必要があります。

機能面では、本仕様はPaymentRequest APIの新しい決済方法を定義し、WebAuthn拡張を追加して[webauthn-3]を決済向けデータ構造、デバイスバインディング、および決済コンテキストでAPI呼び出しを可能にするための仮定の緩和で拡張します。

1.1. ユースケース

[webauthn-3]はウェブ全体向けの一般的な認証機能を提供しますが、本仕様で定義した決済向け拡張の価値を示す以下のユースケースがあります。

オンライン取引で暗号技術に基づく認証の一般的なユースケースが確立されていると仮定します。

1.1.1. 取引確定の暗号証拠

多くのオンライン決済システムでは、支払い手段を発行する事業体(例:銀行)が認証を通じて不正利用を抑止しようとします。[webauthn-3]や本仕様により、認証器で加盟店オリジンや取引金額・通貨など重要な決済情報を暗号署名できるようになります。銀行はRelying Partyとして、署名付与された決済情報を決済承認判断時に検証できます。

銀行がプレーンな[webauthn-3]を利用する場合、検証対象の決済情報はWebAuthnのchallengeに格納する必要があります。これにはいくつかの課題があります:

  1. challengeフィールドの誤用となる(本来リプレイ攻撃防止用)。

  2. 仕様が存在せず、各銀行が独自の決済情報フォーマットやchallengeへのエンコード方法を考案する必要があり、導入の複雑化や断片化を招く。

  3. 規制要件でユーザーへの決済情報表示や同意記録が必要とされる場合があり、プレーンな[webauthn-3]ではchallenge利用に表示指定UXがなく対応できない。

これらの限界は次の安全な決済確認の振る舞いを動機付けています:

  1. プレーン[webauthn-3]と同様、challengeフィールドはリプレイ攻撃防止のみに使用する。

  2. SPCで決済情報のフォーマットを規定する。これにより汎用的な検証コードやテスト群の開発が可能となる。

  3. SPCにより、ユーザーエージェントが決済情報を必ずユーザーに提示したこと、および悪意あるウェブサイトや信頼されたサイト上の悪意あるJavaScriptコードによる迂回ができないことを保証する。

    • 決済情報はCollectedClientData辞書に格納され、JavaScriptで改ざんできません。

    注: 今日、ブラウザ経由のweb決済は、TLSやiframe等ウェブ機能で十分信頼されており、現行仕様はweb決済の安全性と利便性向上を目的としています。

1.1.2. 加盟店による認証管理

加盟店はチェックアウト時のユーザー離脱を避け、特に認証摩擦の軽減を目指します。Relying Party(例:銀行)が[webauthn-3]による認証を利用する際、iframe内で実行するのが一般的です。しかし加盟店は、Relying Partyによる認証結果の検証は維持しつつ、認証体験の管理を望んでいます。

この制限を踏まえ、安全な決済確認では次の振る舞いを導入します:

この機能の追加的な利点として、Relying Partyは独自の認証フロント体験を構築せずともよくなり、支払いサービスプロバイダーが加盟店のために体験構築を担う見込みです。

注: 認証体験をRelying Partyが提供したい場合、iframe経由でSPCから依然として可能です。

1.1.3. デバイスバインディングの暗号証拠

決済業界では、デバイス所有の証跡が第2要素として重要な役割を持ちます。WebAuthnでは、1つの認証情報が複数デバイスで利用可能な同期パスキーを許容しています(Web Authentication § 1.2.1 Consumer with Multi-Device Credentials)。同期はログイン用途のユーザー体験向上に役立ちますが、同期パスキーのみでは一部規制環境で求められるデバイス所有要件を満たさない懸念があります。

この懸念に対応するため、ユーザーエージェントがユーザーによって作成し、秘密鍵が1台のデバイスにのみ存在(使用)する補助的な公開・秘密鍵ペアの導入を検討します。この鍵とSPCにおけるその利用をブラウザバウンドキーと呼びます。

1.2. API利用シナリオ例

このセクションでは、安全な決済確認のシナリオと本APIの利用サンプルコード例を紹介します。なお、これらは利用例であり、API活用範囲を制限するものではありません。

1.2.1. チェックアウト時の登録

これは初回フローで、新規認証情報が発行銀行によって加盟店のチェックアウト時に作成・保存されます。

  1. ユーザーはmerchant.exampleにアクセスし、購入商品を選択した後、チェックアウトフローに進みます。支払い手段情報を入力し、支払い意思(例: 「支払う」ボタン押下)を示します。

  2. 加盟店は支払い手段発行銀行と帯域外通信(例:他のプロトコル)でやり取りし、銀行はユーザーの認証を要求し、加盟店に銀行制御のURLをiframeで開くよう提供します。

  3. 加盟店はbank.exampleへのiframeをallow属性"publickey-credentials-create"付きで開きます。

  4. 銀行iframe内で、銀行は従来方式(例: SMS・OTP)でユーザー本人性を確認後、SPC認証への登録をユーザーに勧めます。

  5. ユーザーは銀行UXの「登録」ボタンなどで同意し、銀行はiframe内で下記例のコードを実行します。

  6. ユーザーはWebAuthn登録フローを経て、新規認証情報を銀行へ返送。銀行はその認証情報を自サーバ側DBにユーザー・支払い手段に紐付け保存します。

  7. 認証終了後、銀行iframeは閉じ、加盟店はユーザーのチェックアウト処理を完了します。

この方法でユーザー登録するサンプルコード:

if (!window.PublicKeyCredential) { /* クライアント非対応。エラー処理。 */ }

const publicKey = {
  // challengeは銀行サーバーが生成しiframeに送る必要あり。
  challenge: new Uint8Array([21,31,105 /* サーバーが生成した他の29バイト乱数 */]),

  // Relying Party:
  rp: {
    name: "Fancy Bank",
  },

  // User:
  user: {
    // WebAuthn部分。SPCには必須ではないが銀行サーバーは今後取引でユーザー識別に使うことがある。
    // 同じユーザーで値が不整合だと複数認証情報作成=選択UX摩擦の原因。
    id: Uint8Array.from(window.atob("MIIBkzCCATigAwIBAjCCAZMwggE4oAMCAQIwggGTMII="), c=>c.charCodeAt(0)),
    name: "jane.doe@email.example",
    displayName: "Jane Doe",
  },

  // この例ではRPはES256またはRS256認証情報を受け入れ、ES256を優先。
  pubKeyCredParams: [
    {
      type: "public-key",
      alg: -7 // "ES256"
    },
    {
      type: "public-key",
      alg: -257 // "RS256"
    }
  ],

  authenticatorSelection: {
    userVerification: "required",
    residentKey: "required",
    authenticatorAttachment: "platform",
  },

  timeout: 360000,  // 6分間

  // SPC認証情報であることを示す。現状これが必要で、SPC関係であることをブラウザが認識する。他、クロスオリジンiframeで認証情報作成対応可。例で必須。
  //
  // 将来仕様で本拡張不要となる可能性あり。
  extensions: {
    "payment": {
      isPayment: true,
      // 許可アルゴリズムリスト(任意)。未指定・空時はpubKeyCredparamsのデフォルト(ES256, RS256)。この例はRS256優先、両方許可。
      browserBoundPubKeyCredParams: [
        {
          type: "public-key",
          alg: -257 // "RS256"
        },
        {
          type: "public-key",
          alg: -7 // "ES256"
        }
      ]
    }
  }
};

// 注意:この呼び出しで認証器がUI表示を行う。
navigator.credentials.create({ publicKey })
  .then(function (newCredentialInfo) {
    // 新しい認証情報をサーバーへ送信し、検証・登録する。
  }).catch(function (err) {
    // 認証器未対応/同意拒否。適切に対処。
  });

1.2.2. 加盟店サイトでの認証

これは、すでに認証情報が登録されているユーザーが取引を行う際に、発行銀行と加盟店が安全な決済確認(SPC)を利用する場合のフローです。

  1. ユーザーはmerchant.exampleにアクセスし、商品を選択してチェックアウトフローに進みます。支払い手段情報を入力し、支払い意思(例:「支払う」ボタン押下)を示します。

  2. 加盟店は支払い手段の発行銀行と帯域外通信(例:他のプロトコル)でやり取りします。発行銀行はユーザーの認証を要求し、同時に加盟店へSPC対応を伝え、API利用に必要な情報(チャレンジや当該ユーザー・支払い手段に関連付けられた認証情報ID群等)を提供します。

  3. 加盟店は以下のサンプルコードを実行します。

  4. ユーザーはSPC UXで表示される決済情報に同意し、続けてWebAuthn認証セレモニーを実施します。署名済み暗号文が加盟店に返送されます(AuthenticationExtensionsPaymentOutputsでブラウザバウンドキーの出力も含まれる)。

  5. 加盟店は署名済み暗号文を発行銀行へ帯域外で送付します。発行銀行は暗号文を検証し、ユーザーが有効であること、どんな決済情報を表示したか、取引へ同意したかを把握します。発行銀行は取引を承認し、加盟店はユーザーのチェックアウト処理を終えます。発行銀行はブラウザバウンドキーの公開鍵、 browserBoundPublicKeyを保存します。

ユーザー認証用サンプルコードは以下です。コードはasync/await構文で、Promiseの扱いが読みやすくなっています。

/* securePaymentConfirmationAvailability はブラウザがSPC対応か示すが、現デバイスに認証情報があるかは示さない */
const spcAvailable =
  PaymentRequest &&
  PaymentRequest.securePaymentConfirmationAvailability &&
  (await PaymentRequest.securePaymentConfirmationAvailability()) === 'available';
if (!spcAvailable) {
  /* ブラウザがSPC非対応の場合は、加盟店は従来フローへフォールバックする */
}

const request = new PaymentRequest([{
  supportedMethods: "secure-payment-confirmation",
  data: {
    // 銀行から取得した認証情報IDリスト
    credentialIds,

    rpId: "fancybank.example",

    // challengeも銀行から取得
    challenge: new Uint8Array([21,31,105 /* 銀行が生成した他29バイト乱数 */]),

    instrument: {
      displayName: "FancyBank Platinum Card",
      details: "****1234 | 01/29",
      icon: "https://fancybank.example/card-art.png",
    },

    payeeName: "Merchant Shop",

    payeeOrigin: "https://merchant.example",

    paymentEntitiesLogos: [
      {
        url: "https://fancybank.example/logo.png",
        label: "Fancy Bank",
      },
      {
        url: "https://securenetwork.example/logo.png",
        label: "Secure Network",
      },
    ],

    // 呼び出し側が希望するローカライズ体験
    locale: ["en"],

    timeout: 360000,  // 6分

    // 許可アルゴリズムリスト。デフォルトはES256, RS256。例ではES256優先・両方許容。
    // ブラウザバウンドキーが既に存在する場合は作成されず、このリストは新規作成時のみ利用。
    browserBoundPubKeyCredParams: [
      {
        type: "public-key",
        alg: -7 // "ES256"
      },
      {
        type: "public-key",
        alg: -257 // "RS256"
      }
    ]
  }], {
    total: {
      label: "合計",
      amount: {
        currency: "USD",
        value: "5.00",
      },
    },
  });

try {
  const response = await request.show();
  await response.complete('success');

  // response.dataはPublicKeyCredential型で、発行銀行が検証するための取引データを含むclientDataJSONを持つ。

  /* response.dataを発行銀行へ送って検証する */
} catch (err) {
  /* SPC利用不可なら従来フローへフォールバック */
}

2. 用語

SPC 認証情報

本仕様で定義される振る舞いで利用可能なWebAuthn認証情報

本仕様は、SPC認証情報が他の認証フロー(例:ログイン)においてRelying Partyにどのように使用・未使用されるかの制限意図はありません。

注: 現仕様では、Relying Partyが認証情報をファーストパーティまたはサードパーティの文脈で使用するため明示的にオプトインする必要があります。今後はすべてのWebAuthn認証情報がファーストパーティ文脈(例:Relying Partyドメイン)でSPC利用可能となり、オプトイン要件はサードパーティ利用時のみとなる方向です。

サードパーティ対応SPC認証情報

SPC認証情報のうち、Relying Partyが認証情報作成時に明示的にオプトインしたことで、Relying Party以外が安全な決済確認認証に利用できるもの。

SPC認証情報がサードパーティ対応かサイレント判定する手順

ユーザーエージェントがRelying Party Identifierおよび認証情報IDを与えられたときに、当該認証情報IDで表現される認証情報がサードパーティ対応SPC認証情報かどうか、ユーザー操作なしに(サイレントに)判定する未定義処理。

注: WebAuthn issue 1667参照。

認証情報が現デバイスで利用可能かサイレント判定する手順

ユーザーエージェントがRelying Party Identifierおよび認証情報IDを与えられたときに、当該認証情報IDで表現される認証情報が現デバイスで利用可能(すなわちWebAuthn Get 呼び出しで成功利用し得る)か、ユーザー操作なしに(サイレントに)判定する未定義処理。

これによりユーザーエージェントは、取引UXをユーザーへ条件付き表示することができます(=成功見込みがある場合のみ提示)。

注: このプロパティ実現にはSPC認証情報発見可能認証情報である必要があり、現仕様ではそれを要件として明記しています。

注: このプロパティはWebAuthn Conditional UI Proposalが要件とするものに非常に類似しており、両者とSPCが共通の基盤APIでサポート可能になる見込みです。

ブラウザバウンドキー

WebAuthn認証情報に加え、取引詳細にも署名できるユーザーエージェントが単一デバイスに紐付けた公開・秘密鍵ペア

鍵ペア

鍵ペアは、構造体であり、公開鍵秘密鍵で構成され、実装定義型です。

注: 公開鍵秘密鍵は暗号アルゴリズムごとのパラメータで、該当するのはIANA COSE Algorithmsレジストリ [IANA-COSE-ALGS-REG]にある暗号アルゴリズムです。

注: 公開鍵は登録時に CollectedClientAdditionalPaymentRegistrationData.browserBoundPublicKey で、決済認証時には CollectedClientAdditionalPaymentData.browserBoundPublicKey で返されます。

注: 秘密鍵BrowserBoundSignature.signature で署名作成に使われます。ユーザーエージェントは秘密鍵を輸出せず、デバイスのセキュア・エレメントに保管する場合があります。

3. 登録

ユーザーを安全な決済確認(SPC)に登録するには、Relying Partyは navigator.credentials.create()payment WebAuthn拡張 を指定して呼び出すべきです。

テスト

注: 本仕様では、ブラウザがSPC認証情報IDをキャッシュできるようWebAuthn Conditional UI未対応時に拡張機能を定義しています。将来WebAuthnでこの機能が導入されれば、SPCから拡張要件を削除する可能性があります。SPC認証情報(拡張付き)はその他は完全なWebAuthn認証情報です。

注: 登録時、Web Authenticationでは両方 namedisplayName が必須ですが、userメンバーの定義により、その後の認証時に両方を表示する必要はありません。2023年10月時点では name の方が一貫して表示されます。開発者は各実装の動向に注意してください。

4. 認証 - セキュアペイメント確認決済方式

セキュアペイメント確認を通じて決済を認証するために、本仕様は以下を定義します:

  1. 決済ハンドラー、すなわちセキュアペイメント確認決済ハンドラー、与えられた決済の認証要求を処理します。

  2. 本決済ハンドラーのための標準化済み決済方式識別子である "secure-payment-confirmation"。

セキュアペイメント確認決済ハンドラーはユーザーと取引内容を確認した後、認証セレモニーを行い、ユーザーの認証とセレモニーを表す署名付きblobを作成します。

概念的には、セキュアペイメント確認の認証は[webauthn-3]と似ていますが、主要な転換点があります。セキュアペイメント確認は、第三者(例:加盟店)がRelying Partyの代理で認証セレモニーを呼び出し、Relying Partyから他のチャネルで取得した認証情報を渡すことを許可します。§ 1.1.2 加盟店による認証管理参照。

4.1. [payment-method-id]への登録

標準化済み決済方式のレジストリに次を追加します([payment-method-id]):

"secure-payment-confirmation"

Secure Payment Confirmation仕様。

4.2. Payment Requestコンストラクタの変更

PaymentRequestオブジェクトのコンストラクタの手順で、新たなステップを4.3の後に追加:

  1. 決済方式の処理:[サブステップ1-3省略]

    1. seenPMIsに"secure-payment-confirmation"が含まれ、かつseenPMIsのサイズが1を超える場合、RangeErrorをthrowする。

4.3. ユーザーアクティベーション要件の変更

PaymentRequest.show() メソッドの手順で、ステップ2と3を修正:

  1. 関連グローバルオブジェクトrequest のもので、一時的アクティベーション(transient activation)がない場合、ユーザーエージェントは次を実施可能:

    1. 拒否されたPromiseを返すが、その理由は"SecurityError" DOMException

  2. そうでなければ、ユーザーアクティベーションの消費関連グローバルオブジェクトで行う。

注: これにより、ユーザーエージェントはユーザーアクティベーション不要となり、例えばリダイレクト認証フローでリダイレクト時点にアクティベーションがなくても対応できる。セキュリティ面は§ 11.4 ユーザーアクティベーション要件の欠如参照。

4.4. SecurePaymentConfirmationRequest 辞書型

dictionary SecurePaymentConfirmationRequest {
    required BufferSource challenge;
    required USVString rpId;
    required sequence<BufferSource> credentialIds;
    required PaymentCredentialInstrument instrument;
    unsigned long timeout;
    USVString payeeName;
    USVString payeeOrigin;
    sequence<> paymentEntitiesLogos;
    AuthenticationExtensionsClientInputs extensions;
    sequence<PublicKeyCredentialParameters> browserBoundPubKeyCredParams;
    sequence<USVString> locale;
    boolean showOptOut;
};

SecurePaymentConfirmationRequest 辞書型は以下のメンバーを持ちます:

challenge

リプレイ攻撃防止のため、Relying Partyがサーバ側で生成する乱数チャレンジ。

rpId

認証情報のRelying Party識別子

credentialIds

与えられた支払い手段の認証情報IDリスト。

instrument

登録画面表示や取引詳細署名時に利用する手段の名称とアイコンの説明。

timeout

取引詳細署名要求のタイムアウトまでのミリ秒数。最大1時間。デフォルト値・許可範囲はユーザーエージェントが決定。Web Authenticationは追加タイムアウト指針あり。

payeeName

本SPC呼び出し対象の受取人(加盟店等)の表示名。任意。payeeOriginと併用・代用可能。

payeeOrigin

本SPC呼び出し対象受取人(加盟店等)のオリジン。任意。payeeNameと併用・代用可能。

paymentEntitiesLogos

本SPC呼び出しで支払いを仲介する事業体ロゴの任意リスト(表示優先度降順)。ユーザーエージェントは一部またはすべてのロゴを必須表示ではない。§ 4.9 支払い可能か確認手順参照。

注: ロゴ表示方法は仕様で厳密規定せず、ユーザーエージェントの裁量に委ねます。ロゴ順序は重要なため、開発者は表示結果で順番調整可能。

extensions

渡す認証情報に利用する任意のWebAuthn拡張。呼び出し元は payment拡張指定不要、 自動追加される。

browserBoundPubKeyCredParams

ブラウザバウンドキー用暗号アルゴリズム種類の許可リスト。

注: このメンバーはブラウザバウンドキーを新規作成時のみ利用されます。

locale

言語タグ([BCP47]参照)優先度降順リスト(任意)。ウェブサイトの言語ロケール 優先リスト language priority list [RFC4647]。ユーザーエージェントはこれをもとに言語ネゴシエーションや書式化に利用可能。

showOptOut

取引確認UXでユーザーにオプトアウト機会を与えるかどうか。任意。デフォルトはfalse。

4.5. 決済方式の追加データ型

本決済方式の追加データ型SecurePaymentConfirmationRequestです。

4.6. セキュアペイメント確認の利用可能性判定API

PaymentRequest に静的APIが追加され、開発者がセキュアペイメント確認利用可否を簡易判定できるようになります。securePaymentConfirmationAvailability() メソッドはenumのメンバーを返し、セキュアペイメント確認が利用可能か、不可能な場合はその理由を示します。enum出力を用いることで、開発者はユーザーへ認証オプション案内で適切な誘導・通知がしやすくなります。

enum SecurePaymentConfirmationAvailability {
  "available",
  "unavailable-unknown-reason",
  "unavailable-feature-not-enabled",
  "unavailable-no-permission-policy",
  "unavailable-no-user-verifying-platform-authenticator",
};

partial interface PaymentRequest {
    static Promise<SecurePaymentConfirmationAvailability> securePaymentConfirmationAvailability();
};

SecurePaymentConfirmationAvailability enumは以下のメンバーを持ちます:

available

ユーザーエージェントが呼び出し元フレーム内でセキュアペイメント確認API利用可と判断したことを示す。

注: この結果は、特定SPC認証情報が現時点で利用可能か否かは示しません。

unavailable-unknown-reason

呼び出し元フレームでセキュアペイメント確認API利用不可(理由不明)。ユーザーエージェントはより具体的な理由よりも、本結果を常に返すことがある(ユーザープライバシー保護のため)。

unavailable-feature-not-enabled

呼び出し元フレームでセキュアペイメント確認API利用不可(機能未有効)。

unavailable-no-permission-policy

呼び出し元フレームでセキュアペイメント確認API利用不可("payment"パーミッションポリシー未付与)。

unavailable-no-user-verifying-platform-authenticator

呼び出し元フレームでセキュアペイメント確認API利用不可(ユーザー認証可能プラットフォーム認証器未利用可能)。

注: この情報はisUserVerifyingPlatformAuthenticatorAvailable でも取得可能だが、開発者利便性のため本APIにも含む。

securePaymentConfirmationAvailability() を与えられたDocument documentで呼び出した場合、ユーザーエージェントは以下の手順を実施する。必要に応じてユーザープライバシー保護やユーザーエージェント固有理由で "unavailable-unknown-reason" を返しても良い。

  1. ユーザーエージェントがセキュアペイメント確認非対応、または対応だがユーザーエージェント固有の仕組みで機能無効の場合、 "unavailable-feature-not-enabled" を返す。

  2. documentで"payment"パーミッションポリシーが未有効なら、 "unavailable-no-permission-policy" を返す。

  3. ユーザー認証可能プラットフォーム認証器がない場合、 "unavailable-no-user-verifying-platform-authenticator" を返す。

  4. 他にセキュアペイメント確認機能が稼働しない理由あれば、 "unavailable-unknown-reason"を返す。

  5. "available"を返す。

このAPIは、SPCフロー開始前に下記のような可否判定チェックを行うのに利用できます:

const spcAvailable =
    PaymentRequest &&
    PaymentRequest.securePaymentConfirmationAvailability &&
    await PaymentRequest.securePaymentConfirmationAvailability() === 'available';

注: SPC機能検出には、staticなsecurePaymentConfirmationAvailability を推奨し、すでに構築済みPaymentRequestオブジェクトのcanMakePayment は利用すべきではありません。

注: 本APIのプライバシー考慮は§ 12.5 securePaymentConfirmationAvailabilityによるフィンガープリンティング参照。

4.7. Secure Payment Confirmation 機能の利用可能性

Secure Payment Confirmation の機能の利用可能性を開発者が判定できるようにするため、PaymentRequest に静的 API が追加される。このメソッド getSecurePaymentConfirmationCapabilities() は、機能キーから Boolean 値へのレコードを返す。

partial interface PaymentRequest {
    static Promise<SecurePaymentConfirmationCapabilities> getSecurePaymentConfirmationCapabilities();
};

typedef record<DOMString, boolean> SecurePaymentConfirmationCapabilities;

SecurePaymentConfirmationCapabilities の中のキーは、辞書式昇順にソートされていなければならない (MUST)。キーの集合には、SecurePaymentConfirmationCapability列挙値の集合が含まれているべきである (SHOULD)。ただしユーザーエージェントは、必要と判断したキーを省略してもよい (MAY)。詳細は § 12.6 getSecurePaymentConfirmationCapabilities によるフィンガープリント を参照。

ある機能に対する値が true の場合、その機能は、このユーザーエージェントの Secure Payment Confirmation 実装において現在サポートされていることが分かっている。

ある機能に対する値が false の場合、その機能は、このユーザーエージェントの Secure Payment Confirmation 実装において現在サポートされていないことが分かっている。

ある機能がキーとして存在しない場合、その機能のサポート状況は、このユーザーエージェントの Secure Payment Confirmation 実装において不明である。

この API により、開発者は Secure Payment Confirmation フローを開始するかどうか判断する際に、特定の機能がサポートされているかを次のように確認できる。

if (PaymentRequest && PaymentRequest.getSecurePaymentConfirmationCapabilities) {
    const capabilities = await PaymentRequest.getSecurePaymentConfirmationCapabilities();
    if (capabilities.browserBoundKeyHardware) {
        // When the SPC API is used, hardware backed BBKs will be available.
    }
}

Note: この API に関するプライバシー上の考慮事項については、 § 12.6 getSecurePaymentConfirmationCapabilities によるフィンガープリント を参照のこと。

4.7.1. SecurePaymentConfirmationCapability 列挙型

enum SecurePaymentConfirmationCapability {
  "browserBoundKeyHardware",
};

この列挙型は、開発者が評価してユーザーに特定のワークフローや体験を提供できる、限定された Secure Payment Confirmation 機能の集合を定義する。

browserBoundKeyHardware

Secure Payment Confirmation API が、デバイス上のハードウェアセキュアエレメントに保存された ブラウザバウンドキー を利用できることを示す。

詳細は § 6 Browser Bound Key Store を参照。

4.8. 支払方法データを検証する手順

この支払方法に対する、入力 PaymentRequest requestSecurePaymentConfirmationRequest data支払方法データを検証する手順は次のとおりである。

Tests
  1. もし data["credentialIds"] が空であれば、 RangeError を投げる。

  2. data["credentialIds"] 内の各 id について:

    1. もし id が空であれば、 RangeError を投げる。

  3. もし data["challenge"] が null または空であれば、 TypeError を投げる。

  4. もし data["instrument"]["displayName"] が空であれば、 TypeError を投げる。

  5. もし data["instrument"]["icon"] が空であれば、 TypeError を投げる。

  6. data["instrument"]["icon"] について URL パーサーを実行する。 これが失敗を返したなら、 TypeError を投げる。

  7. もし data["instrument"]["details"] が存在していて空であるなら、 TypeError を投げる。

  8. もし data["rpId"] が有効なドメインでないなら、 TypeError を投げる。

  9. もし data["payeeName"] と data["payeeOrigin"] の両方が省略されているなら、 TypeError を投げる。

  10. もし data["payeeName"] または data["payeeOrigin"] のいずれかが存在していて空であるなら、 TypeError を投げる。

  11. もし data["payeeOrigin"] が存在するなら:

    1. parsedURL を、data["payeeOrigin"] に対して URL パーサーを実行した結果とする。

    2. もし parsedURL が failure であれば、 TypeError を投げる。

    3. もし parsedURLscheme が "https" でなければ、 TypeError を投げる。

  12. もし data["paymentEntitiesLogos"] が存在しかつ空でないなら:

    1. data["paymentEntitiesLogos"] 内の各 logo について:

      1. もし logo["url"] が空であれば、 TypeError を投げる。

      2. logo["url"] について URL パーサーを実行する。 これが失敗を返したら、 TypeError を投げる。

      3. もし logo["label"] が空であれば、 TypeError を投げる。

  13. もし data["locale"] が存在しかつ 空でないなら

    1. data["locale"] 内の各 tag について:

      1. もし tag が、正しい形式の [BCP47] 言語タグでなければ、 TypeError を投げる。

    NOTE: locale は、特定の入力メンバーに結び付いた言語や方向のメタデータとは異なり、特定の文字列値についての主張ではなく、呼び出し元が要求するローカライズされた体験を表す。 さらなる議論については § 14 Internationalization Considerations を参照。

4.9. 支払いが可能かどうかを確認する手順

この支払方法に対する、入力 SecurePaymentConfirmationRequest data に関する 支払いが可能かどうかを確認する手順は次のとおりである。

Tests
  1. もし data["payeeOrigin"] が存在するなら:

    1. parsedURL を、data["payeeOrigin"] に対して URL パーサーを実行した結果とする。

    2. parsedURL が failure ではないことをアサートする。

    3. parsedURLscheme が "https" であることをアサートする。

    NOTE: これらの前提条件は、以前に 支払方法データを検証する手順 の中でチェックされている。

    1. data["payeeOrigin"] を、parsedURLoriginシリアライズ結果に設定する。

  2. icon について、«["src" → data["instrument"]["icon"]]» を image に渡して、画像リソースを取得する。これが失敗した場合:

    1. もし data["instrument"]["iconMustBeShown"] が true なら、false を返す。

    2. それ以外の場合、data["instrument"]["icon"] を空文字列に設定する。

      Note: これにより、出力の instrument の icon 文字列が空であるため、RP は指定されたアイコンが表示されなかったことを認識できる。

    Note: 資格情報が一致するかどうかにかかわらず、アイコンの画像リソースは取得されなければならない。 これは資格情報 ID の存在をプローブする試みを防ぐためである。

  3. オプションとして、ユーザーエージェントは data["paymentEntitiesLogos"] から、リストの末尾から先頭へ向かう形でエントリを削除してもよい。

    Note: これにより、ユーザーエージェントは表示するロゴの数を制御できる一方で、ロゴが呼び出し元にとっての表示優先度の降順であるという意味付けは保たれる。

  4. data["paymentEntitiesLogos"] 内の各 logo について:

    1. logo について、«["src" → logo["url"]]» を image に渡して画像リソースを取得し、結果をデコードする。

    2. 取得またはデコードのいずれかが失敗した場合、logo["url"] を空文字列に設定する。

      Note: これにより、出力の paymentEntitiesLogos シーケンスの該当ロゴについて url 文字列が空になるため、RP は指定されたロゴが表示されなかったことを認識できる。

    Note: 資格情報が一致するかどうかにかかわらず、ロゴの画像リソースは取得されなければならない。 これは資格情報 ID の存在をプローブする試みを防ぐためである。

  5. data["credentialIds"] 内の各 id について:

    1. data["rpId"] と id を引数として、 現在のデバイスで利用可能な資格情報かをサイレントに判定する手順 を実行する。 結果が false なら、data["credentialIds"] から id を削除する。

    2. もし data["rpId"] が、request関連設定オブジェクトオリジンではないなら、 data["rpId"] と id を引数として、 SPC 資格情報がサードパーティ利用可能かをサイレントに判定する手順 を実行する。結果が false なら、data["credentialIds"] から id を削除する。

  6. true を返す。

4.10. 取引確認 UX の表示

PaymentRequest.show() が呼び出され、(そのアルゴリズムの手順 19–24 において)Secure Payment Confirmation 支払ハンドラー が選択されたとき、ユーザーエージェントは、 先に進むかどうか、どのように進みたいかをユーザーが選択できるユーザーインターフェースを提示しなければならない (MUST)。

4.10.1. ユーザーに提示される情報

ユーザーエージェントの実装選択を制限しないように、この仕様は特定のユーザーインターフェースの表示を要求しない。 しかし、Relying PartyCollectedClientPaymentData に含まれる情報を信頼できるようにするため、 ユーザーエ���ジェントは、以下の内容がユーザーに伝えられ、かつ認証に対するユーザーの同意が収集されることを保証しなければならない (MUST)。

ユーザーエージェントは、存在する場合、 locale の情報を利用して、Web サイトのものと一致する言語およびロケールに基づく書式でローカライズされた UX を表示してもよい。

もし showOptOuttrue なら、ユーザーエージェントは、ユーザーが given relying party に対するこの処理からオプトアウトしたいことを示す機会を与えなければならない (MUST)。

Tests

4.10.2. 取引確認 UX の結果

ユーザーエージェントは、先に進むかどうか、およびどのように進むかについて、ユーザーが次のいずれかの選択肢を示せるようにしなければならない (MUST)。

ユーザーが支払いを続行したく、認証に SPC Credential を使用したい場合

ユーザーが操作している PaymentRequest に対して、 ユーザーが支払リクエストを受諾するアルゴリズム を実行する。

ユーザーが支払いを続行したいが、 data["credentialIds"] が空であるか、 SPC Credential を使用したくない場合

次の手順を実行する:

  1. data["credentialIds"] を空リストに設定する。

    Note: これにより、 PaymentRequest.show() のプロミスは "NotAllowedError" DOMException で拒否される。詳細は § 4.11 支払リクエストへの対応手順 を参照。

  2. ユーザーが操作している PaymentRequest に対して、 ユーザーが支払リクエストを受諾するアルゴリズム を実行する。

Tests
ユーザーが支払いを続行したくない場合

ユーザーが操作している PaymentRequest に対して、 ユーザーが支払リクエストを中止するアルゴリズム を実行する。

Note: これにより、 PaymentRequest.show() のプロミスは "AbortError" DOMException で拒否される。

ユーザーが given relying party に対するこの処理からオプトアウトしたい場合

"OptOutError" DOMExceptionPaymentRequest.show() を拒否する。 § 12.7 User opt out を参照。

Note: この選択肢は、 showOptOuttrue に設定されている場合にのみユーザーに提供されなければならない。

4.10.3. テスト自動化サポート

current transaction automation mode が "none" でない場合、ユーザーエージェントはまず、自身が自動化コンテキスト内にいることを検証するべきである (should) (WebDriver のセキュリティ上の考慮事項を参照)。その後、 ユーザーエージェントは上記の情報伝達およびユーザー同意の取得をバイパスし、代わりに current transaction automation mode の値に基づいて次のように振る舞うべきである。

"autoAccept"

ユーザーが取引の詳細を確認し、承認したかのように振る舞う。

"autoChooseToAuthAnotherWay"

ユーザーが取引の詳細を確認し、承認したが、認証に SPC Credential を使用したくないことも示したかのように振る舞う。 もし data["credentialIds"] が空であれば、これは "autoAccept" と同等である。

"autoReject"

ユーザーが取引の詳細を確認し、それを拒否した(つまり、取引を続行したくない)かのように振る舞う。

"autoOptOut"

ユーザーが取引の詳細を確認し、オプトアウトしたいことを示したかのように振る舞う。

4.11. 支払リクエストへの対応手順

この支払方法に対する、与えられた PaymentRequest request および SecurePaymentConfirmationRequest data に対する 支払リクエストへの対応手順は次のとおりである。

Note: これらの手順は、ユーザーが 取引確認 UX を受諾した場合にのみ実行される。 これらは ユーザーが支払リクエストを受諾するアルゴリズム から呼び出される。

  1. もし data["credentialIds"] が空であれば、 "NotAllowedError" DOMException を投げる。 これは、ユーザーが SPC を使用できない、または使用したくない場合における Authentication Ceremony Privacy を維持する。

    Note: ここで throw すると、 PaymentRequest.show() のプロミスは "NotAllowedError" DOMException で拒否される。

  2. topOrigin を、request関連設定オブジェクトトップレベルオリジンとする。

  3. payment を、新しい AuthenticationExtensionsPaymentInputs 辞書とし、そのフィールドを次のようにする:

    isPayment

    ブール値 true

    rpId

    data["rpId"]

    topOrigin

    topOrigin

    payeeName

    存在する場合は data["payeeName"]、 そうでなければ省略。

    payeeOrigin

    存在する場合は data["payeeOrigin"]、 そうでなければ省略。

    paymentEntitiesLogos

    存在しかつ空でない場合は data["paymentEntitiesLogos"]、 そうでなければ省略。

    この仕様の現行バージョンでは、PaymentEntityLogo ごとに 1 つの URL のみをサポートする。そのため、データ構造をそのままコピーして署名すれば、ユーザーに何が表示されたかを示すのに十分である。 将来のバージョンでは、たとえばダークモードのネイティブサポートのために、 PaymentEntityLogo ごとに複数の URL を追加するかもしれない。その場合、この仕様は、ある PaymentEntityLogo についてどの URL が表示されたかを Relying Party に示す必要がある。

    total

    request.[[details]]["total"]

    instrument

    data["instrument"]

    browserBoundPubKeyCredParams

    data["browserBoundPubKeyCredParams"]

  4. extensions を、新しい AuthenticationExtensionsClientInputs 辞書とし、その payment メンバーを payment に設定し、その他のメンバーを data["extensions"] から設定する。

  5. publicKeyOpts を、新しい PublicKeyCredentialRequestOptions 辞書とし、そのフィールドを次のようにする:

    challenge

    data["challenge"]

    timeout

    data["timeout"]

    rpId

    data["rpId"]

    userVerification

    required

    extensions

    extensions

    Note: このアルゴリズムは、 userVerification の値として "required" をハードコードしている。これは Chrome の初期実装がサポートする値であるためである。 現在の制限は将来的に変わる可能性がある。作業グループは、("preferred" や "discouraged" など)他の値のサポートによって恩恵を受けるユースケースの共有を実装者に求めている。

  6. data["credentialIds"] 内の各 id について:

    1. descriptor を、新しい PublicKeyCredentialDescriptor 辞書とし、そのフィールドを次のようにする:

      type

      public-key

      id

      id

      transports

      長さ 1 のシーケンスで、その唯一のメンバは internal である。

    2. 追加により、 descriptorpublicKeyOpts["allowCredentials"] に加える。

  7. outputCredential を、 «["publicKey" → publicKeyOpts]» を渡して 資格情報を要求するアルゴリズムを実行した結果とする。

    Note: Chrome の初期実装は、 資格情報を要求する に対して data.credentialIds の全リストを渡さない。代わりに、リスト内から現在のデバイスに一致する 1 つの資格情報を選び、それだけを渡す。

    Note: これは [webauthn-3]Get 挙動をトリガーする。

  8. outputCredential を返す。

5. WebAuthn拡張 - "payment"

このクライアント 登録拡張および 認証拡張は、認証情報がそれぞれSecure Payment Confirmation向けに作成または利用されることを示します。

登録時には、この拡張がブラウザによるSecure Payment Confirmation認証情報IDの識別・キャッシュを可能にします。認証時には、第三者がRelying Partyの代理で認証セレモニーを行えるようにし、署名暗号文に取引情報を追加します。

特に、ウェブサイトはnavigator.credentials.get()を使って直接この拡張を呼び出すべきではありません。認証用途の拡張は、PaymentRequestの"secure-payment-confirmation"決済方式を介してのみ利用可能です。

注: 以前はpayment拡張でクロスオリジンiframe内で認証情報作成が可能でしたが、WebAuthnではWebAuthn PR #1801以降、デフォルト対応となっています。

テスト

このテストは仕様記述の各行に直接対応するものではなく、クロスオリジンiframe内から認証処理が可能なことを検証します。この挙動は禁じる記述がないことで仕様化されています。


拡張子識別子

payment

操作の適用範囲

登録 及び 認証

クライアント拡張入力
partial dictionary AuthenticationExtensionsClientInputs {
  AuthenticationExtensionsPaymentInputs payment;
};

dictionary AuthenticationExtensionsPaymentInputs {
  boolean isPayment;
  sequence<PublicKeyCredentialParameters> browserBoundPubKeyCredParams;

  // Only used for authentication.
  USVString rpId;
  USVString topOrigin;
  USVString payeeName;
  USVString payeeOrigin;
  sequence<PaymentEntityLogo> paymentEntitiesLogos;
  PaymentCurrencyAmount total;
  PaymentCredentialInstrument instrument;
};
isPayment

拡張がアクティブであることを示す。

rpId

認証時のみ使用し、登録時には使用しない。ウェブ開発者が直接設定すべきでない。

topOrigin

認証時のみ使用し、登録時には使用しない。ウェブ開発者が直接設定すべきでない。

payeeName

認証時のみ使用し、登録時には使用しない。ウェブ開発者が直接設定すべきでない。

payeeOrigin

認証時のみ使用し、登録時には使用しない。ウェブ開発者が直接設定すべきでない。

paymentEntitiesLogos

認証時のみ使用し、登録時には使用しない。ウェブ開発者が直接設定すべきでない。

total

認証時のみ使用し、登録時には使用しない。ウェブ開発者が直接設定すべきでない。

instrument

認証時のみ使用し、登録時には使用しない。ウェブ開発者が直接設定すべきでない。

browserBoundPubKeyCredParams

ブラウザバウンドキー用暗号アルゴリズム種類の許可リスト。認証時はウェブ開発者はSecurePaymentConfirmationRequest.browserBoundPubKeyCredParamsを設定すること。

注: このメンバー未設定時、デフォルトはPublicKeyCredentialCreationOptions.pubKeyCredParams

クライアント拡張処理(登録

新規認証情報作成時:

  1. ステップ3の後に下記ステップを挿入:

  2. ステップ13(CollectedClientData作成)の前に。

    テスト
    1. bbk_allowed_algorithmsbrowserBoundPubKeyCredParamsとする。

    2. browserBoundPubKeyCredParamsの場合は、bbk_allowed_algorithmsPublicKeyCredentialCreationOptions.pubKeyCredParamsとする。

    3. bbk_and_algorithmbbk_idbbk_allowed_algorithms鍵ペア作成で得る。

    4. (bbk_and_algorithm, bbk_id)がnullなら、以降のbbk_and_algorithm及びbbk_public_key関連手順は省略。

    5. bbk_public_keybbk_and_algorithmブラウザバウンド公開鍵取得で得る。

  3. ステップ13ではCollectedClientDataの代わりに、フィールドが: CollectedClientPaymentData を作成する。フィールドについて:

    payment

    CollectedClientAdditionalPaymentRegistrationDataで初期化、フィールドは:

    browserBoundPublicKey

    bbk_public_key - COSE_Key形式の公開鍵

    他フィールド

    他のフィールドは従来ステップ13通り。

  4. ステップ22、"いずれかの認証器が成功"ケース内、ステップ3(pubKeyCred返却直前):

    1. 鍵ペアバインドbbk_idpubKeyCred.[[identifier]]で行う。失敗時はUnknownError返却。

    2. payment_outputsAuthenticationExtensionsPaymentOutputsで初期化、フィールドは:

      browserBoundSignature

      BrowserBoundSignatureで初期化、フィールドは:

      signature

      create credential step 14でのbbk_and_algorithm及びclientDataJsonブラウザバウンド署名生成の結果。

    3. [[clientExtensionsResults]]["payment"]にpayment_outputsを設定。

クライアント拡張処理(認証

AuthenticationExtensionsPaymentInputsextension_inputsアサーション実行時:

  1. "secure-payment-confirmation"決済ハンドラー外の場合、"NotAllowedError"DOMExceptionを返す。

    テスト

    注: SPCの拡張機能を取引UXを経ずに使う試みの防止。

  2. [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)内:

    1. 6.1(options.rpIdとeffectiveDomainの比較)をスキップ。

    テスト

    注: クロスドメイン認証セレモニーを可能化。§ 1.1.2 加盟店による認証管理参照。

    1. ステップ10の前(CollectedClientData作成前):

      1. allowed_algorithmsSecurePaymentConfirmationRequest.browserBoundPubKeyCredParamsとする。

      2. bbk_and_algorithmcredential_idおよびallowed_algorithmsブラウザバウンドキー取得/生成で得る。

    2. ステップ10ではCollectedClientDataの代わりに、下記フィールドでCollectedClientPaymentDataを作成:

      1. type を"payment.get"に設定。

      2. paymentを新規CollectedClientAdditionalPaymentDataで初期化、フィールドは:

        rpId

        extension_inputs["rpId"]

        topOrigin

        extension_inputs["topOrigin"]

        payeeName

        存在時はextension_inputs["payeeName"]、不在時は省略。

        payeeOrigin

        存在時はextension_inputs["payeeOrigin"]、不在時は省略。

        paymentEntitiesLogos

        存在時はextension_inputs["paymentEntitiesLogos"]、不在時は省略。

        total

        extension_inputs["total"]

        instrument

        extension_inputs["instrument"]

        browserBoundPublicKey

        bbk_and_algorithm非null時はbbk_and_algorithmブラウザバウンド公開鍵取得の結果。null時は未設定。

      3. 他フィールドは従来ステップ10通り。

      テスト
    3. "いずれかの認証器が成功"時、ステップ2で[[clientExtensionsResults]]設定時:

      1. payment_outputsAuthenticationExtensionsPaymentOutputsで初期化、フィールドは:

        browserBoundSignature

        bbk_and_algorithm非null時は、BrowserBoundSignatureで初期化、フィールドは:

        signature

        create credential step 14でのbbk_and_algorithm及びclientDataJsonブラウザバウンド署名生成の結果。

      2. Set[[clientExtensionsResults]]["payment"]にpayment_outputsを設定。

      テスト
クライアント拡張出力
partial dictionary AuthenticationExtensionsClientOutputs {
  AuthenticationExtensionsPaymentOutputs payment;
};

dictionary AuthenticationExtensionsPaymentOutputs {
  BrowserBoundSignature browserBoundSignature;
};

dictionary BrowserBoundSignature {
  required ArrayBuffer signature;
};
browserBoundSignature

ブラウザバウンド署名の出力

signature

ブラウザバウンド署名処理の成果物。

認証器拡張処理

なし

5.1. CollectedClientPaymentData 辞書

dictionary CollectedClientPaymentData : CollectedClientData {
    required (CollectedClientAdditionalPaymentData or CollectedClientAdditionalPaymentRegistrationData) payment;
};

CollectedClientPaymentData 辞書は CollectedClientDataを継承します。 以下の追加フィールドを含みます:

payment

署名される追加の決済情報。

5.2. CollectedClientAdditionalPaymentData 辞書

dictionary CollectedClientAdditionalPaymentData {
    required USVString rpId;
    required USVString topOrigin;
    USVString payeeName;
    USVString payeeOrigin;
    sequence<PaymentEntityLogo> paymentEntitiesLogos;
    required PaymentCurrencyAmount total;
    required PaymentCredentialInstrument instrument;
    USVString browserBoundPublicKey;
};

CollectedClientAdditionalPaymentData 辞書は以下のフィールドを含みます:

rpId

この認証情報を作成した Relying Party の ID。

NOTE: 歴史的な理由により、一部の実装ではこのパラメーターを rp という名前でも併せて含めている場合がある。 両方が存在する場合、rprpId の値は同一でなければならない。

topOrigin

取引詳細の署名を要求したトップレベルコンテキストのオリジン。

payeeName

存在する場合、ユーザーに表示された受取人(payee)の名称。

payeeOrigin

存在する場合、ユーザーに表示された受取人のオリジン。

paymentEntitiesLogos

取引ダイアログ内でユーザーに表示されたロゴ(存在する場合)。これらのロゴは、この取引を仲介するエンティティを表すことを意図している。

total

[payment-request]total フィールドに対応する、 PaymentCurrencyAmount

instrument

ユーザーに表示された支払手段(インストゥルメント)の情報。

browserBoundPublicKey

ブラウザバウンドキー の公開鍵を base64url エンコーディングした値。 WebAuthn における Base64url encoding を参照。

呼び出しフレームのオリジンは既にCollectedClientData[webauthn-3])に含まれているため、CollectedClientAdditionalPaymentDatapaymentRequestOrigin フィールドはありません。

5.3. CollectedClientAdditionalPaymentRegistrationData 辞書

dictionary CollectedClientAdditionalPaymentRegistrationData {
    USVString browserBoundPublicKey;
};

CollectedClientAdditionalPaymentRegistrationData 辞書は以下のフィールドを含みます:

browserBoundPublicKey

ブラウザバウンドキーの公開鍵を base64url エンコーディングした値。WebAuthn における Base64url encoding を参照。

6. Browser Bound Key ストア

これはユーザーエージェントが所有する内部コンポーネントで、プラットフォーム依存の暗号鍵ペアとそれらの SPC 認証情報(例:パスキー)への関連付けを管理します。本節では browser bound key store と、ブラウザバウンド鍵ペアの作成、バインド、取得、署名に関する手順を説明します。

注: browser bound key store は鍵ペア生成、鍵ペア取得、公開鍵のエクスポート、署名の生成を行う必要があります。多くのOSはこれらの操作を実装し、可能であればデバイス上のセキュアエレメントに秘密鍵を保管するAPIを提供します。例えば Android KeyStoreApple CryptoKit、あるいは Windows Cryptography API: Next Generation などがあります。

browser bound key store は以下を含みます:

browser_bound_map

Credential ID(Credential ID)から鍵ペア識別子へのマップ。

keypair_map

鍵ペア識別子(バイト配列)から、公開鍵・秘密鍵の鍵ペアとアルゴリズム識別子(COSEAlgorithmIdentifier)の タプルへのマップ。

注: ユーザーエージェントは同等の機能を提供する暗号APIを利用しており、その場合はこの機能を暗号APIに委譲することがあります。

6.1. 鍵ペアの作成

鍵ペアを作成する手順は、PublicKeyCredentialParameters 型の allowed_algorithms を与えられ、タプルとして鍵ペアとその COSEAlgorithmIdentifier と鍵ペア識別子のバイト配列を返すように、以下の手順を実行します:

注: 許可されたアルゴリズムまたはデフォルトの許可アルゴリズムから鍵ペアを生成します。

  1. もし allowed_algorithms であれば、このリストを以下を順に含むデフォルトリストに設定します:

  2. Remove を使って、allowed_algorithms から PublicKeyCredential 型でないエントリを削除します。

  3. Remove を使って、ユーザーエージェントがサポートしていないエントリをallowed_algorithmsから削除します。

    注: ユーザーエージェントはデバイスプラットフォームごとに異なる暗号アルゴリズムセットをサポートする可能性があります。

  4. もし allowed_algorithmssize が 0 であれば、null を返します。

    注: この場合、ユーザーエージェントはブラウザバウンド出力を追加しません。

  5. もし allowed_algorithmssize が 0 より大きければ、以下を実行:

    1. chosen_algorithmallowed_algorithms[0] とする。

    2. chosen_algorithm に対応する既定手順で公開・秘密鍵の鍵ペアを生成し、その結果を bbk とする。鍵生成アルゴリズムについては IANA COSE Algorithms レジストリ [IANA-COSE-ALGS-REG] を参照してください。生成が失敗した場合は null を返す。

    3. bbk_and_algorithm を (bbk, chosen_algorithm) の タプルとする。

    4. bbk_id を次のいずれかとする:

      1. 長さ32の配列として初期化されたバイト配列:

        1. bbk_id を長さ32の配列とする。

        2. getRandomValues(bbk_id) を呼ぶ。

      2. 実装定義の鍵生成手順から得られる鍵ペアハンドルのシリアライズ結果のバイト配列。このバイト配列は、後に ブラウザバウンドキーの取得/作成 の際に鍵を識別するためのものでなければならない。

      注: 多くの暗号APIは秘密鍵の代わりに識別子、ハンドル、またはラップされた鍵を返し、公開鍵と共に返す場合があります。例えば秘密鍵がセキュアエレメントに格納されている場合、秘密鍵自体はユーザーエージェントに直接利用可能でないため、識別子/ハンドル/ラップ鍵を暗号APIの別関数に渡して使用する必要があります。

    5. Set を使って keypair_map[bbk_id] に bbk_and_algorithm を設定する。

    6. (bbk_and_algorithm, bbk_id) を返す。

仕様はハードウェアストレージ内のアルゴリズムを優先し(与えられた順序で)、次にソフトウェア内のアルゴリズムを優先するよう規定できる可能性があります。現時点では Chrome がプラットフォームごとに1つのアルゴリズムのみハードウェアでサポートする予定であるため、この話題は当面重要でないかもしれません。BBK のストレージ種別や許容ストレージ種別、ストレージ種別を Relying Party に公開することなどに関する議論は Secure Payment Confirmation issue #288 を参照してください。

6.2. 鍵ペアのバインド

鍵ペアをバインドする 手順は、鍵ペア識別子を含むバイト配列 bbk_id とバイト配列 credential_id を与えられ、失敗を返す可能性がある場合に次の手順を実行します:

注: Credential ID(パスキー識別子)について、ブラウザバウンド鍵識別子を browser_bound_map に格納します。

  1. Set を使って browser_bound_map[credential_id] に bbk_id を設定します。エラー InvalidStateErrorTypeError、 および QuotaExceededError を捕捉したら失敗を返します。

    注: これらのエラーは基盤となるファイルシステム操作(例:write(buffer, options))によってスローされることがあります。ここで false が返されると、ユーザーエージェントは取引にブラウザバウンド鍵を含めないようにし、この場合 Relying Party はその取引でブラウザバウンド鍵を受け取らないことになります。次回の支払いアサーション時に新しい鍵ペア作成が試みられます。

6.3. 鍵ペアの取得

ブラウザバウンド鍵を取得または作成する手順は、バイト配列 credential_idリスト 型の PublicKeyCredentialParametersallowed_algorithms)を与えられ、鍵ペアとその COSEAlgorithmIdentifier のタプルを返す手順です:

注: 与えられた Credential ID に関連付けられた既存の鍵ペアを見つけるか、新しい関連鍵ペアを作成してその鍵ペアとアルゴリズムを返します。

  1. もし browser_bound_map[credential_id] が存在する場合

    1. bbk_idbrowser_bound_map[credential_id] とする。

    2. bbk_and_algorithmkeypair_map[bbk_id] とする。

  2. もし browser_bound_map[credential_id] が 存在しない場合

    1. (new_bbk_and_algorithm, bbk_id) を、 allowed_algorithms を用いて 鍵ペアを生成する 結果とする。

    2. binding_result を、bbk_id および credential_id を用いて 鍵ペアをバインドする 結果とする。結果が failure なら、bbk_and_algorithm を null とする。

    3. もし binding_result が failure でなければ、bbk_and_algorithmnew_bbk_and_algorithm とする。

  3. bbk_and_algorithm を返す。

6.4. ブラウザバウンド公開鍵の取得

ブラウザバウンド公開鍵を取得する手順は、鍵ペアと COSEAlgorithmIdentifier のタプル bbk_and_algorithm を与えられ、バイト配列を返すものです:

注: ブラウザバウンド鍵公開鍵 をエンコードして取得します。

  1. bbkbbk_and_algorithm[0] とする。

  2. algorithmbbk_and_algorithm[1] とする。

  3. public_key を、algorithm に対応する既定手順に従って取得した bbk公開鍵 とする。

  4. encoded_public_keypublic_key の COSE_Key エンコードとする。WebAuthn の credentialPublicKey を参照してください(WebAuthn § 6.5.1 Attested Credential Data)。

  5. encoded_public_key を返す。

6.5. クライアントデータの署名

指定された鍵ペアと COSEAlgorithmIdentifier のタプル bbk_and_algorithm とバイト配列 client_data_json を与えられ、バイト配列を返すことで ブラウザバウンド署名を生成する手順を実行します:

注: CollectedClientDataCollectedClientAdditionalPaymentData または CollectedClientAdditionalPaymentRegistrationData を含む)に対して、browser bound key秘密鍵 を用いて署名を行います。

  1. bbkbbk_and_algorithm[0] とする。

  2. algorithmbbk_and_algorithm[1] とする。

  3. signature を、bbk秘密鍵 を用いて algorithm に従い client_data_json に対して生成した結果とする。アルゴリズムの詳細は IANA COSE Algorithms レジストリ [IANA-COSE-ALGS-REG] を参照してください。

    注: 結果は client_data_json に対する暗号署名であり、bbk秘密鍵 を使っています。

  4. signature を返す。

7. 共通データ構造

以下のデータ構造は登録と認証の間で共有されます。

7.1. PaymentCredentialInstrument 辞書

dictionary PaymentCredentialInstrument {
    required USVString displayName;
    required USVString icon;
    boolean iconMustBeShown = true;
    USVString details;
};

The PaymentCredentialInstrument dictionary contains the information to be displayed to the user and signed together with the transaction details. It contains the following members:

displayName

ユーザーに表示される支払い手段の名称。

注: § 14 国際化に関する考慮事項を参照して、 displayNameの国際化に関する議論を確認してください。

icon

支払い手段のアイコンの URL。

注: icon の URL は、インターネット上でアクセス可能なサーバ上の画像(例: https://bank.example/card.png) を指すか、Data URL により直接アイコンデータをエンコードすることができます [RFC2397]。これら二つのタイプの URL のうち、Data URL は Relying Party に対していくつかの利点を提供します。例えば、 アイコンホスティングサーバが利用できない場合でも信頼性を向上させることができます。また、アイコン URL が CollectedClientAdditionalPaymentData 構造の一部として署名されるため、ブラウザがユーザーに表示した内容について Relying Party が暗号的証拠を得られることで検証を強化できます。

注: 関連する アクセシビリティに関する考慮事項を参照してください。

iconMustBeShown

指定されたアイコンが正常に取得されて表示されることが、そのリクエストの成功条件であるかを示します。

details

ユーザーに表示される支払い手段の追加の詳細文字列(オプション)。

注: § 14 国際化に関する考慮事項を参照して、 detailsの国際化に関する議論を確認してください。

7.2. 辞書

dictionary PaymentEntityLogo {
    required USVString url;
    required USVString label;
};

The PaymentEntityLogo dictionary contains information describing a logo for a payment entity that is facilitating the current transaction. It contains the following members:

url

ロゴの URL。

注: url は、インターネット上でアクセス可能なサーバの画像(例: https://bank.com/logo.png) を指すか、Data URL によりロゴデータを直接エンコードすることができます [RFC2397]。これら二つのタイプの URL のうち、Data URL は Relying Party にいくつかの利点を提供します。例えば、ロゴホスティングサーバが利用できない場合の信頼性を向上させることができます。また、 Relying Party がブラウザがユーザーに表示した内容について暗号的な証拠を持つことで検証を強化できます。ロゴの URL は CollectedClientAdditionalPaymentData 構造の一部として署名されます。

label

ロゴの説明ラベル。ユーザーエージェントはこのラベルを表示してもよく(必須ではありません)(参照: § 4.10 トランザクション確認 UX の表示)、アクセシビリティの目的(例:スクリーンリーダーでこのロゴを説明する際に読み上げる)で使用するべきです。

8. Permissions Policy の統合

この仕様は "payment" ポリシー識別子文字列を [payment-request] から使用して、SPC 認証へのアクセスを制御します。これは PaymentRequest コンストラクタに従います。

この仕様の以前のバージョンとの後方互換性のために、Credential Management Credential Type Registry は、タイプ public-key の代替の Create Permissions Policy として "payment" ポリシー識別子文字列を追加するよう拡張されています。将来のバージョンではこの振る舞いが完全に非推奨になる可能性があります。

テスト

注: アルゴリズムは [CREDENTIAL-MANAGEMENT-1] に指定されている通り、実際の permissions policy 評価を行います。これは、ポリシー評価が current settings object へのアクセスがあるときに発生する必要があるからです。[[Create]](origin, options, sameOriginWithAncestors) および [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)内部メソッド は、そのようなアクセスを持ちません。なぜならそれらは 並列に呼び出されるからであり([CREDENTIAL-MANAGEMENT-1] に指定されたアルゴリズムによって)、この評価はそこで行われないためです。

9. SPC Relying Party の操作

9.1. 認証アサーションの検証

Secure Payment Confirmation の認証式(authentication ceremony)を行うために、authentication ceremony を実施する際、Relying Party は以下の手順を必ず実行しなければなりません:

  1. credentialPublicKeyCredential とし、これは Secure Payment Confirmation payment handler を SPC 呼び出し元が正常に呼び出したときに返されたものとします。

    注: SPC は マーチャントによる認証の制御 を可能にするために設計されており、SPC を呼び出すエンティティが必ずしも Relying Party であるとは限りません。この最初のステップは、SPC 呼び出し元が SPC 経由で取得した credential を Relying Party に返したことを前提としています。

  2. WebAuthn に指定されている手順のステップ 3–21 を実行します(WebAuthn の記述)。ただし以下の変更を加えます:

    1. ステップ 5 では、credential.idSPC 呼び出し元 により Relying Party へ提供された公開鍵資格情報のいずれかを識別することを検証してください。

    2. ステップ 11 では、C["type"] の値が文字列 payment.get であることを検証してください。

    3. ステップ 12 では、C["challenge"] が SPC 呼び出し元Relying Party に提供したチャレンジの base64url エンコーディングと等しいことを検証してください。

    4. ステップ 13 では、C["origin"] の値が Relying Party が SPC を呼び出したと予期するオリジンと一致することを検証してください。

    5. ステップ 13 の後に、以下のステップを挿入してください:

      • C["payment"]["rpId"] の値が Relying Party のオリジンと一致することを検証してください。

      • C["payment"]["topOrigin"] の値が Relying Party が予期するトップレベルのオリジンと一致することを検証してください。

      • C["payment"]["payeeName"] の値が、ユーザーに表示されるべき受取人の名前(ある場合)と一致することを検証してください。

      • C["payment"]["payeeOrigin"] の値が、ユーザーに表示されるべき受取人のオリジン(ある場合)と一致することを検証してください。

      • C["payment"]["paymentEntitiesLogos"] の値が、ユーザーに表示されるべきロゴの厳密かつ順序付き部分集合であることを検証してください(ある場合)。

        注:ユーザーエージェントはすべてのロゴを表示しないことが許可されていますが、ユーザーに表示されていないロゴを CollectedClientAdditionalPaymentData に含めてはなりません。

      • C["payment"]["total"] の値が、ユーザーに表示されるべきトランザクション金額と一致することを検証してください。

      • C["payment"]["instrument"] の値が、ユーザーに表示されるべき支払い手段の詳細と一致することを検証してください。

10. ユーザーエージェントの自動化

ユーザーエージェントの自動化とウェブサイトのテストの目的のために、本書は以下の [WebDriver2]拡張コマンド を定義します。関係者はまた 同等の自動化セクション[webauthn-3] でも参照すべきです。

10.1. Set SPC Transaction Mode

The Set SPC Transaction Mode WebDriver 拡張コマンド は、ユーザーエージェントに対して Secure Payment Confirmation を、自動的にユーザーがトランザクション確認 UX を承認または拒否するようにシミュレートするモードに設定するよう指示します。

The current transaction automation mode は、SPC に対して現在有効な自動化モードを追跡します。デフォルトは "none" です。

HTTP Method URI Template
POST /session/{session id}/secure-payment-confirmation/set-mode

The remote end steps are:

  1. もし parameters が JSON の Object でない場合、WebDriver エラーWebDriver エラーコード invalid argument で返してください。

  2. modeプロパティを取得する 操作で "mode" という名前のプロパティを parameters から取得した結果として得てください。

  3. もし modeundefined または "autoAccept"、"autoChooseToAuthAnotherWay"、"autoReject"、"autoOptOut" のいずれでもない場合、WebDriver エラーWebDriver エラーコード invalid argument で返してください。

  4. current transaction automation modemode に設定してください。

  5. success をデータ null と共に返してください。

11. セキュリティに関する考慮事項

この仕様は WebAuthn の上に構築されているため、WebAuthn のセキュリティ考慮事項 が適用されます。以下の節は、Secure Payment Confirmation 固有のセキュリティ考慮事項であり、この仕様が WebAuthn からどのように逸脱するかを示します。

11.1. クロスオリジン認証手続き

Secure Payment Confirmation が WebAuthn と大きく異なる点は、第三者が異なる Relying Party のための資格情報を使用して認証式を開始し、そのアサーションを第三者に返すことを許可している点です。この機能は Relying Parties をログインおよび支払い攻撃の両方にさらす可能性があり、ここで議論されます。

11.1.1. ログイン攻撃

Secure Payment Confirmation 用に作成された資格情報は有効な WebAuthn 資格情報であるため、ある Relying Party が同じ資格情報をユーザーのログインと支払いの両方に使用したいと考える可能性があります。これにより、受け取ったアサーションを慎重に検証しない場合、Relying Party のログインシステムに対する潜在的な攻撃が可能になります。

攻撃の流れは次のとおりです:

  1. ユーザーが attacker.example を訪問します。ここは商用サイトを装ったサイトです。

  2. attacker.example はユーザーのための資格情報を relyingparty.example から入手します。これは正当な方法でも、relyingparty.example から資格情報を盗むなどの方法でもあり得ます。

  3. attacker.example は SPC 認証を開始し、ユーザーがトランザクションに同意します(正当かどうかは問わない)。

  4. attacker.example は API 呼び出しから受け取った支払いアサーションを取り、例えば https://relyingparty.example/login への POST のようにしてログインエンドポイントに送信します。

  5. relyingparty.example が誤ったアサーション検証コードを使用しており、署名は検証するが必要なフィールドの検証を怠り(以下参照)、ログイン試行を正当と誤認します。

  6. relyingparty.example は例えばログインクッキーを attacker.example に返します。これによりユーザーの relyingparty.example のアカウントが侵害されます。

Relying Parties は、この攻撃に対して二つの方法で防御できます。

第一に、Relying Party は常に適切なアサーション検証手順に従う必要があります(WebAuthn ログイン用または SPC 支払い用のいずれか適切な方に従う)。特に、次のフィールドは資格情報の不適切な使用を検出するために使用できます:

第二に、Relying Party は支払い用とログイン用の資格情報を分けて管理することを検討できます。これを行う場合、Relying Party は Secure Payment Confirmation 用の資格情報をサブドメイン(例: https//payment.relyingparty.example)上でのみ登録し、支払い資格情報とログイン資格情報をデータベース内で分離して保持するべきです。

注:現在の記述では、Secure Payment Confirmation 仕様は任意の WebAuthn 資格情報が SPC 認証で使用されることを許可しています。 しかし、現在の実装ではこれは真ではなく、実装は SPC 認証に参加するために指定された payment 拡張で作成された資格情報のみを許可しています。将来的に仕様はこれを反映するよう更新される可能性があります。

現在の実装と仕様では、payment 拡張で作成された資格情報は、Relying Party が望む場合はログインにも使用できることになっています。これは今後も変わらない見込みです。

11.1.2. 支払い攻撃

Secure Payment Confirmation のアサーションは、進行中のオンライン取引の一部でない限り本質的に無意味です。

悪意のある第三者がユーザーアカウントの乗っ取りを試みる代わりに、正規または不正な方法で取得した Secure Payment Confirmation 資格情報を使って不正な支払いを開始する攻撃を防ぐため、さまざまな仕組みが用意されています:

11.2. マーチャント提供の認証データ

銀行は 受け取った認証アサーションの検証 を通じて、マーチャントが提供した取引内容とアサーションが一致していることを確認し、なりすましを防止できますし、防止すべきです。

これは、この仕様の第三者認証式の結果、正当な取引(Relying Party が期待しているもの)であっても、第三者がユーザーに表示される取引内容を提供するからです:

これにより、マーチャントがユーザーに誤ったデータを提示するなりすまし攻撃につながる可能性があります。たとえば、マーチャントがバックエンドで銀行に $100 の購入を開始すると伝えつつ、SPC API に $1 を渡して(結果としてユーザーには $1 の取引が表示され、確認させる)といったことです。または、マーチャントが正しい取引内容を提供しつつ、Relying Party が期待するものと一致しない Secure Payment Confirmation 資格情報を渡す可能性もあります。

Secure Payment Confirmation によって、この種の攻撃を防ぐことは、現状のウェブよりも簡単になります。現在のオンライン決済では、銀行はマーチャントがユーザーにチェックアウトフローで正しい金額を提示したかどうかを信頼するしかなく、不正が発覚するのはユーザーが明細を確認した後の事後対応が一般的です。

11.3. 攻撃者生成の Browser Bound Key

Relying Party(例:銀行など)は、認証アサーションの検証を行うことで攻撃者が生成した BBK から保護することができ、またそうすべきである。このアサーションには BBK 公開鍵が含まれており、署名が無効な暗号文からの BBK 公開鍵は無視するべきである。SPC Credential によるものと BBK によるものの 2 つの署名が存在する一方で、アサーションは(BBK に加えて)パスキーを用いて検証されなければならない。BBK は追加の署名を提供するものであり、パスキーによる署名の代替ではない。

商人になりすました攻撃者は、攻撃者が対応する秘密鍵を制御している別の BBK 公開鍵にすり替えようと試みるかもしれない。その後、攻撃者はユーザーになりすまして加盟店の Web サイトを訪問し、加盟店が SPC を呼び出した際に、攻撃者自身の秘密鍵を用いて SPC 暗号文に署名する。このとき、攻撃者は BBK のデバイスバインディングの側面を破ったことになる。

しかし、この攻撃は実行可能ではない。

  1. 攻撃者が BBK をすり替えるとき:Relying Party は、パスキー公開鍵を用いて(BBK 公開鍵を含む)CollectedClientData を検証する際に、不正な署名を検出する。Relying Party はこのトランザクションを拒否し、この BBK 公開鍵を信頼されていないものとして扱うべきである。

  2. 攻撃者がユーザーになりすまそうと試みるとき:Relying Party は、パスキー公開鍵を用いて検証する際に不正な署名を検出する。Relying Party は、この BBK 公開鍵を引き続き信頼されていないものとして扱うべきである。

11.4. ユーザーアクティベーション要件の欠如

ユーザーエージェントが§ 4.3 ユーザーアクティベーション要件の変更に記載されているようにユーザーアクティベーションを必要としない場合、追加のセキュリティ緩和策を検討する必要があります。ユーザーアクティベーションを要求しないと、ユーザーが直前にページに操作しなくても Secure Payment Confirmation の流れを開始できるため、スパムやクリックジャッキング攻撃のリスクが高まります。

スパム対策としては、ユーザーが現ページでユーザーアクティベーションなしで既に Secure Payment Confirmation フローを表示されている場合など、ある閾値以降でユーザーアクティベーション要件を強制することをユーザーエージェントが決定してもよいでしょう。クリックジャッキング対策としては、ダイアログ表示直後のクリックを一定時間無視するしきい値をユーザーエージェントが実装してもよいでしょう。

もう一つの関連する対策はPaymentRequest.show()にあり、 Payment Request API はドキュメントの可視性を要求するため、SPC はバックグラウンドタブや最小化ウィンドウ、その他の隠れた状況では発動できません。

12. プライバシーに関する考慮事項

この仕様は WebAuthn の上に構築されており、WebAuthn のプライバシーに関する考慮事項が適用されます。以下の小節は、Secure Payment Confirmation 固有のプライバシー考慮事項であり、この仕様が WebAuthn から逸脱する場合について記述しています。

12.1. 資格情報 ID を調査する試み

WebAuthn の認証式のプライバシーのセクションの通り、Secure Payment Confirmation の実装者は、悪意のある呼び出し元(いまや必ずしも Relying Party とは限らない)が次のケースを区別できないようにしなければなりません:

上記ケースが区別可能だと、悪意のあるRelying Party がどの 資格情報が利用可能かを調査することによって、ユーザーを特定できる情報が漏洩する恐れがあります。

このリスクは、Secure Payment Confirmation では常に取引確認 UXを表示し、SPC 資格情報 が利用不可能な場合も、利用可能でもユーザーが使用を選択しない場合も同じエラー("NotAllowedError" DOMException)を返すことで緩和されています。

12.2. 異なる支払い手段の紐付け

Relying Party が同じユーザーの複数の支払い手段で同じ資格情報を使用する場合、マーチャントが本来紐付けられなかったはずの支払い手段の情報を結びつけることができるかもしれません。すなわち、ユーザー U が支払い手段 P1 および P2 で(同一または共謀するマーチャント M または M1/M2 に対して)2 つの異なる取引を行った場合、マーチャントが P1 および P2 が同ユーザーのものであると知ることができる可能性があります。

多くの現行オンライン支払いフローでは、ユーザーがすでにその結び付けを可能にするための十分な情報(例:氏名、電子メールアドレス、配送先住所など)を提供することが多いため、これが重大なリスクになるとは限りません。

しかし、(トークン化など)より少ない識別情報しか含まれない支払い方法が普及した場合は、エコシステム関係者がユーザーのプライバシー保護手段を講じることが重要になります。たとえば:

12.3. 資格情報 ID をトラッキングベクターとして利用するリスク

単一の支払い手段であっても、Relying Party から返される資格情報 ID は、悪意ある実体によりトラッキングベクターとして利用される可能性があります。なぜなら、それらは強力なクロスサイト識別子だからです。ただし、Relying Party からそれを得るためには、マーチャントがすでに同等に強力な識別子(例:クレジットカード番号)を Relying Party に渡している必要があります。

12.4. Browser Bound Key のトラッキングベクターとしてのリスク

BBK 公開鍵は、各 SPC 支払いアサーション時(および初回の第一者 SPC 資格情報生成時)にのみ返されます。ただし、マーチャントが SPC を開始して BBK を取得するには Relying Party から資格情報 ID を取得し、ユーザーがパスキーで取引を認証する必要があります。BBK 公開鍵へのアクセスにはまず資格情報 ID が必要となるため、BBK 公開鍵がトラッキングリスクを追加することはありません。

12.5. securePaymentConfirmationAvailability を利用したフィンガープリンティング

securePaymentConfirmationAvailability API は、特定のフレームで Secure Payment Confirmation API が利用できない理由を個別に返すため、フィンガープリンティングリスクがあります。これらの理由が重要な情報を漏洩するとは考えられていませんが、考慮しておくべきです:

上記以外にも、この仕様では、たとえ具体的な理由がわかっていても、ユーザーのプライバシー保護のために unavailable-unknown-reason を返すことをユーザーエージェントに許可しています。たとえば、ユーザーエージェントが現在のフレームで他のフィンガープリントリスクを伴う API アクセスを検出している場合などに有効です。

12.6. getSecurePaymentConfirmationCapabilities によるフィンガープリント

getSecurePaymentConfirmationCapabilities API は、ユーザーのデバイスが持つ機能(あるいは欠如している機能)に関する特定の情報をサイレントに返すことができるため、フィンガープリントのリスクをはらんでいる。

このリスクを軽減するために、ユーザーエージェントは、false という値を返すのではなく、返却されるレコードからキーを省略することを優先すべきである (SHOULD)。キーを省略すること(§ 4.7 Secure Payment Confirmation 機能の利用可能性 で説明されているように)の方が、ある機能が未サポートであると明示的に示す場合よりもフィンガープリント表面が小さくなる。ユーザーエージェントは、ユーザーのプライバシーを保護するため、サポートされている場合であっても、その機能を省略することを選択してもよい (MAY)。

SecurePaymentConfirmationCapability に列挙されている特定の機能についての考慮事項:

12.7. ユーザーのオプトアウト

API オプション showOptOut は、ユーザーエージェントに対し、ユーザーが Relying Party による情報の保存からオプトアウトしたいことを示す手段を提供するよう指示する。ユーザーがこのオプトアウトを実行すると、ユーザーがオプトアウトの意図を持つことを示すために、呼び出し元へ OptOutError が返される。その後、このオプトアウトに対してどのように対応するかは呼び出し元次第であり、例えばユーザー向けに保存されている支払情報を消去する、といった対応がありうる。

実装者は、OptOutError が返されることによって、ユーザーが資格情報を持っているにもかかわらず認証を完了しなかったことが明らかにならないように注意しなければならない (must)。これは、§ 12.1 資格情報 ID のプロービング と同様の手段で緩和できる。例えば、資格情報の一致が見つからなかった場合の中間的な UX においても、ユーザーにオプトアウトの機会を提供する、などである。

これはブラウザのデータや資格情報を削除するための仕組みとして意図されたものではなく、開発者がユーザーエージェント経由でオプトアウトを促すためのものである。ユーザーエージェントは、例えば次のような説明文を添えることで、この点をユーザーに明確にすべきである:「このプロバイダーは、あなたの支払方法に関する情報を保存している場合があります。削除をリクエストすることができます。」

13. アクセシビリティに関する考慮事項

ユーザーエージェントは icon および displayName を組み合わせてレンダリングします。Relying Party は displayName で十分な情報を提供することでアイコン表示のアクセシビリティを確保します(例:アイコンが銀行なら銀行名も displayName に含めるなど)。

この仕様を実装するユーザーエージェントは、WebAuthn のアクセシビリティに関する考慮事項と、PaymentRequest のアクセシビリティに関する考慮事項の両方に従うべきです。

14. 国際化に関する考慮事項

API の呼び出し元は、取引ダイアログの希望ロケールや表示文字列のローカライズ言語を locale メンバーで指定すべきです。一般的にはこのメンバーはリクエスト元ページのローカライズと一致させるべきです(たとえば、リクエストをトリガーするボタンの lang 属性を参照するなど)。

この仕様は、呼び出し元が API に提供する各表示文字列(例:displayNameなど)に言語や方向性メタデータを付加する仕組みは(まだ)含んでいません。

その間、API 呼び出し元は:

実装(および表示処理)は、表示用文字列値をユーザーインターフェイスに挿入する際、bidi isolation を適用し、方向がわかれば指定し、分からない場合は first-strong("auto")をデフォルトとすべきです。

15. IANA に関する考慮事項

この節は 拡張識別子 を IANA "WebAuthn Extension Identifiers" レジストリ [IANA-WebAuthn-Registries] に追加します([RFC8809] による)。

適合性

文書表記規約

適合性要件は、説明的な断定とRFC 2119 の用語を組み合わせて表現されています。 この文書の規範的部分における「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」というキーワードは、RFC 2119 に記載された通りに解釈されます。 ただし、読みやすさのため、これらの語は本仕様書ではすべて大文字にはなっていません。

本仕様書のすべてのテキストは明示的に非規範的、例、および注釈と記載された節を除き、規範的です。[RFC2119]

本仕様における例は、「for example」という言葉で導入されるか、または、次のように class="example" で規範的本文と区別されます。

これは情報提供のための例です。

情報提供のための注釈は「Note」で始まり、次のように class="note" で規範的本文と区別されます。

Note, これは情報提供のための注釈です。

テスト

本仕様内容に関連するテストは、このような「Tests」ブロックで記載されることがあります。 このようなブロックはすべて非規範的です。


適合アルゴリズム

アルゴリズムの一部として命令形で記述された要件(例えば「先頭の空白文字をすべて取り除く」や「false を返し、これらの手順を中断する」など)は、アルゴリズム導入時に用いられるキーワード("must"、"should"、"may"など)の意味として解釈されます。

アルゴリズムまたは特定のステップとして表現された適合性要件は、その結果が同等である限り、どんな方法で実装しても構いません。 とくに、本仕様書で定義されたアルゴリズムは理解しやすいことを意図しており、性能のためのものではありません。 実装者は最適化を推奨します。

索引

本仕様で定義される用語

他で定義される用語

参考文献

規範的参照

[CREDENTIAL-MANAGEMENT-1]
Nina Satragno; Marcos Caceres. Credential Management Level 1(認証情報管理レベル1). 2026年2月13日. WD(作業草案). URL: https://www.w3.org/TR/credential-management-1/
[DOM]
Anne van Kesteren. DOM Standard(DOM標準). Living Standard. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification(ECMAScript言語仕様). URL: https://tc39.es/ecma262/multipage/
[FETCH]
Anne van Kesteren. Fetch Standard(Fetch標準). Living Standard. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; ほか. HTML Standard(HTML標準). Living Standard. URL: https://html.spec.whatwg.org/multipage/
[I18N-GLOSSARY]
Richard Ishida; Addison Phillips. Internationalization Glossary(国際化用語集). 2024年10月17日. NOTE(注記). URL: https://www.w3.org/TR/i18n-glossary/
[IANA-COSE-ALGS-REG]
IANA CBOR Object Signing and Encryption (COSE) Algorithms Registry(IANA CBOR オブジェクト署名・暗号化アルゴリズム登録). URL: https://www.iana.org/assignments/cose/cose.xhtml#algorithms
[IANA-WebAuthn-Registries]
Registries for Web Authentication (WebAuthn)(Web認証のためのレジストリ). URL: https://www.rfc-editor.org/rfc/rfc8809.html
[IMAGE-RESOURCE]
Aaron Gustafson; Rayan Kanso; Marcos Caceres. Image Resource(イメージリソース). 2021年6月4日. WD(作業草案). URL: https://www.w3.org/TR/image-resource/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard(Infra標準). Living Standard. URL: https://infra.spec.whatwg.org/
[PAYMENT-METHOD-ID]
Marcos Caceres. Payment Method Identifiers(決済方法識別子). 2022年9月8日. REC(勧告). URL: https://www.w3.org/TR/payment-method-id/
[PAYMENT-REQUEST]
Marcos Caceres; Ian Jacobs; Stephen McGruer. Payment Request API(支払リクエストAPI). 2026年3月3日. CRD(勧告候補). URL: https://www.w3.org/TR/payment-request/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels(要件レベルを示すためのキーワード). 1997年3月. Best Current Practice(最良現行慣行). URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC8809]
J. Hodges; G. Mandyam; M. Jones. Registries for Web Authentication (WebAuthn)(Web認証のためのレジストリ). 2020年8月. Informational(情報提供). URL: https://www.rfc-editor.org/rfc/rfc8809
[URL]
Anne van Kesteren. URL Standard(URL標準). Living Standard. URL: https://url.spec.whatwg.org/
[WEBAUTHN-3]
Michael Jones; ほか. Web Authentication: An API for accessing Public Key Credentials - Level 3(Web認証: 公開鍵認証資格情報取得API - レベル3). 2026年1月13日. CR(勧告候補). URL: https://www.w3.org/TR/webauthn-3/
[WEBCRYPTO-2]
Daniel Huigens. Web Cryptography Level 2(Web暗号化レベル2). 2025年4月22日. FPWD(最初の公開作業草案). URL: https://www.w3.org/TR/webcrypto-2/
[WebDriver2]
Simon Stewart; David Burns. WebDriver(WebDriver). 2026年2月6日. WD(作業草案). URL: https://www.w3.org/TR/webdriver2/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard(Web IDL標準). Living Standard. URL: https://webidl.spec.whatwg.org/

参考情報

[BCP47]
A. Phillips, Ed.; M. Davis, Ed.. 言語識別のためのタグ。2009年9月。最良現行慣行。URL: https://www.rfc-editor.org/rfc/rfc5646
[DBSC]
Ian Clelland; Daniel Rubery; thefrog t. デバイスにバインドされたセッション資格情報。2025年8月21日。FPWD。URL: https://www.w3.org/TR/dbsc-1/
[FS]
Austin Sullivan. ファイルシステム標準。Living Standard。URL: https://fs.spec.whatwg.org/
[RFC2397]
L. Masinter. "data" URLスキーム。1998年8月。標準案。URL: https://www.rfc-editor.org/rfc/rfc2397
[RFC4647]
A. Phillips, Ed.; M. Davis, Ed.. 言語タグの照合。2006年9月。最良現行慣行。URL: https://www.rfc-editor.org/rfc/rfc4647
[WEBAUTHN-CONDITIONAL-UI]
WebAuthn 条件付きUI提案。 URL: https://github.com/w3c/webauthn/issues/1545

IDL索引

dictionary SecurePaymentConfirmationRequest {
    required BufferSource challenge;
    required USVString rpId;
    required sequence<BufferSource> credentialIds;
    required PaymentCredentialInstrument instrument;
    unsigned long timeout;
    USVString payeeName;
    USVString payeeOrigin;
    sequence<PaymentEntityLogo> paymentEntitiesLogos;
    AuthenticationExtensionsClientInputs extensions;
    sequence<PublicKeyCredentialParameters> browserBoundPubKeyCredParams;
    sequence<USVString> locale;
    boolean showOptOut;
};

enum SecurePaymentConfirmationAvailability {
  "available",
  "unavailable-unknown-reason",
  "unavailable-feature-not-enabled",
  "unavailable-no-permission-policy",
  "unavailable-no-user-verifying-platform-authenticator",
};

partial interface PaymentRequest {
    static Promise<SecurePaymentConfirmationAvailability> securePaymentConfirmationAvailability();
};

partial interface PaymentRequest {
    static Promise<SecurePaymentConfirmationCapabilities> getSecurePaymentConfirmationCapabilities();
};

typedef record<DOMString, boolean> SecurePaymentConfirmationCapabilities;

enum SecurePaymentConfirmationCapability {
  "browserBoundKeyHardware",
};

partial dictionary AuthenticationExtensionsClientInputs {
  AuthenticationExtensionsPaymentInputs payment;
};

dictionary AuthenticationExtensionsPaymentInputs {
  boolean isPayment;
  sequence<PublicKeyCredentialParameters> browserBoundPubKeyCredParams;

  // Only used for authentication.
  USVString rpId;
  USVString topOrigin;
  USVString payeeName;
  USVString payeeOrigin;
  sequence<PaymentEntityLogo> paymentEntitiesLogos;
  PaymentCurrencyAmount total;
  PaymentCredentialInstrument instrument;
};

partial dictionary AuthenticationExtensionsClientOutputs {
  AuthenticationExtensionsPaymentOutputs payment;
};

dictionary AuthenticationExtensionsPaymentOutputs {
  BrowserBoundSignature browserBoundSignature;
};

dictionary BrowserBoundSignature {
  required ArrayBuffer signature;
};

dictionary CollectedClientPaymentData : CollectedClientData {
    required (CollectedClientAdditionalPaymentData or CollectedClientAdditionalPaymentRegistrationData) payment;
};

dictionary CollectedClientAdditionalPaymentData {
    required USVString rpId;
    required USVString topOrigin;
    USVString payeeName;
    USVString payeeOrigin;
    sequence<PaymentEntityLogo> paymentEntitiesLogos;
    required PaymentCurrencyAmount total;
    required PaymentCredentialInstrument instrument;
    USVString browserBoundPublicKey;
};

dictionary CollectedClientAdditionalPaymentRegistrationData {
    USVString browserBoundPublicKey;
};

dictionary PaymentCredentialInstrument {
    required USVString displayName;
    required USVString icon;
    boolean iconMustBeShown = true;
    USVString details;
};

dictionary PaymentEntityLogo {
    required USVString url;
    required USVString label;
};

課題索引

この仕様の現行バージョンは、PaymentEntityLogo につき一つのURLのみをサポートしているため、データ構造を単純にコピーおよび署名するだけで、ユーザーに表示された内容を示すことができます。将来のバージョンでは、たとえばダークモードをネイティブにサポートするために、PaymentEntityLogo に複数のURLを追加する可能性があります。この場合、仕様は Relying Party に対して、特定の PaymentEntityLogo についてどのURLが表示されたかを示す必要があります。
仕様では、ハードウェアストレージ内のアルゴリズム(指定順)を優先し、その後ソフトウェア内のアルゴリズム(同じ指定順)を優先すると規定できるかもしれません。現状この話題は意味をなさないかもしれません。なぜならChromeは一つのプラットフォームあたりハードウェアで1アルゴリズムのみサポート予定だからです。BBKのストレージタイプ、許可すべきストレージタイプやRelying Party へのストレージタイプ公開を含む追加話題は、Secure Payment Confirmation issue #288 を参照。