セキュアペイメント確認

W3C 候補勧告ドラフト,

本書についての詳細
このバージョン:
https://www.w3.org/TR/2025/CRD-secure-payment-confirmation-20251209/
最新公開バージョン:
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)
テストスイート:
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 加盟店による認証管理参照。

注: 最初のSPC実験を迅速にサポートするため、このAPIはPayment RequestとPayment Handler APIの既存実装上に設計されましたが、今後SPCをPayment Requestから独立した設計にする方向で合意されています(具体的な時期は未定)。これにより、開発者は機能検出や呼び出し等、API利用体験が向上する見込みです。

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.8 支払い可能か確認手順参照。

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

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. 決済方式データの検証手順

この決済方式の決済方式データの検証手順は、 入力PaymentRequest requestおよびSecurePaymentConfirmationRequest dataについて、以下の通りです:

テスト
  1. data["credentialIds"] が空の場合は、 RangeError をthrowする。

  2. data["credentialIds"]内の各idに対し:

    1. idが空の場合はRangeError をthrowする。

  3. data["challenge"] がnullまたは空の場合はTypeError をthrowする。

  4. data["instrument"]["displayName"] が空の場合はTypeError をthrowする。

  5. data["instrument"]["icon"] が空の場合はTypeError をthrowする。

  6. data["instrument"]["icon"] に URLパーサーを実行する。失敗なら TypeError をthrow。

  7. data["instrument"]["details"] が存在し、空の場合はTypeError をthrowする。

  8. data["rpId"]が 有効なドメインでなければTypeError をthrow。

  9. data["payeeName"]と data["payeeOrigin"] の両方が省略されている場合、 TypeError をthrow。

  10. data["payeeName"]または data["payeeOrigin"] のいずれかが存在し、空の場合、 TypeError をthrow。

  11. data["payeeOrigin"] が存在する場合:

    1. parsedURLを、URLパーサーdata["payeeOrigin"] に対し実行して得る。

    2. parsedURLが失敗ならTypeError をthrow。

    3. parsedURLschemeが"https"でなければTypeError をthrow。

  12. data["paymentEntitiesLogos"] が存在し、空でない場合:

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

      1. logo["url"]が空の場合TypeErrorをthrow。

      2. logo["url"]にURLパーサーを実行し、失敗ならTypeErrorをthrow。

      3. logo["label"]が空の場合TypeErrorをthrow。

  13. data["locale"]が 存在し空でない場合:

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

      1. tagが整形式[BCP47]言語タグでなければ、TypeErrorをthrow。

    注: locale は特定入力メンバーに対する言語や方向性メタデータとは異なり、呼び出し元要求のローカライズ体験表現であり特定文字列値への主張ではない。 詳しくは§ 14 国際化の考慮参照。

4.8. 支払い可能か確認手順

この決済方式の支払い可能か確認手順は、 入力SecurePaymentConfirmationRequest dataについて、以下の通りです:

テスト
  1. data["payeeOrigin"] が存在する場合:

    1. parsedURLdata["payeeOrigin"]に URLパーサーを実行して得る。

    2. parsedURLが失敗でないことを保証する。

    3. parsedURLschemeが"https"であることを保証する。

    注: これらの事前条件は以前決済方式データの検証手順でチェックされていた。

    1. data["payeeOrigin"] をparsedURLオリジンのシリアル化結果に設定する。

  2. アイコン画像リソースをフェッチし、«["src" → data["instrument"]["icon"]]»をimageに渡す。失敗した場合:

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

    2. それ以外ならdata["instrument"]["icon"]を 空文字列に設定する。

      注: 指定されたアイコンが表示されなかったことをRPに通知(出力instrumentのicon文字列が空になる)。

    注: 画像リソースは認証情報一致の有無にかかわらずフェッチされ、認証情報ID存在のプロービング対策となる。

  3. ユーザーエージェントは任意でdata["paymentEntitiesLogos"] のエントリーをリスト末尾から削除可能。

    注: ユーザーエージェントは表示ロゴ数を自身で調整可能。ロゴは表示優先度降順維持。

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

    1. logo画像リソースをフェッチし、«["src" → logo["url"]]»をimageに渡し、結果をデコードする。

    2. フェッチまたはデコード失敗ならlogo["url"]を空文字列に設定。

      注: 指定ロゴが表示されなかったことをRPに通知(出力paymentEntitiesLogos シーケンス内の当該logoのurlが空文字になる)。

    注: ロゴリソースも認証情報一致の有無にかかわらずフェッチされ、認証情報ID存在のプロービング対策となる。

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

    1. 認証情報が現デバイスで利用可能かサイレント判定する手順data["rpId"]とidで行う。結果がfalseならidをdata["credentialIds"]から削除。

    2. data["rpId"]がrequestオリジンでない場合は、 SPC認証情報がサードパーティ対応かサイレント判定する手順data["rpId"]とidで行い、結果がfalseならidをdata["credentialIds"]から削除。

  6. trueを返す。

4.9. 取引確認UXの表示

PaymentRequest.show() が呼び出され、Secure Payment Confirmation payment handlerが選択された場合(当該アルゴリズムのステップ19–24)、ユーザーエージェントはユーザーに対して、続行するかどうかおよびどのように続行するかを選択できるユーザーインターフェイスを必ず提示しなければなりません。

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

ユーザーエージェントの実装の選択肢を制限しないために、本仕様は特定のユーザーインターフェイスの表示を要求しません。しかし、Relying PartyCollectedClientPaymentData に含まれる情報を信頼できるようにするため、ユーザーエージェントは次の事項がユーザーに伝えられ、認証に対するユーザーの同意が収集されることを保証しなければなりません:

ユーザーエージェントは、あればlocale の情報を利用して、ウェブサイトと整合した言語でローカライズされたUXやロケールに基づく書式で表示してもよい。

もしshowOptOuttrueであれば、ユーザーエージェントはユーザーに対して当該指定されたRelying Party に関してプロセスからオプトアウトしたいかを示す機会を与えなければなりません。

Tests

4.9.2. 取引確認UXの結果

ユーザーエージェントは、続行するかどうか、またどのように続行するかについて、ユーザーが次のいずれかの選択を示せるようにしなければなりません:

ユーザーは支払いを続行したい。認証には SPC Credentialを使用する、

ユーザーが対話しているPaymentRequest 上で、user accepts the payment request algorithmを実行する。

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

以下の手順を実行する:

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

    注: これによりPaymentRequest.show() のPromiseは"NotAllowedError" DOMException で拒否される;§ 4.10 支払い要求への応答手順参照。

  2. ユーザーが対話しているPaymentRequest 上で、user accepts the payment request algorithmを実行すること。

Tests
ユーザーは支払いを続行したくない、

ユーザーが対話しているPaymentRequest 上で、user aborts the payment request algorithm を実行すること。

注: これによりPaymentRequest.show() のPromiseは"AbortError" DOMException で拒否される。

ユーザーは当該指定されたRelying Party のプロセスからオプトアウトしたい、

PaymentRequest.show() を"OptOutError" DOMException で拒否すること。§ 12.6 ユーザーのオプトアウト参照。

注: このオプションは、showOptOuttrueに設定されている場合にのみユーザーに提供されればよい。

4.9.3. テスト自動化のサポート

もし現在のトランザクション自動化モードが"none"でない場合、ユーザーエージェントはまずそれが自動化コンテキストであることを検証すべきです(WebDriverのセキュリティ考慮参照)。そのうえで、上記の情報伝達とユーザー同意の収集をバイパスし、現在のトランザクション自動化モード の値に基づいて代わりに以下を行うべきです:

"autoAccept"

ユーザーが取引詳細を見て承諾したかのように振る舞う。

"autoChooseToAuthAnotherWay"

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

"autoReject"

ユーザーが取引詳細を見て拒否したかのように振る舞う(つまり取引を継続したくない)。

"autoOptOut"

ユーザーが取引詳細を見てオプトアウトを示したかのように振る舞う。

4.10. 支払い要求への応答手順

この決済方式のための支払い要求への応答手順は、指定されたPaymentRequest requestおよびSecurePaymentConfirmationRequest dataについて以下の通りです。

注: これらの手順はユーザーが取引確認UXを受け入れた場合にのみ実行されます;これらはuser accepts the payment request algorithmによって呼び出されます。

  1. data["credentialIds"] が空であれば、"NotAllowedError" DOMException をthrowすること。これは、ユーザーがSPCを使えないか使いたくない場合の認証セレモニーのプライバシーを保護するためである。

    注: ここでthrowするとPaymentRequest.show() のPromiseは"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を追加するかもしれません。その場合、仕様はどの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

    注: このアルゴリズムはuserVerification に対して"required"をハードコーディングしている。これはChromeの初期実装がサポートする値であるためで、現状の制限は将来変更される可能性がある。ワーキンググループは、"preferred"や"discouraged"のような他の値のサポートが有益なユースケースについて実装者からの情報提供を求めている。

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

    1. descriptorを新しいPublicKeyCredentialDescriptor 辞書として作成し、そのフィールドを以下のように設定する:

      type

      public-key

      id

      id

      transports

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

    2. AppenddescriptorpublicKeyOpts["allowCredentials"] に追加する。

  7. outputCredentialを、Request a Credentialアルゴリズムを実行して得る結果とする。渡す引数は«["publicKey" → publicKeyOpts]»である。

    注: Chrome の初期実装では、data.credentialIds の全リストを Request a Credential に渡しません。代わりにリストの中から現在のデバイスに一致する1つの資格情報を選択し、それだけを渡します。

    注: これにより[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)。

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

topOrigin

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

payeeName

表示されていた場合にユーザーに表示された受取人の名前。

payeeOrigin

表示されていた場合にユーザーに表示された受取人のオリジン。

paymentEntitiesLogos

取引ダイアログで表示されたロゴ(ある場合)。これらのロゴは、この取引を仲介する事業体を表すことを意図しています。

total

PaymentCurrencyAmount 型の、[payment-request]total フィールド。

instrument

ユーザーに表示された決済手段の情報。

browserBoundPublicKey

browser bound key の公開鍵の Base64url エンコード。WebAuthn の Base64url エンコーディング を参照してください。

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

5.3. CollectedClientAdditionalPaymentRegistrationData 辞書

dictionary CollectedClientAdditionalPaymentRegistrationData {
    USVString browserBoundPublicKey;
};

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

browserBoundPublicKey

browser bound key の公開鍵の Base64url エンコード。WebAuthn の Base64url エンコーディング を参照してください。

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) を create-a-key-pair を使って allowed_algorithms で作成した結果とする。

    2. binding_resultbind-a-key-pair を使って bbk_idcredential_id でバインドした結果とする。結果が失敗なら bbk_and_algorithm を null とする。

    3. もし binding_result が失敗でなければ、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.9 トランザクション確認 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 資格情報 と BBK の二つが存在しますが、アサーションはパスキー(および BBK)で検証する必要があります。BBK は追加の署名を提供するだけで、パスキーの署名の代替にはなりません。

攻撃者がマーチャントを装い、攻撃者が制御する秘密鍵に対応する別の BBK 公開鍵を差し替えようとするかもしれません。攻撃者が次に本人になりすましてマーチャントサイトにアクセスし、SPC 呼び出し時に攻撃者自身の秘密鍵でクリプトグラムに署名するという攻撃です。これにより BBK の端末紐付けの性質が失われます。

しかし、この攻撃は実質的に成立しません:

  1. 攻撃者が BBK を差し替える場合:Relying Party は、パスキー公開鍵で CollectedClientData (BBK 公開鍵を含む)の署名を検証した際に署名の不一致を検出し、この取引を拒否してその 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. ユーザーのオプトアウト

API オプション showOptOut は ユーザーエージェントに、ユーザーが Relying Party の情報保存をオプトアウト可能な UI 提供を命じます。ユーザーがオプトアウト操作を行うと、OptOutError が呼び出し元に返されます。これを受けた呼び出し元は、ユーザーの保存支払い情報を削除するなど、適切な対応を行うことになります。

実装者は、OptOutError の返却により、ユーザーが資格情報を持っているが認証を完了しなかった事実が漏洩しないよう注意しなければなりません。これは、§ 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. 2025年10月28日. WD. URL: https://www.w3.org/TR/credential-management-1/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[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/
[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. URL: https://www.iana.org/assignments/cose/cose.xhtml#algorithms
[IANA-WebAuthn-Registries]
Registries for Web Authentication (WebAuthn). 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. 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. 2025年9月30日. 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). 2020年8月. Informational. URL: https://www.rfc-editor.org/rfc/rfc8809
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[WEBAUTHN-3]
Tim Cappalli; et al. Web Authentication: An API for accessing Public Key Credentials - Level 3. 2025年1月27日. WD. URL: https://www.w3.org/TR/webauthn-3/
[WEBCRYPTO-2]
Daniel Huigens. Web Cryptography Level 2. 2025年4月22日. FPWD. URL: https://www.w3.org/TR/webcrypto-2/
[WEBDRIVER1]
Simon Stewart; David Burns. WebDriver. 2018年6月5日. REC. URL: https://www.w3.org/TR/webdriver1/
[WebDriver2]
Simon Stewart; David Burns. WebDriver. 2025年10月28日. WD. URL: https://www.w3.org/TR/webdriver2/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

参考情報

[BCP47]
A. Phillips, Ed.; M. Davis, Ed.. Tags for Identifying Languages. 2009年9月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc5646
[FS]
Austin Sullivan. File System Standard. Living Standard. URL: https://fs.spec.whatwg.org/
[RFC2397]
L. Masinter. The "data" URL scheme. 1998年8月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc2397
[RFC4647]
A. Phillips, Ed.; M. Davis, Ed.. Matching of Language Tags. 2006年9月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc4647
[WEBAUTHN-CONDITIONAL-UI]
WebAuthn Conditional UI Proposal. 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 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 を参照。