1. はじめに
この節およびその下位の節は非規範的である。
この仕様は、Web 上の決済フローで強力な認証 方法を利用できるようにする API を定義する。これは、 [webauthn-3] と同じ認証上の 利点とユーザーのプライバシーへの配慮を提供するとともに、 決済処理のニーズを満たすための 拡張を加えることを目指す。
[webauthn-3] と同様に、 この仕様はユーザーが関与する2つの関連する処理を 定義する。最初は§ 3 登録(以前は 「登録手続き」と呼ばれていた)であり、 ユーザーと依拠当事者との間に関係が確立される。 2つ目は§ 4 認証 - 安全な支払いの確認の支払い 方法であり、ユーザーは 依拠当事者からのチャレンジに応答し(場合によっては仲介する決済サービス プロバイダーを介して)、 特定の支払いに同意する。
この仕様の目標は、決済手続き中の認証に伴う負担を 軽減することであり、その一環として、1回の登録によってユーザーが 実行できる認証の回数を最大化することが挙げられる。すなわち、 依拠当事者の同意があれば、理想的にはユーザーは「一度登録するだけ」で、 最初に登録した加盟店のオリジンだけでなく、あらゆる加盟店のオリジンで (決済サービスプロバイダーを介する場合も含めて)認証できるようになる。
この目的のため、安全な支払いの確認の重要な機能の1つは、 加盟店(または別の主体)が依拠当事者に代わって認証 手続きを開始できることである。依拠当事者は、 資格情報の作成時に、この動作を許可することに 明示的に同意しなければならない。
機能面では、この仕様は
PaymentRequest
API のための新しい支払い方法を定義し、
WebAuthn 拡張を追加して、
[webauthn-3] を
支払いに固有のデータ構造とデバイスの紐付けによって拡張し、
決済のコンテキストで API を呼び出せるように前提条件を緩和する。
1.1. ユースケース
[webauthn-3] は Web 向けの汎用的な認証機能を提供するが、 以下のユースケースは、この仕様で定義される支払い固有の 拡張の価値を示している。
オンライン取引における暗号技術に基づく認証の一般的なユースケースは、 すでに十分に確立されているものとする。
1.1.1. 取引 確認の暗号学的証拠
多くのオンライン決済システムでは、支払い手段を 発行する主体(銀行など)が、認証によって不正行為を減らそうとすることが一般的である。 [webauthn-3] およびこの仕様により、認証器を使用して、 加盟店のオリジンや取引金額、通貨などの 支払い固有の重要な情報に暗号学的に署名できる。銀行は 依拠当事者として、署名された支払い固有の 情報を検証し、 支払いを承認するかどうかの判断に利用できる。
銀行が通常の[webauthn-3] を使用する場合、
検証対象となる支払い固有の情報を
WebAuthn の
challenge
に保存しなければならない。
これにはいくつかの問題がある。
-
これは、リプレイ攻撃を防ぐことを目的とする
challengeフィールドの 誤用である。 -
これについての仕様が存在しないため、各銀行は 支払い固有の情報をチャレンジ内でどのように 書式化し、符号化するかについて独自の形式を考案する必要が生じやすく、 導入が複雑になり、断片化が進む。
-
規制によっては、支払い固有の情報がユーザーに提示され、 ユーザーが同意したことを示す証拠が必要になる場合がある。通常の[webauthn-3] は このような表示を規定していない。
challengeフィールドに保存された情報に対応する UX が 仕様で定められていないためである。
これらの制約を踏まえ、安全な支払いの確認では次の動作を定めている。
-
challengeフィールドは、通常の [webauthn-3] と同様に、リプレイ攻撃を防ぐためだけに使用される。 -
SPC は支払い固有の情報の形式を規定する。これにより、 汎用的な検証コードやテストスイートを開発できるようになる。
-
SPC は、悪意のある Web サイト(または信頼できる Web サイトに悪意を持って 挿入された JavaScript コード)が回避できない方法で、ユーザーエージェントが 支払い固有の情報をユーザーに提示することを保証する。
-
支払い固有の情報は、
CollectedClientData辞書に含まれ、JavaScript によって 改ざんすることはできない。
注記: 銀行や決済 エコシステムのその他の関係者は、現在、 TLS、iframe、その他の Web 機能を使用したブラウザー経由の決済を十分に信頼している。 この仕様は、Web 決済のセキュリティと使いやすさを 向上させるように設計されている。
-
1.1.2. 加盟店による認証の制御
加盟店は、特に認証に伴う負担を軽減することによって、 決済手続き中のユーザーの離脱を防ごうとしている。 依拠当事者 (銀行など)が [webauthn-3] を使用して ユーザーを認証する場合、通常は iframe から行う。しかし、加盟店は 依拠当事者が 認証結果を検証できるようにしながら、 ユーザーの認証に関する UX を自ら管理することを望んでいる。
この制約を踏まえ、安全な支払いの確認では次の動作を定めている。
-
SPC では、依拠 当事者以外の主体も、 依拠当事者に代わって認証資格情報を 使用できる。その後、依拠当事者は 認証結果を検証できる。
この機能には、依拠当事者が認証用の フロントエンド UX を独自に構築する必要がなくなるという利点もある。 代わりに、決済サービスプロバイダーが加盟店に代わって構築することが見込まれる。
注記: 認証の UX を自ら提供したい依拠当事者は、 引き続き iframe から SPC を使用して提供できる。
1.1.3. デバイスの紐付けに関する暗号学的証拠
決済業界では、デバイスを所有していることを示すシグナルが、 第2の認証要素として重要な役割を果たしている。WebAuthn では、1つの資格情報を 複数のデバイスで利用できる同期パスキーが認められている(Web 認証 § 1.2.1 複数デバイス資格情報を持つ消費者)。 同期はログインのユースケースにおける UX を改善する一方で、 一部の規制環境では、同期パスキーだけではデバイスの所有 要件を満たさないという懸念が示されている。
これらの懸念から、ユーザーエージェントが作成する補助的な公開鍵と秘密鍵の ペアを導入することになった。この秘密鍵は1つのデバイスにのみ存在し、 そのデバイスでのみ使用される。このような鍵と SPC におけるその使用は、 ブラウザーに紐付けられた鍵と呼ばれる。
1.2. API の使用シナリオ例
この節では、安全な支払いの確認に関するいくつかのシナリオと、 この API を使用するための対応するサンプルコードを説明する。これらは フローの例であり、API の使用方法の範囲を制限するものではないことに注意。
1.2.1. 決済手続き中の登録
これは初回のフローであり、ユーザーがある加盟店で決済手続きを行う際に、 発行銀行によって新しい資格情報が作成され、保存される。
-
ユーザーは
merchant.exampleにアクセスし、購入する商品を選択して、 決済手続きに進む。支払い手段の詳細を入力し、 支払いを希望することを示す(例えば、「支払う」ボタンを押す)。 -
加盟店は、支払い手段を発行した銀行と アウトオブバンド(別のプロトコルを使用するなど)で通信する。発行銀行は ユーザーの本人確認を要求し、加盟店が iframe で開くための銀行が管理する URL を提供する。
-
加盟店は
bank.exampleへの iframe を開き、allow属性を 次の値に設定する。 「publickey-credentials-create」。 -
iframe 内で、発行銀行は 従来の方法(SMS OTP など)によってユーザーの本人確認を行う。確認後、銀行は 今後の支払いのために SPC 認証への登録をユーザーに案内する。
-
ユーザーが同意すると(例えば、銀行の UX にある「登録」ボタンをクリックする)、 銀行は iframe 内でコードを実行する(以下の例を参照)。
-
ユーザーは WebAuthn の登録フローを実行する。新しい資格情報が 作成され、発行銀行に返される。発行銀行はそれをユーザーおよび支払い手段に関連付けて、 サーバー側のデータベースに保存する。
-
本人確認が完了すると、銀行の iframe が閉じられ、加盟店は ユーザーの決済手続きを完了する。
この方法でユーザーを登録するためのサンプルコードを以下に示す。このサンプルコードでは、 Promise の処理を読みやすくするため、async/await が利用可能であることを前提としている。
if ( ! window. PublicKeyCredential) { /* クライアントは対応していない。エラーを処理する。 */ } const publicKey= { // チャレンジは銀行のサーバーで作成し、iframe に送信する必要がある。 challenge: new Uint8Array([ 21 , 31 , 105 /* サーバーが生成する追加の29個のランダムなバイト */ ]), // 依拠当事者: rp: { name: "Fancy Bank" , }, // ユーザー: user: { // WebAuthn の一部。この情報は SPC では必須ではないが、 // 銀行のサーバーが今後の取引でこのユーザーを // 識別するために使用する場合がある。同じユーザーに対して // 一貫性のない値を使用すると、複数の資格情報が作成され、 // 資格情報の選択によって UX に負担が生じる可能性がある。 id: Uint8Array. from ( window. atob( "MIIBkzCCATigAwIBAjCCAZMwggE4oAMCAQIwggGTMII=" ), c=> c. charCodeAt( 0 )), name: "jane.doe@email.example" , displayName: "Jane Doe" , }, // この例では、依拠当事者は 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 になる。 // この例では ES256 と RS256 が許可され、RS256 が優先される。 browserBoundPubKeyCredParams: [ { type: "public-key" , alg: - 257 // "RS256" }, { type: "public-key" , alg: - 7 // "ES256" } ] } } }; // 注記: 次の呼び出しにより、認証器が UI を表示する。 try { const newCredentialInfo= await navigator. credentials. create({ publicKey}); // 検証と登録のため、新しい資格情報をサーバーに送信する。 } catch ( err) { // 使用可能な認証器がないか、ユーザーが同意を拒否した。適切に処理する。 }
1.2.2. 加盟店サイトでの認証
これは、すでに登録済みの資格情報を持つユーザーが 取引を行い、発行銀行と加盟店が安全な 支払いの確認を使用する場合のフローである。
-
ユーザーは
merchant.exampleにアクセスし、購入する商品を選択して、 決済手続きに進む。支払い手段の詳細を入力し、 支払いを希望することを示す(例えば、「支払う」ボタンを押す)。 -
加盟店は、支払い手段の発行銀行とアウトオブバンドで 通信する(別のプロトコルを使用するなど)。発行銀行は ユーザーの本人確認を要求すると同時に、API の使用に必要な 情報を提供することで、SPC に対応していることを加盟店に通知する。 この情報には、チャレンジと、このユーザーおよび支払い手段に 関連付けられた資格情報 ID が含まれる。
-
加盟店は以下のサンプルコードを実行する。
-
ユーザーは SPC の UX に表示された支払い固有の情報に同意し、 続いて WebAuthn の認証手続きを実行する。署名された 暗号文が加盟店に返される(
AuthenticationExtensionsPaymentOutputsに含まれるブラウザーに紐付けられた鍵の出力を含む)。 -
加盟店は署名された暗号文を発行銀行に アウトオブバンドで送信する。発行銀行は暗号文を検証し、 ユーザーが正当であること、表示された支払い固有の情報、 およびユーザーが取引に同意したことを確認する。発行銀行は 取引を承認し、加盟店はユーザーの決済手続きを完了する。 発行銀行はブラウザーに紐付けられた鍵の公開鍵、
browserBoundPublicKeyを保存する。
ユーザーを認証するためのサンプルコードを以下に示す。このサンプルコードでは、 Promise の処理を読みやすくするため、async/await が利用可能であることを前提としている。
/* securePaymentConfirmationAvailability は、ブラウザーが */ /* SPC に対応しているかどうかを示す。このデバイスで使用可能な資格情報が */ /* ユーザーに存在するかどうかは示さない。 */ const spcAvailable= ( await window. PaymentRequest? . securePaymentConfirmationAvailability? .()) === 'available' ; if ( ! spcAvailable) { /* ブラウザーは SPC に対応していないため、加盟店は従来のフローにフォールバックする必要がある。 */ } const request= new PaymentRequest([{ supportedMethods: "secure-payment-confirmation" , data: { // 銀行から取得した資格情報 ID のリスト。 credentialIds, rpId: "fancybank.example" , // チャレンジも銀行から取得する。 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 と 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 資格情報を他の認証フロー(例えば、 ログイン)でどのように使用できるか(または使用できないか)を制限することを意図していない。
注記: この仕様の現行版では、 依拠当事者が、資格情報をファーストパーティまたはサードパーティの コンテキストで使用することに明示的に同意する必要がある。長期的には、 すべてのWebAuthn 資格情報が ファーストパーティのコンテキスト(例えば、 依拠当事者のドメイン)で SPC に使用でき、 資格情報をサードパーティが使用できるようにする場合にのみ 明示的な同意が必要となることを意図している。
- サードパーティによる使用が有効な SPC 資格情報
-
SPC 資格情報のうち、 依拠当事者が資格情報の作成時に、 依拠 当事者以外の主体による安全な支払いの確認の認証で、その資格情報を使用することに明示的に同意したもの。
- SPC 資格情報がサードパーティによる使用を許可されているかどうかを 非対話的に判定する手順
-
ユーザーエージェントが、 依拠当事者識別子と資格情報 IDを与えられたときに、 その ID が表す資格情報が サードパーティによる使用が有効な SPC 資格情報であるかどうかを、非対話的に(つまり、 ユーザーの操作なしで)判定できる、まだ定義されていない処理。
注記: WebAuthn の 課題1667を参照。
- 資格情報が現在のデバイスで利用可能かどうかを 非対話的に判定する手順
-
ユーザーエージェントが、 依拠当事者識別子と資格情報 IDを与えられたときに、 その資格情報 ID が表す資格情報が 現在のデバイスで利用可能かどうか(つまり、WebAuthn のGet 呼び出しの一部として正常に使用できるかどうか)を、非対話的に(ユーザーの操作なしで) 判定できる、まだ定義されていない処理。
これにより、ユーザーエージェントは、 ユーザーが取引を正常に完了できる可能性がある場合にのみ、 取引確認 UXを条件付きで表示できる。
注記: この性質を実現するには、 SPC 資格情報が 発見可能である必要があると考えられる。そのため、この仕様では 現在、これを要件として規定している。
注記: この性質は、 WebAuthn 条件付き UI の提案で必要とされるものと非常によく似ている。両者と SPC は、 同じ基盤 API でサポートできる可能性が高い。
- ブラウザーに紐付けられた 鍵
-
WebAuthn 資格情報に加えて、取引の詳細に 署名する公開鍵と秘密鍵の鍵ペアであり、 ユーザーエージェントによって単一のデバイスに紐付けられる。 注記: この名称は、この機能の初期の実装がブラウザー向けに 作成されたことに由来するが、この概念はすべてのユーザーエージェントに適用できる。
- 鍵ペア
-
鍵ペアは、公開 鍵と秘密鍵から構成される構造体であり、 これらの型は実装定義である。
注記: 公開鍵と秘密 鍵は、IANA COSE アルゴリズムレジストリ [IANA-COSE-ALGS-REG]で参照される暗号アルゴリズムに固有の パラメーターである。
注記: 公開鍵の部分は、 登録時には
CollectedClientAdditionalPaymentRegistrationData.browserBoundPublicKeyで、 支払いのアサーション時にはCollectedClientAdditionalPaymentData.browserBoundPublicKeyで返される。注記: 秘密鍵は、
BrowserBoundSignature.signatureに含まれる 暗号署名を生成するために使用される。ユーザー エージェントは秘密鍵をエクスポートせず、 デバイスのセキュアエレメントに秘密鍵を保存する場合がある。
3. 登録
安全な支払いの確認にユーザーを登録するには、依拠当事者は
navigator.credentials.create()を
呼び出し、
payment
WebAuthn 拡張を
指定するべきである。
注記: この仕様では、 条件付き UIがない場合でも、 ブラウザーが SPC 資格情報 ID をキャッシュできるようにするための 拡張を定義している。WebAuthn の将来のバージョンでこの機能が 利用可能になれば、SPC でこの拡張を必須とする要件を 削除する可能性がある。なお、SPC 資格情報(この拡張を含む)は、 それ以外の点では完全な WebAuthn 資格情報である。
注記: 登録時、Web 認証では
nameと
displayNameの
両方が必要となる。ただし、
user メンバーの定義によれば、実装は
その後の認証手続きでこれらのいずれかを
表示することを要求されない。2023年10月時点では、この2つのうち
nameの方が
一貫して表示されている。開発者は引き続き
実装の動向を確認するべきである。
4. 認証 - 安全な支払いの確認の支払い方法
安全な支払いの確認によって支払いを認証するために、この仕様では 次のものを定義する。
-
特定の支払いの認証要求を処理する支払いハンドラーである、安全な支払いの確認の支払い ハンドラー。
-
この支払いハンドラーのための標準化された支払い方法 識別子である、 「secure-payment-confirmation」。
安全な支払いの確認の支払いハンドラーは、 ユーザーに取引を確認させた後、 認証手続きを実行してユーザーを認証し、 認証手続きを表す署名済みのデータ塊を生成する。
大まかに言えば、安全な支払いの確認の認証は、 [webauthn-3]に似ているが、 概念上の大きな違いが1つある。安全な支払いの確認では、 サードパーティ(加盟店など)が依拠当事者に代わって認証手続きを開始し、 別の未規定の経路で依拠当事者から取得した資格情報を渡すことができる。 § 1.1.2 加盟店による認証の制御を参照。
4.1. [payment-method-id]への登録
[payment-method-id]の標準化された支払い方法のレジストリに 次の項目を追加する。
- "secure-payment-confirmation"
-
安全な支払いの確認の 仕様。
4.2. Payment Request コンストラクターの変更
PaymentRequest オブジェクトのコンストラクターの手順において、
ステップ4.3の後に新しいステップを追加する。
-
支払い方法を処理する: [サブステップ1~3は省略]
-
seenPMIs に「secure-payment-confirmation」が含まれ、 seenPMIs のサイズが1より大きい場合、
RangeErrorをスローする。
-
4.3. ユーザーによる有効化要件の変更
PaymentRequest.show()
メソッドの手順において、
ステップ2と3を次のように変更する。
-
requestの 関連するグローバルオブジェクトが 一時的な有効化を持たない場合、ユーザーエージェントは次を行ってもよい。
-
そうでなければ、関連するグローバルオブジェクトの ユーザーによる有効化を消費する。
注記: これにより、ユーザーエージェントは ユーザーによる有効化を必須としないことができる。例えば、 リダイレクト時にユーザーによる有効化が存在しない可能性のある リダイレクト認証フローをサポートできる。セキュリティ上の考慮事項については、 § 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 <PaymentEntityLogo >;paymentEntitiesLogos AuthenticationExtensionsClientInputs ;extensions sequence <PublicKeyCredentialParameters >;browserBoundPubKeyCredParams sequence <USVString >;locale boolean ; };showOptOut
SecurePaymentConfirmationRequest
辞書には、次の
メンバーが含まれる。
challenge-
リプレイ攻撃を防ぐために依拠当事者がサーバー側で生成する ランダムなチャレンジ。
rpId-
資格情報の依拠当事者識別子。
credentialIds-
指定された支払い手段の資格情報識別子のリスト。
instrument-
登録時に表示され、取引の詳細とともに署名される 支払い手段の名前とアイコンの説明。
timeout-
取引の詳細への署名要求がタイムアウトするまでの ミリ秒数。最大1時間。デフォルト値と許容値の範囲は ユーザーエージェントによって定義される。Web 認証では タイムアウトに関する追加の 指針が提供されている。
payeeName-
この SPC 呼び出しの対象となる受取人(加盟店など)の 表示名。任意であり、
payeeOriginとともに、またはその代わりに指定できる。 payeeOrigin-
この SPC 呼び出しの対象となる受取人(加盟店など)の オリジン。任意であり、
payeeNameとともに、またはその代わりに指定できる。 paymentEntitiesLogos-
この SPC 呼び出しの対象となる支払いを仲介する 主体を表すロゴの任意のリスト。表示の優先順位が 高い順に並べられる。ユーザーエージェントは いずれのロゴも、またはすべてのロゴを表示する必要はない。 § 4.9 支払いが 可能かどうかを確認する手順を参照。
注記: この仕様が ロゴの表示方法を正確に規定していないのは意図的である。 表示に関する制御をユーザーエージェントに委ね、 多くの考慮事項や制約に応じて情報を最適に表示できるようにするためである。 ただし、リスト内のロゴの順序は重要であり、 開発者は特定の順序が望ましい結果をもたらすかどうかを 実験によって判断できる。
extensions-
渡された資格情報に使用する WebAuthn 拡張。呼び出し元は payment 拡張を指定する必要はない。 自動的に追加されるためである。
注記: サードパーティによる SPC 呼び出しでは、 この辞書が空でない場合、例外がスローされる。 個人データを保存できる依拠 当事者の拡張に対する攻撃を防ぐためである。 § 11.1.3 WebAuthn 拡張は 依拠当事者に対してのみ許可されるを参照。
browserBoundPubKeyCredParams-
ブラウザーに紐付けられた鍵に使用する暗号アルゴリズムの 種類を制限する、許可された資格情報の種類のリスト。
注記: このメンバーは、 ブラウザーに紐付けられた鍵を新たに 作成する必要がある場合にのみ使用される。
locale-
呼び出し元のロケールの優先設定を識別する 言語タグ([BCP47]を参照)の任意のリスト。 これに少なくとも1つの言語タグが設定されている場合、ユーザーエージェントは、 リスト内のいずれかのタグが安全な支払いの確認のダイアログで使用される言語と一致するかを判定する。 指定された言語タグのいずれも 一致しない場合、ユーザーエージェントは
PaymentRequest.canMakePayment()が返す Promise を 「NotSupportedError」DOMExceptionで拒否する。 showOptOut-
取引確認 UXの実行中に、 ユーザーにオプトアウトの機会を提供するかどうか。 任意であり、デフォルトは false。
4.5. 支払い方法の追加データ型
この支払い方法の支払い方法の追加データ型は
SecurePaymentConfirmationRequestである。
4.6. 安全な支払いの確認が 利用可能かどうかの確認
開発者が安全な支払いの確認を利用できるかどうかを
簡単に確認できるように、PaymentRequestに
静的 API が追加される。このメソッドである
securePaymentConfirmationAvailability()は、
安全な支払いの確認が利用可能であること、または利用できない場合には
その根本的な理由をある程度示す列挙型の値を返す。
列挙型の出力を使用する目的は、開発者がユーザーに
認証の選択肢を案内し、伝えることを支援することである。
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
列挙型には、次のメンバーが含まれる。
available-
ユーザーエージェントが、呼び出し元のフレームで安全な支払いの 確認 API を利用可能であると判断していることを示す。
注記: この結果は、特定の SPC 資格情報が現在または将来利用可能であるかどうかを示すものではない。
unavailable-unknown-reason-
不明な理由により、呼び出し元のフレームで 安全な支払いの確認 API を利用できないことを示す。 ユーザーのプライバシーを保護するため、ユーザーエージェントは、 より具体的な理由の代わりに常にこの結果を返してもよい。
unavailable-feature-not-enabled-
機能が有効になっていないため、呼び出し元のフレームで 安全な支払いの確認 API を利用できないことを示す。
unavailable-no-permission-policy-
フレームに「payment」 権限ポリシーがないため、呼び出し元のフレームで 安全な支払いの確認 API を利用できないことを示す。
unavailable-no-user-verifying-platform-authenticator-
利用可能なユーザー検証を行うプラットフォーム認証器が 存在しないため、呼び出し元のフレームで安全な支払いの確認 API を 利用できないことを示す。
注記: この情報は
isUserVerifyingPlatformAuthenticatorAvailableを 呼び出すことでも取得できるが、開発者の利便性のためにこの API にも含まれている。
特定のDocument
document で
securePaymentConfirmationAvailability()が呼び出されたとき、
ユーザーエージェントは以下の手順を実行しなければならない。
ユーザーのプライバシーを保護する必要がある場合、またはユーザーエージェント固有の
理由によって手順を完了できない場合、ユーザーエージェントはいつでも
「unavailable-unknown-reason」を
返すことを選択できる。
-
ユーザーエージェントが安全な支払いの確認に対応していない場合、または 対応しているがユーザーエージェント固有の仕組みによって 機能が無効になっている場合、 「
unavailable-feature-not-enabled」を返す。 -
document に対して「payment」権限ポリシーが 有効になっていない場合、 「
unavailable-no-permission-policy」を返す。 -
利用可能なユーザー検証を行うプラットフォーム認証器が 存在しない場合、 「
unavailable-no-user-verifying-platform-authenticator」を返す。 -
document で呼び出された場合に安全な支払いの確認機能が 動作しないその他の理由がある場合、 「
unavailable-unknown-reason」を返す。 -
「
available」を返す。
この API により、開発者は SPC フローを開始するかどうかを 判断する際に、次の確認を実行できる。
const spcAvailable= PaymentRequest&& PaymentRequest. securePaymentConfirmationAvailability&& await PaymentRequest. securePaymentConfirmationAvailability() === 'available' ;
注記: SPC の機能検出には、
構築済みの PaymentRequest オブジェクトで
canMakePaymentを呼び出すのではなく、
静的なsecurePaymentConfirmationAvailability
メソッドを使用することが推奨される。
注記: この API のプライバシーに関する考慮事項については、 § 12.5 securePaymentConfirmationAvailability による フィンガープリンティングを参照。
4.7. 安全な支払いの確認の 機能の利用可能性
開発者が安全な支払いの確認の機能が
利用可能かどうかを判定できるように、
PaymentRequestに
静的 API が追加される。このメソッドである
getSecurePaymentConfirmationCapabilities()は、
機能のキーから真偽値へのレコードを返す。
partial interface PaymentRequest {static Promise <SecurePaymentConfirmationCapabilities >(); };getSecurePaymentConfirmationCapabilities typedef record <DOMString ,boolean >;SecurePaymentConfirmationCapabilities
SecurePaymentConfirmationCapabilitiesの
キーは、辞書順の
昇順で並べ替えられなければならない。キーの集合には、
SecurePaymentConfirmationCapabilityの
列挙値の集合を含めるべきである。ただし、
ユーザーエージェントは必要と判断した場合、キーを省略してもよい。
§ 12.6
getSecurePaymentConfirmationCapabilities による
フィンガープリンティングを参照。
特定の機能の値が true の場合、その機能はこのユーザーエージェントの
安全な支払いの確認の実装で現在サポートされていることが
確認されている。
特定の機能の値が false の場合、その機能はこのユーザーエージェントの
安全な支払いの確認の実装で現在サポートされていないことが
確認されている。
機能がキーとして存在しない場合、その機能がこのユーザーエージェントの 安全な支払いの確認の実装でサポートされているかどうかは不明である。
この API により、開発者は安全な支払いの確認のフローを開始するかどうかを 判断する際に、次のように特定の機能のサポート状況を確認できる。
if ( PaymentRequest&& PaymentRequest. getSecurePaymentConfirmationCapabilities) { const capabilities= await PaymentRequest. getSecurePaymentConfirmationCapabilities(); if ( capabilities. browserBoundKeyHardware) { // SPC API を使用する際、ハードウェアによって保護された BBK が利用可能になる。 } }
注記: この API のプライバシーに関する考慮事項については、 § 12.6 getSecurePaymentConfirmationCapabilities による フィンガープリンティングを参照。
4.7.1. SecurePaymentConfirmationCapability
列挙型
enum SecurePaymentConfirmationCapability {"browserBoundKeyHardware" , };
この列挙型は、安全な支払いの確認の機能のうち、 開発者が評価してユーザーに特定のワークフローや 体験を提供するために利用できる限定的な集合を定義する。
browserBoundKeyHardware-
安全な支払いの確認 API が、デバイス上の ハードウェアセキュアエレメントに保存された ブラウザーに紐付けられた 鍵を使用できることを示す。
詳細については、§ 6 ブラウザーに紐付けられた鍵のストアを参照。
4.8. 支払い方法データを検証する手順
入力としてPaymentRequest
request と
SecurePaymentConfirmationRequest
data を受け取る、この支払い方法の支払い方法データを検証する手順は次のとおりである。
テスト
-
data["
credentialIds"]が 空の場合、RangeErrorをスローする。 -
data["
credentialIds"]内の各 id について、次を行う。-
id が空の場合、
RangeErrorをスローする。
-
-
data["
instrument"]["displayName"]が 空の場合、TypeErrorをスローする。 -
data["
instrument"]["icon"]が 空の場合、TypeErrorをスローする。 -
data["
instrument"] ["icon"]に対して URL パーサーを実行する。 これが失敗を返した場合、TypeErrorをスローする。 -
data["
instrument"]["details"]が 存在するが空の場合、TypeErrorをスローする。 -
data["
payeeName"]と data["payeeOrigin"]の 両方が省略されている場合、TypeErrorをスローする。 -
data["
payeeName"]または data["payeeOrigin"]の いずれかが存在し、 かつ空の場合、TypeErrorをスローする。 -
data["
payeeOrigin"]が 存在する場合:-
data["
payeeOrigin"]に対して URL パーサーを実行した結果を parsedURL とする。 -
parsedURL が失敗の場合、
TypeErrorをスローする。
-
-
data["
paymentEntitiesLogos"]が 存在し、 空でない場合: -
data["
extensions"]が 存在し、 空でなく、かつ data["rpId"]が request の関連する設定群オブジェクトの オリジンでない場合、TypeErrorをスローする。 -
data["
locale"]が 存在し、かつ 空でない場合:-
安全な支払いの確認のダイアログで使用される 言語タグを dialogLanguageTag とする。
-
matched を false とする。
-
data["
locale"]内の各 tag について:-
tag と dialogLanguageTag の両方に複数の 言語サブタグが含まれ、 tag と dialogLanguageTag が ASCII 大文字小文字を区別せず一致する場合、 matched を true に設定し、ループを抜ける。
-
tag または dialogLanguageTag の少なくとも一方が 第一言語サブタグのみで構成され([BCP47]を参照)、両者の第一言語 サブタグがASCII 大文字小文字を区別せず一致する場合、 matched を true に設定し、ループを抜ける。
-
matched が false の場合、 「
NotSupportedError」DOMExceptionをスローする。
注記: 一致が見つからない場合に
NotSupportedErrorを返すことで、 ダイアログのロケールが要求されたどの ロケール設定とも一致しないことを呼び出し元に通知できる。注記: ここでは標準的な 言語ネゴシエーションは適用されない。 その結果得られる言語やロケールが、安全な支払いの 確認のダイアログには使用されないためである。
注記:
localeは、 特定の入力メンバーに関連付けられた 言語や方向のメタデータとは異なる。これは特定の文字列値に関する 表明ではなく、呼び出し元が要求するローカライズされた 体験を表すためである。詳細については、 § 14 国際化に関する考慮事項を参照。 -
4.9. 支払いが可能かどうかを確認する手順
この支払い方法の支払いが可能かどうかを確認する手順は、
入力として
SecurePaymentConfirmationRequest
data を受け取り、次のとおりである。
テスト
-
data["
payeeOrigin"]が 存在する場合:-
data["
payeeOrigin"]に対して URL パーサーを実行した結果を parsedURL とする。 -
表明: parsedURL は失敗ではない。
-
表明: parsedURL のスキームは「
https」である。
注記: これらの事前条件は、 すでに支払い方法データを 検証する手順で確認されている。
-
data["
payeeOrigin"]を parsedURL のオリジンの 直列化結果に設定する。
-
-
アイコンの画像リソースを取得する。その際、 «["
src" → data["instrument"]["icon"]]» を image に渡す。これが失敗した場合:-
data["
instrument"]["iconMustBeShown"]がtrueの場合、falseを返す。 -
そうでなければ、data["
instrument"]["icon"]を 空文字列に設定する。注記: これにより、RP は 指定されたアイコンが表示されなかったことを認識できる。 出力される
instrumentの アイコン文字列が空になるためである。
注記: 資格情報が 一致するかどうかにかかわらず、画像リソースを取得しなければならない。 これは資格情報の存在を 探る試みを防ぐためである。
-
-
任意で、ユーザーエージェントは data["
paymentEntitiesLogos"]から項目を削除してもよい。 その場合、リストの末尾から先頭に向かって削除する。注記: これにより、ユーザーエージェントは 表示するロゴの数を制御できる。 同時に、呼び出し元にとってロゴが表示優先度の 降順に並ぶという意味が維持される。
-
data["
paymentEntitiesLogos"]内の各 logo について:-
logo の 画像リソースを取得する。その際、 «["
src" → logo["url"]]» を image に渡し、結果を復号する。 -
取得または復号のいずれかが失敗した場合、logo["
url"]を 空文字列に設定する。注記: これにより、RP は 指定されたロゴが表示されなかったことを認識できる。 出力される
paymentEntitiesLogosシーケンス内で、そのロゴの URL 文字列が空になるためである。
注記: 資格情報が 一致するかどうかにかかわらず、ロゴのリソースを取得しなければならない。 これは資格情報の存在を 探る試みを防ぐためである。
-
-
data["
credentialIds"]内の各 id について:-
data["
rpId"]と id を渡して、資格情報が現在のデバイスで 利用可能かどうかを非対話的に判定する手順を実行する。 結果がfalseの場合、 data["credentialIds"]から id を削除する。 -
data["
rpId"]が request の 関連する設定群オブジェクトの オリジンでない場合、 data["rpId"]と id を渡して、 SPC 資格情報がサードパーティによる 使用を許可されているかどうかを非対話的に判定する手順を実行する。 結果がfalseの場合、 data["credentialIds"]から id を削除する。
-
-
trueを返す。
4.10. 取引確認 UX の表示
PaymentRequest.show()が
呼び出され、安全な支払いの確認の支払い
ハンドラーが選択された場合(そのアルゴリズムのステップ19~24)、
ユーザーエージェントは、ユーザーが処理を続行するかどうか、および
どのように続行するかを選択できるユーザーインターフェイスを提示しなければならない。
4.10.1. ユーザーに提示される情報
ユーザーエージェントの実装上の選択を制限しないため、この仕様では
特定のユーザーインターフェイスの表示を要求しない。ただし、
依拠当事者が
CollectedClientPaymentDataに含まれる情報を信頼できるように、
ユーザーエージェントは、以下の情報がユーザーに
伝えられ、認証に対するユーザーの同意が得られることを
保証しなければならない。
-
payeeNameが 存在する場合は、その値。 -
payeeOriginが 存在する場合は、その値。 -
instrumentの 詳細、すなわち支払い手段のdisplayName、details、 およびicon。 入力のiconから画像リソースを 取得または復号できなかった場合、ユーザーエージェントは アイコンを表示しないか、代わりに汎用的な支払い手段のアイコンを表示してもよい。注記: 指定されたアイコンを取得 または復号できなかった場合、
iconMustBeShownは ここではfalseでなければならない。 そうでなければ、支払いが可能かどうかを 確認する手順がすでに失敗しているはずだからである。 -
paymentEntitiesLogosのurl項目によって表されるロゴ。 空でない場合に限る。-
ユーザーエージェントは、各
PaymentEntityLogoのlabelを表示する必要はないが、 アクセシビリティのために使用するべきである。labelは 引き続きCollectedClientAdditionalPaymentDataに含まれ、 署名の対象となる。
-
showOptOutが
true の場合、ユーザーエージェントは
ユーザーが指定された依拠当事者の
処理からオプトアウトしたいことを示す機会を提供しなければならない。
4.10.2. 取引確認 UX の結果
ユーザーエージェントは、処理を続行するかどうか、および どのように続行するかについて、次のいずれかをユーザーが示せるようにしなければならない。
- ユーザーがSPC 資格情報を使用して 認証し、支払いを続行することを希望する場合、
-
ユーザーが操作している
PaymentRequestに対して、 ユーザーが支払い要求を受け入れる アルゴリズムを実行する。 - ユーザーは支払いの続行を希望するが、
data["
credentialIds"]が 空であるため使用できないか、またはSPC 資格情報の使用を希望しない場合、 -
次の手順を実行する。
-
data["
credentialIds"]を 空のリストに設定する。注記: これにより、
PaymentRequest.show()の Promise が「NotAllowedError」DOMExceptionで拒否される。 § 4.11 支払い要求に応答する 手順を参照。 -
ユーザーが操作している
PaymentRequestに対して、 ユーザーが支払い 要求を受け入れるアルゴリズムを実行する。
-
- ユーザーが支払いの続行を希望しない場合、
-
ユーザーが操作している
PaymentRequestに対して、 ユーザーが支払い要求を中止する アルゴリズムを実行する。注記: これにより、
PaymentRequest.show()の Promise は「AbortError」DOMExceptionで拒否される。 - ユーザーが
指定された依拠当事者の処理からオプトアウトすることを希望する場合、 -
PaymentRequest.show()を 「OptOutError」DOMExceptionで拒否する。 § 12.7 ユーザーによるオプトアウトを参照。注記: この選択肢をユーザーに提供する必要があるのは、
showOptOutがtrueに設定されている場合のみである。
4.10.3. テスト自動化のサポート
現在の取引自動化モードが
「none」でない場合、ユーザーエージェントはまず
自動化コンテキスト内にあることを確認するべきである(
WebDriver のセキュリティに関する考慮事項を参照)。
その後、ユーザーエージェントは、前述の情報の伝達と
ユーザーの同意の取得を省略し、代わりに現在の
取引自動化モードの値に基づいて次の処理を行うべきである。
- "
autoAccept" -
ユーザーが取引の詳細を確認し、承諾したものとして動作する。
- "
autoChooseToAuthAnotherWay" -
ユーザーが取引の詳細を確認して承諾したものの、 認証にSPC 資格情報を 使用したくないことも示したものとして動作する。 data["
credentialIds"]が 空の場合、 これは「autoAccept」と同等である。 - "
autoReject" -
ユーザーが取引の詳細を確認して拒否した (つまり、取引を続行したくない)ものとして動作する。
- "
autoOptOut" -
ユーザーが取引の詳細を確認し、 オプトアウトしたいことを示したものとして動作する。
4.11. 支払い要求に応答する手順
この支払い方法の支払い要求に応答する手順は、
指定された
PaymentRequest
request と
SecurePaymentConfirmationRequest
data に対して、次のとおりである。
注記: これらの手順は、ユーザーが 取引確認 UXを受け入れた場合にのみ実行される。 ユーザーが支払い要求を受け入れる アルゴリズムによって呼び出される。
-
data["
credentialIds"]が 空の場合、 「NotAllowedError」DOMExceptionをスローする。 これにより、ユーザーが SPC を認証に使用できない場合、または 使用したくない場合の認証手続きの プライバシーが維持される。注記: ここで例外をスローすると、
PaymentRequest.show()の Promise は「NotAllowedError」DOMExceptionで拒否される。 -
request の関連する設定群オブジェクトの トップレベルオリジンを topOrigin とする。
-
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 が表示されたかを 依拠当事者に示す必要がある。 total-
request.[[details]]["
total"] instrument-
data["
instrument"] browserBoundPubKeyCredParams-
data["
browserBoundPubKeyCredParams"]
-
extensions を新しい
AuthenticationExtensionsClientInputs辞書とし、 そのpaymentメンバーを payment に設定し、その他のメンバーを data["extensions"]から設定する。 -
publicKeyOpts を新しい
PublicKeyCredentialRequestOptions辞書とし、そのフィールドは次のとおりとする。challenge-
data["
challenge"] timeout-
data["
timeout"] rpId-
data["
rpId"] userVerificationextensions-
extensions
注記: このアルゴリズムでは、
userVerificationの値を 「required」に固定している。これは Chrome の初期実装がサポートする値だからである。 現在の制約は将来変更される可能性がある。ワーキンググループは、 他の値(「preferred」や「discouraged」など)のサポートが有益となる ユースケースを実装者が共有することを歓迎する。 -
data["
credentialIds"]内の各 id について:-
descriptor を新しい
PublicKeyCredentialDescriptor辞書とし、 そのフィールドは次のとおりとする。typeid-
id
transports-
唯一のメンバーが
internalである、長さ1のシーケンス。
-
descriptor を publicKeyOpts["
allowCredentials"]に 付加する。
-
-
«["
publicKey" → publicKeyOpts]»を渡して、 資格情報を要求するアルゴリズムを実行した結果を outputCredential とする。注記: Chrome の初期実装では、
data.credentialIdsのリスト全体を資格情報を要求する処理に渡さない。 代わりに、リスト内から現在のデバイスに一致する資格情報を1つ選択し、それだけを渡す。注記: これにより、 [webauthn-3]の Get 動作が開始される。
-
outputCredential を返す。
5.
WebAuthn 拡張 - 「payment」
このクライアントの登録拡張および 認証拡張は、それぞれ資格情報が 安全な支払いの確認のために作成されるか、使用されるかを示す。
登録時、この拡張により、ブラウザーは 安全な支払いの確認の資格情報 ID を識別してキャッシュできる。 認証時には、この拡張によってサードパーティが 依拠当事者に代わって認証手続きを実行できるようになり、 署名された暗号文に取引情報も追加される。
特に、Web サイトはこの拡張を指定して
navigator.credentials.get()を
直接呼び出すべきではない。認証時、この拡張には
「secure-payment-confirmation」支払い方法を指定した
PaymentRequestからのみアクセスできる。
注記: 以前は、payment 拡張によって
オリジン間の iframe 内で資格情報を作成できた。
しかし、WebAuthn PR
#1801以降、この動作は WebAuthn でデフォルトで許可されている。
テスト
このテストは仕様の特定の行に直接対応するものではなく、 オリジン間の iframe 内から認証を開始できることを テストするものである。この動作は、それを禁止する 規定が存在しないことによって定められている。
- 拡張識別子
-
payment - 適用可能な操作
- クライアント拡張の入力
-
partial dictionary AuthenticationExtensionsClientInputs {AuthenticationExtensionsPaymentInputs ; };payment dictionary {AuthenticationExtensionsPaymentInputs boolean ;isPayment sequence <PublicKeyCredentialParameters >; // 認証時にのみ使用される。browserBoundPubKeyCredParams USVString ;rpId USVString ;topOrigin USVString ;payeeName USVString ;payeeOrigin sequence <PaymentEntityLogo >;paymentEntitiesLogos PaymentCurrencyAmount ;total PaymentCredentialInstrument ; };instrument isPayment-
拡張が有効であることを示す。
rpId-
登録時ではなく認証時にのみ使用され、Web 開発者が直接設定するべきではない。
topOrigin-
登録時ではなく認証時にのみ使用され、Web 開発者が直接設定するべきではない。
payeeName-
登録時ではなく認証時にのみ使用され、Web 開発者が直接設定するべきではない。
payeeOrigin-
登録時ではなく認証時にのみ使用され、Web 開発者が直接設定するべきではない。
paymentEntitiesLogos-
登録時ではなく認証時にのみ使用され、Web 開発者が直接設定するべきではない。
total-
登録時ではなく認証時にのみ使用され、Web 開発者が直接設定するべきではない。
instrument-
登録時ではなく認証時にのみ使用され、Web 開発者が直接設定するべきではない。
browserBoundPubKeyCredParams-
ブラウザーに紐付けられた鍵に使用する暗号アルゴリズムの 種類を制限する、許可された資格情報の種類のリスト。 認証時には、Web 開発者は代わりに
SecurePaymentConfirmationRequest.browserBoundPubKeyCredParamsを 設定するべきである。注記: このメンバーが存在しない場合、 デフォルト値は
PublicKeyCredentialCreationOptions.pubKeyCredParamsとなる。
- クライアント拡張の処理(登録)
-
-
ステップ3の後に、次のステップを挿入する。
-
次のいずれかが真の場合:
-
pkOptions["
authenticatorSelection"]["authenticatorAttachment"]が 「platform」でない。 -
pkOptions["
authenticatorSelection"]["residentKey"]が 「required」または 「preferred」でない。 -
pkOptions["
authenticatorSelection"]["userVerification"]が 「required」でない。
その場合、
TypeErrorをスローする。注記: これらの値が 固定されているのは、Chrome の初期実装が サポートする値だからである。現在の制約は将来変更される可能性がある。 ワーキンググループは、他の値のサポートが有益となる ユースケースを実装者が共有することを歓迎する。
-
-
-
ステップ13(
CollectedClientDataの作成)の前。テスト
-
bbk_allowed_algorithms を
browserBoundPubKeyCredParamsとする。 -
browserBoundPubKeyCredParamsが 空の場合、 bbk_allowed_algorithms をPublicKeyCredentialCreationOptions.pubKeyCredParamsとする。 -
bbk_allowed_algorithms を使用して 鍵ペアを作成する処理の結果を bbk_and_algorithm、bbk_id とする。
-
(bbk_and_algorithm, bbk_id)が null の場合、 以下の bbk_and_algorithm と bbk_public_key に関する手順を省略する。
-
bbk_and_algorithm を使用して ブラウザーに紐付けられた公開 鍵を取得する処理の結果を bbk_public_key とする。
-
-
ステップ13では、
CollectedClientDataを作成する代わりに、 次のフィールドを持つCollectedClientPaymentDataを 作成する。payment-
次のフィールドで初期化された
CollectedClientAdditionalPaymentRegistrationData。browserBoundPublicKey-
bbk_public_key - COSE_Key で符号化された公開 鍵。
- その他のフィールド
-
その他のすべてのフィールドは、元のステップ13に従って設定する。
-
ステップ22の「いずれかの認証器が 成功を示した」場合のステップ3において、pubKeyCred を返す直前に:
-
bbk_id と pubKeyCred.
[[identifier]]を使用して 鍵ペアを 紐付ける。 結果が失敗の場合、UnknownErrorを返す。 -
payment_outputs を
AuthenticationExtensionsPaymentOutputsとし、 次のものを含める。browserBoundSignature-
次のフィールドで初期化された
BrowserBoundSignature。signature-
bbk_and_algorithm と、 資格情報を 作成する ステップ14の clientDataJson を使用して、 ブラウザーに紐付けられた 署名を生成する処理の結果。
-
[[clientExtensionsResults]]["payment"]を payment_outputs に設定する。
-
-
- クライアント拡張の処理(認証)
-
AuthenticationExtensionsPaymentInputsextension_inputs を使用してアサーションを生成する際:-
「secure-payment-confirmation」支払い ハンドラー内でない場合、 「
NotAllowedError」DOMExceptionを返す。注記: これは、Web サイトが 取引確認 UXを経由せずに SPC の拡張された権限に アクセスしようとすることを防ぐ。
-
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)の実行中:-
options.rpId と effectiveDomain を比較するステップ6.1を省略する。
注記: これにより、 ドメイン間の認証手続きが可能になる。 § 1.1.2 加盟店による 認証の制御を参照。
-
ステップ10の前、
CollectedClientDataを作成する前に:-
allowed_algorithms を
SecurePaymentConfirmationRequest.browserBoundPubKeyCredParamsとする。 -
credential_id と allowed_algorithms を使用して ブラウザーに紐付けられた 鍵を取得または作成する処理の結果を bbk_and_algorithm とする。
-
-
ステップ10では、
CollectedClientDataを作成する代わりに、CollectedClientPaymentDataを 次のように作成する。-
typeを 「payment.get」に設定する。 -
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 を使用してブラウザーに紐付けられた 公開鍵を取得する処理の結果。bbk_and_algorithm が null の場合、このキーは設定しない。
-
その他のすべてのフィールドは、元のステップ10に従って設定する。
-
-
「いずれかの認証器が 成功を示した」処理中、
[[clientExtensionsResults]]を設定するステップ2において:-
payment_outputs を
AuthenticationExtensionsPaymentOutputsとし、 次のフィールドを持たせる。browserBoundSignature-
bbk_and_algorithm が null でない場合、 次のフィールドを持つ
BrowserBoundSignature。signature-
bbk_and_algorithm と、 資格情報を 作成する ステップ14の clientDataJson を使用して ブラウザーに紐付けられた 署名を生成する処理の結果。
-
[[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-
資格情報を作成した依拠当事者の ID。
注記: 歴史的な理由により、一部の 実装では、このパラメーターを
rpという名前でも含める場合がある。両方が存在する場合、rpとrpIdの値は同じでなければならない。 topOrigin-
取引の詳細への署名を要求したトップレベルコンテキストのオリジン。
payeeName-
存在する場合、ユーザーに表示された受取人の名前。
payeeOrigin-
存在する場合、ユーザーに表示された受取人のオリジン。
paymentEntitiesLogos-
取引ダイアログでユーザーに表示されたロゴ(存在する場合)。これらのロゴは、 この取引を仲介する主体を表すことを意図している。
total-
[payment-request] の
totalフィールドのPaymentCurrencyAmount。 instrument-
ユーザーに表示された支払い手段の情報。
browserBoundPublicKey-
ブラウザーに紐付けられた鍵の公開鍵の base64url 符号化。WebAuthn の Base64url 符号化を参照。
CollectedClientAdditionalPaymentDataには
paymentRequestOrigin フィールドが存在しないことに注意。
呼び出し元のフレームのオリジンは、
[webauthn-3] の
CollectedClientDataにすでに含まれているためである。
5.3. CollectedClientAdditionalPaymentRegistrationData
辞書
dictionary CollectedClientAdditionalPaymentRegistrationData {USVString ; };browserBoundPublicKey
CollectedClientAdditionalPaymentRegistrationData
辞書には、次の
フィールドが含まれる。
browserBoundPublicKey-
ブラウザーに紐付けられた鍵の公開鍵の base64url 符号化。WebAuthn の Base64url 符号化を参照。
6. ブラウザーに紐付けられた鍵のストア
これはユーザーエージェントが所有する内部コンポーネントであり、 SPC 資格情報(すなわちパスキー)との関連付けを含め、 プラットフォームに依存する暗号鍵ペアを管理する。各ブラウザーに 紐付けられた鍵のストアは、単一のユーザーエージェントが所有し、 デバイスとブラウザーの両方に紐付ける。各 ユーザーエージェントは、例えば複数のプロファイルを持つ場合、 複数のブラウザーに紐付けられた鍵のストアを保持できる。 この節では、ブラウザーに紐付けられた鍵の ストアと、ブラウザーに紐付けられた鍵ペアを作成、紐付け、取得し、 それを使用して署名する手順について説明する。
注記: ブラウザーに紐付けられた鍵のストアでは、 鍵ペアの生成、鍵ペアの取得、 公開鍵のエクスポート、署名の生成が必要となる。多くのオペレーティングシステムは、 これらの操作を実装する API を提供しており、利用可能な場合は デバイス上のセキュアエレメントに秘密鍵を保存する機能も提供する。例えば、 Android KeyStore、 Apple CryptoKit、または Windows Cryptography API: Next Generationがある。
注記: ブラウザーに紐付けられた鍵の要件と設計上の 考慮事項については、 BBK 要件文書に記載されている。 ブラウザーに紐付けられた鍵のストアとその手順の設計は、 これらの要件と考慮事項に基づいている。 要件文書では、ユーザーエージェントを指すために「インストールされたブラウザープログラム」という用語が 使用されている。 これは、その文書がブラウザーの実装を念頭に置いて書かれたためである。ただし、 要件と設計上の考慮事項は、 あらゆるユーザーエージェントの実装に適用できる。
ブラウザーに紐付けられた鍵のストアには、次のものが含まれる。
- browser_bound_map
-
資格情報 IDから鍵ペア識別子へのマップ。
注記: 各鍵ペア識別子は、最大でも1つの 資格情報 IDに関連付けることができる。
- keypair_map
-
鍵ペア識別子であるバイト配列から、公開鍵と秘密鍵の 鍵ペアと、 アルゴリズム識別子である
COSEAlgorithmIdentifierの タプルへのマップ。注記: ユーザーエージェントは、 keypair_mapと同等の機能を提供する暗号 API を 使用している場合があり、その場合、ユーザーエージェントは この部分を暗号 API に委ねることになる。
6.1. 鍵ペアの作成
PublicKeyCredentialParametersの
allowed_algorithms が与えられたとき、鍵ペアとその
COSEAlgorithmIdentifierの
タプル、
および鍵ペア識別子のバイト配列を返す鍵ペアを作成するには、
次の手順を実行する。
注記: 許可されたアルゴリズムまたはデフォルトの アルゴリズムから鍵ペアを生成する。
-
allowed_algorithms が空の場合、 このリストを 次の項目を順番に含むデフォルトのリストに設定する。
-
type=PublicKeyCredentialTypeで、alg= -7 ("ES256")。 -
type=PublicKeyCredentialTypeで、alg= -257 ("RS256")。
-
-
allowed_algorithms から、
PublicKeyCredential型でないすべての項目を 削除する。 -
allowed_algorithms から、ユーザーエージェントが サポートしていないすべての項目を 削除する。
注記: ユーザーエージェントは、 デバイスのプラットフォームごとに異なる暗号アルゴリズムの集合を サポートする場合がある。
-
allowed_algorithms のサイズが0の場合、 null を返す。
注記: この場合、ユーザーエージェントは ブラウザーに紐付けられた鍵の出力を 追加しない。
-
allowed_algorithms のサイズが0より大きい 場合:
-
chosen_algorithm を allowed_algorithms[0] とする。
-
chosen_algorithm に対応する確立された手順を使用して、 公開鍵と秘密鍵の鍵ペアを生成した結果を bbk とする。 確立された鍵生成アルゴリズムについては、IANA COSE アルゴリズムレジストリ [IANA-COSE-ALGS-REG]を参照する。 結果が失敗の場合、 null を返す。
-
bbk_and_algorithm をタプル (bbk, chosen_algorithm) とする。
-
bbk_id を次のいずれかとする。
-
次のように初期化されたバイト配列:
-
bbk_id を長さ32の配列とする。
-
getRandomValues(bbk_id) を呼び出す。
-
-
実装定義の鍵生成 手順から得られた鍵ペアハンドルを直列化したバイト配列。 このバイト配列は、後でブラウザーに紐付けられた 鍵を取得または作成する際に鍵を識別できなければならない。
注記: 多くの暗号 API は、 秘密鍵そのものではなく、識別子、ハンドル、または ラップされた鍵を公開鍵とともに返す場合がある。 例えば、秘密鍵がセキュアエレメントに保存されている場合、 秘密鍵はユーザーエージェントから直接アクセスできず、 使用するには識別子、ハンドル、またはラップされた鍵を 暗号 API の別の関数に渡す必要がある。
-
-
keypair_map[bbk_id] を bbk_and_algorithm に設定する。
-
(bbk_and_algorithm, bbk_id) を返す。
-
この仕様では、 まずハードウェアストレージ内のアルゴリズムを指定された順序で優先し、 次にソフトウェア内のアルゴリズムを同じ順序で優先するよう規定できる。 当面、Chrome はプラットフォームごとにハードウェアで1つの アルゴリズムのみをサポートする予定であるため、この問題は重要ではない可能性がある。 BBK のストレージの種類について、 許可するべきストレージの種類や、その種類を依拠当事者に公開することなども議論している 安全な支払いの確認の課題 #288を参照。
6.2. 鍵ペアの紐付け
鍵ペア識別子を含むバイト配列 bbk_id と、バイト配列 credential_id が与えられたとき、 失敗を返す可能性のある鍵ペアを紐付けるには、 次の手順を実行する。
注記: 資格情報 ID(すなわちパスキー識別子)について、 browser_bound_mapに ブラウザーに紐付けられた鍵の識別子を保存する。
-
browser_bound_map[credential_id] を bbk_id に設定する。
InvalidStateError、TypeError、 およびQuotaExceededErrorの エラーを捕捉し、失敗を返す。注記: エラーは、
write(buffer, options)などの 基盤となるファイルシステム操作からスローされる場合がある。 ここでは false が返されるため、ユーザーエージェントは 取引にブラウザーに紐付けられた鍵を含めないことになり、 この取引では依拠当事者はブラウザーに紐付けられた鍵を取得できない。 その後の支払いアサーションでは、新しい鍵ペアの 作成が試行される。
6.3. 鍵ペアの取得
バイト配列
credential_id と、
PublicKeyCredentialParametersの
リストである
allowed_algorithms が与えられたとき、
鍵ペアとその
COSEAlgorithmIdentifierの
タプルを返すブラウザーに紐付けられた
鍵を取得または作成するには、次を行う。
注記: 資格情報 IDに関連付けられた既存の鍵ペアを検索するか、 新しい鍵ペアを作成して関連付け、その鍵ペアとアルゴリズムを返す。
-
browser_bound_map[credential_id] が 存在する場合:
-
bbk_id をbrowser_bound_map[credential_id] とする。
-
bbk_and_algorithm をkeypair_map[bbk_id] とする。
-
-
browser_bound_map[credential_id] が 存在しない場合:
-
bbk_and_algorithm を返す。
6.4. ブラウザーに紐付けられた公開鍵の取得
鍵ペアと
COSEAlgorithmIdentifierの
タプルである
bbk_and_algorithm が与えられたとき、バイト配列を返す
ブラウザーに紐付けられた
公開鍵を取得するには、次を行う。
注記: ブラウザーに紐付けられた鍵の 符号化された公開鍵を取得する。
-
bbk を bbk_and_algorithm[0] とする。
-
algorithm を bbk_and_algorithm[1] とする。
-
public_key を、algorithm に対する確立された手順に従って bbk から取得した公開鍵とする。
-
encoded_public_key を public_key の COSE_Key 符号化とする。 WebAuthn の Web 認証 § 6.5.1 証明された資格情報データにある credentialPublicKeyを参照する。
-
encoded_public_key を返す。
6.5. クライアントデータへの署名
鍵ペアと
COSEAlgorithmIdentifierの
タプルである
bbk_and_algorithm とバイト配列
client_data_json が与えられたとき、バイト配列を返す
ブラウザーに紐付けられた署名を生成するには、次を行う。
注記:
CollectedClientData(
CollectedClientAdditionalPaymentDataまたは
CollectedClientAdditionalPaymentRegistrationDataを含む)に対して、
ブラウザーに紐付けられた
鍵の秘密鍵を使用して署名する。
-
bbk を bbk_and_algorithm[0] とする。
-
algorithm を bbk_and_algorithm[1] とする。
-
bbk の秘密 鍵を使用して、client_data_json に対して algorithm を実行した結果を signature とする。IANA COSE アルゴリズムレジストリ [IANA-COSE-ALGS-REG]を参照。
注記: 結果は、 bbk の秘密鍵を使用した、 client_data_json に対する暗号署名となる。
-
signature を返す。
7. 共通データ構造
次のデータ構造は、登録と認証の間で共有される。
7.1. PaymentCredentialInstrument
辞書
dictionary PaymentCredentialInstrument {required USVString ;displayName required USVString ;icon boolean =iconMustBeShown true ;USVString ; };details
PaymentCredentialInstrument
辞書には、ユーザーに表示され、
取引の詳細とともに署名される情報が含まれる。
次のメンバーが含まれる。
displayName-
ユーザーに表示される支払い手段の名前。
注記:
displayNameの 国際化に関する議論については、 § 14 国際化に関する考慮事項を参照。 icon-
支払い手段のアイコンの URL。
注記:
iconURL は、インターネットからアクセス可能なサーバー上の画像 (例えばhttps://bank.example/card.png)を識別するか、 Data URL [RFC2397]によってアイコンデータを直接符号化できる。 この2種類の URL のうち、Data URL は 依拠当事者にいくつかの利点を提供する。 信頼性を向上させることができる(例えば、 アイコンをホストするサーバーが利用できない場合)。 また、依拠当事者は、ブラウザーがユーザーに 何を表示したかについて暗号学的証拠を得られるため、 検証を強化できる。アイコンの URL はCollectedClientAdditionalPaymentData構造の一部として署名される。注記: 関連するアクセシビリティに関する考慮事項を参照。
iconMustBeShown-
要求が成功するために、指定されたアイコンを正常に取得して 表示する必要があるかどうかを示す。
details-
ユーザーに表示される支払い手段についての 任意の追加詳細文字列。
注記:
detailsの 国際化に関する議論については、 § 14 国際化に関する考慮事項を参照。
7.2.
PaymentEntityLogo 辞書
dictionary PaymentEntityLogo {required USVString ;url required USVString ; };label
PaymentEntityLogo
辞書には、現在の取引を仲介する支払い主体の
ロゴを記述する情報が含まれる。
次のメンバーが含まれる。
url-
ロゴの URL。
注記:
urlは、 インターネットからアクセス可能なサーバー上の画像 (例えばhttps://bank.com/logo.png)を識別するか、 Data URL [RFC2397]によってロゴデータを直接符号化できる。 この2種類の URL のうち、Data URL は 依拠当事者にいくつかの利点を提供する。 信頼性を向上させることができる(例えば、 ロゴをホストするサーバーが利用できない場合)。 また、依拠当事者は、ブラウザーがユーザーに 何を表示したかについて暗号学的証拠を得られるため、 検証を強化できる。ロゴの URL はCollectedClientAdditionalPaymentData構造の一部として署名される。 label-
ロゴを説明するラベル。ユーザーエージェントは このラベルをユーザーに表示してもよいが、必須ではない( § 4.10 取引確認 UX の表示を参照)。 アクセシビリティのために使用するべきである (例えば、UX 上のロゴを説明する際にスクリーンリーダーで 読み上げるため)。
8. 権限ポリシーとの統合
この仕様では、PaymentRequest
コンストラクターに従い、SPC 認証へのアクセスを制御するため、
[payment-request]の
「payment」
ポリシー識別子文字列を使用する。
この仕様の以前のバージョンとの後方互換性のため、
資格情報管理の
資格情報型レジストリを拡張し、
「payment」
ポリシー識別子文字列を、public-key 型の代替
作成権限ポリシーとして追加する。
この仕様の将来のバージョンでは、
この動作が完全に非推奨となる可能性がある。
注記:
[CREDENTIAL-MANAGEMENT-1]で規定されるアルゴリズムが、
実際の権限ポリシーの評価を行う。これは、そのようなポリシーの評価を
現在の設定群オブジェクトにアクセスできるときに
行う必要があるためである。
[[Create]](origin, options, sameOriginWithAncestors)および
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
内部メソッドは、
[CREDENTIAL-MANAGEMENT-1]で規定されるアルゴリズムによって
並列に呼び出されるため、そのようなアクセスはできない。
9. SPC 依拠当事者の操作
9.1. 認証アサーションの検証
安全な支払いの確認の認証手続きを実行するために、 依拠当事者は次のように進めなければならない。
-
credential を、 SPC caller による 安全な支払いの確認の支払い ハンドラーの呼び出しが成功した結果として返された
PublicKeyCredentialとする。注記: SPC は加盟店による 認証の制御を可能にするように設計されているため、 SPC を呼び出す主体が 依拠当事者であるとは限らない。この最初のステップでは、 SPC の呼び出し元が、SPC を通じて取得した資格情報を 依拠 当事者に返していることを前提としている。
-
次の変更を加えて、WebAuthn で 規定されるステップ3~21を実行する。
-
ステップ5で、credential.
idが、 依拠当事者から SPC caller に提供された 公開鍵資格情報のいずれかを識別することを検証する。 -
ステップ11で、C["
type"]の値が 文字列payment.getであることを検証する。 -
ステップ12で、C["
challenge"]の値が、 依拠当事者から SPC caller に提供された チャレンジの base64url 符号化と等しいことを検証する。 -
ステップ13で、C["
origin"]の値が、 依拠当事者が SPC の呼び出し元として想定している オリジンと一致することを検証する。 -
ステップ13の後に、次のステップを挿入する。
-
C["
payment"]["topOrigin"]の値が、 依拠当事者が想定するトップレベルオリジンと一致することを検証する。 -
C["
payment"]["payeeName"]の値が、 ユーザーに表示されるべき受取人の名前(存在する場合)と一致することを検証する。 -
C["
payment"]["payeeOrigin"]の値が、 ユーザーに表示されるべき受取人のオリジン(存在する場合)と一致することを検証する。 -
C["
payment"]["paymentEntitiesLogos"]の値が、 ユーザーに表示されるべきロゴ(存在する場合)の 厳密な順序付き部分集合であることを検証する。注記: ユーザーエージェントは すべてのロゴを表示しなくてもよいが、 ユーザーに表示されなかったロゴを
CollectedClientAdditionalPaymentDataに 含めてはならない。 -
C["
payment"]["instrument"]の値が、 ユーザーに表示されるべき支払い手段の詳細と一致することを検証する。
-
10. ユーザーエージェントの自動化
ユーザーエージェントの自動化と Web サイトのテストのために、この文書では 以下の[WebDriver2]の 拡張コマンドを定義する。 関係者は、[webauthn-3]の 同等の自動化に関する 節も参照するべきである。
10.1. SPC 取引モードの設定
SPC 取引モードの設定 WebDriver 拡張コマンドは、 ユーザーエージェントに対し、安全な支払いの確認を 取引確認 UXでのユーザーによる 承諾または拒否を自動的にシミュレートするモードにするよう指示する。
現在の取引自動化モードは、
SPC で現在有効な自動化モードを
追跡する。デフォルトは「none」である。
| HTTP メソッド | URI テンプレート |
|---|---|
| POST | /session/{session id}/secure-payment-confirmation/set-mode
|
リモートエンドの手順は次のとおりである。
-
parameters が JSON の Objectでない場合、 WebDriver エラーを返す。その際、 WebDriver エラーコードはinvalid argumentとする。
-
parameters から
"mode"という名前の プロパティを取得する処理の結果を mode とする。 -
mode がundefinedであるか、「
autoAccept」、 「autoChooseToAuthAnotherWay」、「autoReject」、または「autoOptOut」 のいずれでもない場合、 WebDriver エラーを返す。その際、 WebDriver エラーコードはinvalid argumentとする。 -
現在の取引自動化モードを mode に設定する。
-
データ
nullとともに成功を返す。
11. セキュリティに関する考慮事項
この仕様は WebAuthn を基盤として構築されているため、 WebAuthn のセキュリティに関する 考慮事項が 適用される。以下の小節では、この仕様が WebAuthn と異なる点について、安全な支払いの確認に固有の 現在のセキュリティ上の考慮事項を説明する。
11.1. オリジン間の認証手続き
安全な支払いの確認が WebAuthn と大きく異なる点は、 サードパーティが別の依拠当事者の資格情報を使用して 認証手続きを開始し、そのアサーションを サードパーティに返せることである。この機能により、 依拠当事者が ログイン攻撃と支払い攻撃の両方にさらされる可能性がある。 これらについて以下で説明する。
11.1.1. ログイン攻撃
安全な支払いの確認のために作成された資格情報は、有効な WebAuthn 資格情報であるため、依拠当事者が 特定のユーザーについて同じ資格情報を ログインと支払いの両方に使用することを望む場合がある。 受け取ったアサーションを慎重に検証しない場合、 依拠当事者のログインシステムに対する 潜在的な攻撃が可能になる。
攻撃は次のとおりである。
-
ユーザーが
attacker.exampleにアクセスする。これは加盟店サイトであるか、加盟店サイトを装っている。 -
attacker.exampleがrelyingparty.exampleからユーザーの資格情報を取得する。 正当な方法で取得するか、relyingparty.exampleまたはrelyingparty.exampleが資格情報を共有した別の主体から盗み取る。 -
attacker.exampleが SPC 認証を開始し、ユーザーが 取引に同意する(その取引は正当である場合も、そうでない場合もある)。 -
attacker.exampleは API 呼び出しで受け取った支払いアサーションを、relyingparty.exampleのログインエンドポイントに送信する。例えば、https://relyingparty.example/loginに POST を送信する。 -
relyingparty.exampleは不適切なアサーション検証コードを使用しており、 署名は確認するが、必要なフィールドの検証を怠る(以下を参照)。 そのため、ログイン試行を正当なものと判断する。 -
relyingparty.exampleは、例えばログイン Cookie をattacker.exampleに返す。 これにより、relyingparty.exampleにあるユーザーのアカウントが侵害される。
依拠当事者は、2つの方法でこの攻撃を防ぐことができる。
第一に、依拠当事者は、必要に応じて WebAuthn ログインまたはSPC 支払いの正しいアサーション検証手順に 常に従わなければならない。特に、次のフィールドはすべて 資格情報の不適切な使用を検出するために使用できる。
-
CollectedClientData["type"] - ログインの場合は "webauthn.get"、 SPC の場合は "payment.get"。 -
CollectedClientData["challenge"] - この値は、 WebAuthn または SPC の呼び出しに先立って、 依拠当事者のサーバーからサイトに提供されるべきであり、 事前に提供された適切な想定値と一致することを 検証するべきである。 -
CollectedClientData["origin"] - SPC がオリジン間で実行される場合、 この値には呼び出し元のオリジンが含まれる (例えば、上記の例ではattacker.example)。
第二に、依拠当事者は、支払い用とログイン用の
資格情報を分離することを検討できる。その場合、
依拠当事者は、
安全な支払いの確認の資格情報をサブドメイン
(例えば https//payment.relyingparty.example)でのみ登録し、
データベース内でも支払い用資格情報と
ログイン用資格情報を分離するべきである。
payment
拡張を指定して作成された資格情報のみが SPC 認証に
使用できる。将来、これを反映するように
仕様が更新される可能性がある。
現在の実装と仕様の両方において、
paymentを指定して作成された資格情報は、
依拠当事者が望む場合、ログインにも使用できる。
この点は変更されない見込みである。
11.1.2. 支払い攻撃
安全な支払いの確認のアサーションは、進行中のオンライン取引の 一部でない限り、実質的に役に立たない。
さまざまな仕組みによって、悪意のあるサードパーティが ユーザーアカウントを乗っ取ろうとする代わりに、 安全な支払いの確認の資格情報(正当または不正な方法で取得したもの)を使用して 未承認の支払いを開始する攻撃から保護される。
-
攻撃者が SPC を開始すると、ユーザーエージェントは 取引の詳細(受取人や金額を含む)を明確に示す UI を ユーザーに表示する。この状況では、ユーザーは「キャンセル」する可能性が高い。
-
ユーザーが取引に同意し、続く WebAuthn の認証手続きを完了した場合、攻撃者は 依拠当事者向けの署名された SPC アサーションを入手する。
-
依拠当事者が取引を想定していない場合、 アサーションを拒否する。
-
依拠当事者が取引を想定している場合、 少なくとも次のいずれかを検出してアサーションを拒否する。
-
攻撃者が進行中の正当な支払いと競合しようとする場合、
CollectedClientData["challenge"]が 正しくない。 -
攻撃者がユーザーと正当な加盟店サイトの間に入り、 アサーションを転送しようとする場合、
CollectedClientData["origin"]が 正しくない。
-
11.1.3. WebAuthn 拡張は依拠 当事者に対してのみ許可される
WebAuthn では、認証手続き中に 認証拡張を使用できる。 一部の拡張は、依拠当事者にとって 機密性の高いデータを認証器に保存したり、そこから取得したりするために使用できる。
安全な支払いの確認の認証手続きでは、サードパーティ (呼び出し元)が別の依拠当事者が所有する資格情報の認証手続きを開始できる。 呼び出し元が任意の WebAuthn 拡張を指定できる場合、 依拠当事者に属する機密データのうち、 依拠当事者が 呼び出し元と共有する意図のないデータにアクセスできる可能性がある。
例えば、largeBlob 拡張では、大量のデータを
保存および取得できる。攻撃者が
largeBlob 拡張を指定して SPC の認証手続きを開始できた場合、
ユーザーがその手続きを承認すれば、依拠当事者が
そこに保存したデータを読み取れる可能性がある。
このリスクを軽減するため、安全な支払いの確認では オリジン間の認証手続きで WebAuthn 拡張を使用することを禁止する。 呼び出し元が依拠当事者である場合にのみ許可される。
11.2. 加盟店が提供する認証データ
銀行は、受け取った認証アサーションを検証することによって、 それが加盟店から提供された取引の詳細と 一致することを確認し、なりすましから保護できるし、 そうするべきである。
これは、この仕様のサードパーティによる認証手続きの結果として、 正当な取引(すなわち依拠当事者が想定している取引)であっても、 サードパーティがユーザーに表示される取引の詳細を提供するためである。
-
取引金額と通貨
-
支払い手段の名前とアイコン
-
受取人の名前とオリジン
これにより、加盟店がユーザーに誤った データを提示するなりすまし攻撃が発生する可能性がある。例えば、加盟店は 銀行に対して(バックエンドで)100ドルの購入を開始すると伝えながら、 SPC API には1ドルを渡し(その結果、ユーザーには確認対象として1ドルの取引を表示し)得る。 また、加盟店は正しい取引の詳細を提供しながら、 依拠当事者が 想定するものと一致しない安全な支払いの確認の資格情報を渡すこともあり得る。
実際には、安全な支払いの確認により、この種の攻撃を防ぐことは 現在の Web よりも容易になる。現在のオンライン決済では、銀行は 加盟店が決済フローで正しい金額をユーザーに表示したことを 信頼しなければならない(不正が発覚するのは支払い後、 ユーザーが口座明細を確認したときである)。
11.3. 攻撃者が生成したブラウザーに紐付けられた鍵
依拠当事者(銀行など)は、認証 アサーションを検証することで、攻撃者が生成した BBK から保護できるし、 そうするべきである。その際、BBK の公開鍵を含むアサーションを検証し、 署名が無効な暗号文に含まれる BBK 公開鍵を無視する。 SPC 資格情報と BBK からそれぞれ1つずつ、 合計2つの署名が存在するが、アサーションは BBK に加えて パスキーを使用して検証するべきである。 BBK は追加の署名を提供するものであり、パスキーの署名を 置き換えるものではない。
加盟店を装う攻撃者は、BBK の公開鍵を、 対応する秘密鍵を攻撃者が制御する別の公開鍵に置き換えようとする可能性がある。 その後、攻撃者はユーザーになりすまして加盟店の Web サイトにアクセスし、 加盟店が SPC を呼び出した際に、攻撃者の秘密鍵を使用して SPC の暗号文に署名する。これにより、攻撃者は BBK のデバイス紐付けの仕組みを破ったことになる。
しかし、この攻撃は実行不可能である。
-
攻撃者が BBK を置き換える場合: 依拠 当事者は、パスキーの公開鍵を使用して
CollectedClientData(BBK 公開鍵を含む)を検証する際に、署名の不一致を検出する。 依拠 当事者は、この取引を拒否し、この BBK 公開鍵を 信頼できないものとして扱うべきである。 -
攻撃者がユーザーになりすまそうとする場合: 依拠 当事者は、 パスキーの公開鍵を使用した検証で署名の不一致を検出する。 依拠当事者は、この BBK 公開鍵を引き続き 信頼できないものとして扱うべきである。
11.4. ユーザーによる有効化要件の欠如
§ 4.3 ユーザーによる有効化要件の変更で 説明されているように、ユーザーエージェントがユーザーによる有効化を 必須としない場合、追加のセキュリティ対策を検討するべきである。 ユーザーによる有効化を必須としないことで、 ユーザーが直前にページを操作しなくても安全な支払いの 確認のフローを開始できるようになり、スパムやクリックジャッキング攻撃の リスクが増大する。
スパムを軽減するために、ユーザーエージェントは、 例えば現在のページでユーザーによる有効化なしに 安全な支払いの確認のフローがすでに表示された後など、 一定のしきい値を超えた場合にユーザーによる有効化要件を 強制することを決定してもよい。クリックジャッキング攻撃を軽減するために、 ユーザーエージェントは、ダイアログが表示された直後のクリックを 無視する時間的なしきい値を実装してもよい。
もう1つの関連する対策は、
PaymentRequest.show()に存在する。
Payment Request API では文書が表示状態であることが要求されるため、
バックグラウンドのタブ、最小化されたウィンドウ、その他の同様に
非表示の状態から SPC を開始することはできない。
12. プライバシーに関する考慮事項
この仕様は WebAuthn を基盤として構築されているため、 WebAuthn のプライバシーに関する考慮事項が 適用される。以下の小節では、この仕様が WebAuthn と 異なる点について、安全な支払いの確認に固有の 現在のプライバシーに関する考慮事項を説明する。
12.1. 資格情報 ID の探索
WebAuthn の認証 手続きのプライバシーに関する節に従い、安全な支払いの確認の実装者は、 悪意のある呼び出し元(もはや依拠当事者でさえない場合がある)が、 次の状況を区別できないようにしなければならない。
-
資格情報が利用できない。
-
資格情報は利用可能だが、ユーザーがその使用に同意しない。
上記の状況を区別できる場合、情報が漏洩し、 悪意のある依拠当事者が、利用可能な 資格情報を探索することによって ユーザーを識別できる可能性がある。
安全な支払いの確認では、常に
取引確認 UXを表示し、
利用可能なSPC 資格情報がない場合と、
SPC 資格情報は利用可能だが
ユーザーが使用しないことを選択した場合の両方で、
同じエラー(「NotAllowedError」
DOMException)を返すことで、
このリスクを軽減する。
12.2. 異なる支払い手段の関連付け
依拠当事者が、あるユーザーについて複数の 支払い手段で同じ資格情報を使用する場合、通常は関連付けられない 支払い手段の情報を加盟店が関連付けられる可能性がある。つまり、 ユーザー U が支払い手段 P1 と P2 を使用して行う2つの 異なる取引(同じ加盟店 M、または共謀する2つの加盟店 M1 と M2)において、 加盟店は P1 と P2 が同じユーザーのものであると知ることができる。
現在の多くのオンライン決済フローでは、これは大きな リスクではない可能性がある。ユーザーは通常、 この関連付けを行うのに十分な情報(名前、メールアドレス、 配送先住所など)をすでに提供しているためである。
しかし、識別情報が少ない支払い方法 (トークン化など)が一般的になった場合、 エコシステムの関係者がユーザーのプライバシーを保護するための 措置を講じることが重要である。例えば:
-
決済システムは、サードパーティによる資格情報 ID や BBK 公開鍵の 保存を制限する規則を設けることが考えられる。
-
依拠当事者が1つの SPC 資格情報に 複数の支払い手段を割り当てる場合、その資格情報 ID を 他の主体と共有しないことを選択できる。この場合でも、 依拠当事者は SPC 資格情報自体を ファーストパーティまたはサードパーティのコンテキストで使用して、 ユーザーを認証できる。
-
依拠当事者(銀行など)は、 支払い手段ごとに異なる SPC 資格情報をユーザーが登録できるようにする場合がある。 ただし、それによって依拠 当事者が内部でそれらのアカウントを関連付けることは妨げられない。
12.3. 追跡手段としての資格情報 ID
1つの支払い手段についても、 依拠当事者が返す資格情報 ID は、 サイトをまたいで使用できる強力な識別子であるため、 悪意のある主体によって追跡手段として使用される可能性がある。 しかし、加盟店が依拠当事者からこれらを取得するには、 すでに同等に強力な識別子(クレジットカード番号など)を 依拠当事者に提供する必要がある。
12.4. 追跡手段としてのブラウザーに紐付けられた鍵
BBK 公開鍵は、SPC の各支払いアサーション時 (および最初のファーストパーティでのSPC 資格情報の作成時に1回)にのみ返される。 しかし、加盟店が BBK を取得するには、SPC を開始するために 依拠当事者から 資格情報 ID を取得し、ユーザーがパスキーを使用して 取引を認証する必要がある。BBK 公開鍵へのアクセスには まず資格情報 ID へのアクセスが必要なため、BBK 公開鍵は 追加の追跡可能性をもたらさない。
12.5. securePaymentConfirmationAvailability によるフィンガープリンティング
securePaymentConfirmationAvailability
API には、フィンガープリンティングの
リスクがある。特定のフレームで安全な支払いの確認
API が利用できない具体的な理由を、ユーザーに通知せずに返せるためである。
これらの理由によって重要な情報が漏洩するとは考えられていないが、
次の点を考慮するべきである。
-
unavailable-feature-not-enabled: ユーザーエージェントがどのような条件で安全な支払いの確認を 利用可能または利用不可と判断するかによって、 フィンガープリンティングのリスクがある。 ユーザーエージェントには、この仕様を実装する場合、 すべてのユーザーに安全な支払いの確認を提供するか、 少なくとも追加のフィンガープリンティングが不可能な程度に 十分な規模のユーザー集団に提供することが推奨される。 例えば、特定の OS のすべてのユーザーに 安全な支払いの確認を提供し、他の OS には提供しない場合、 フィンガープリンティングのリスクは、ユーザーエージェント文字列がすでに 明らかにしている情報の範囲内に抑えられる。 -
unavailable-no-permission-policy: 追加のフィンガープリンティングのリスクはない。 「payment」 権限ポリシーは、PaymentRequestオブジェクトの構築を試みることで、すでにユーザーに通知せずに検出できる (権限ポリシーが有効でない場合、構築時にエラーがスローされる)。 -
unavailable-no-user-verifying-platform-authenticator: 既存のisUserVerifyingPlatformAuthenticatorAvailableAPI を超える追加のフィンガープリンティングのリスクはない。
上記の考慮事項に加えて、この仕様では、
ユーザーエージェントがユーザーのプライバシーを保護したい場合、
具体的な理由が判明していても
unavailable-unknown-reasonを
返すことを選択できる。例えば、ユーザーエージェントが
現在のフレームですでにフィンガープリンティングのリスクがある
他の API にアクセスしたことを検出した場合に、
このような対応が行われる可能性がある。
12.6. getSecurePaymentConfirmationCapabilities によるフィンガープリンティング
getSecurePaymentConfirmationCapabilities
API には、フィンガープリンティングの
リスクがある。ユーザーのデバイスの機能や
機能の欠如に関する具体的な情報を、ユーザーに通知せずに返せるためである。
このリスクを軽減するため、ユーザーエージェントは、
false の値を返すよりも、返されるレコードから
キーを省略することを優先するべきである。
キーを省略すること(§ 4.7 安全な支払いの確認の
機能の利用可能性で説明)は、
機能がサポートされていないことを明示的に確認する場合よりも、
フィンガープリンティングに利用できる情報を減らす。
ユーザーエージェントは、ユーザーのプライバシーを保護するために、
サポートしている機能であっても省略することを選択してよい。
SecurePaymentConfirmationCapabilityに
列挙された特定の機能に関する考慮事項:
-
browserBoundKeyHardware: ユーザーのデバイスにハードウェアセキュリティチップがあることを 明らかにするリスクがある。この情報は、 [DBSC]などの 他の Web API を通じて、すでにユーザーに通知せずに取得できる可能性がある。
12.7. ユーザーによるオプトアウト
API オプションの
showOptOutは、
依拠当事者による情報の保存からオプトアウトしたいという意思を
ユーザーが示せる手段を提供するよう、
ユーザーエージェントに指示する。ユーザーがこのオプトアウトを実行すると、
OptOutErrorが
呼び出し元に返され、ユーザーのオプトアウトの意思が示される。
その後、呼び出し元は、例えばユーザーについて保存されている
支払い情報を消去するなど、オプトアウトに対応する責任を負う。
実装者は、OptOutErrorが
返されることによって、
ユーザーが資格情報を持っているものの認証を完了しなかったことが
明らかにならないようにしなければならない。
これは§ 12.1 資格情報 ID の探索と同様の手段で軽減できる。
例えば、資格情報の一致が見つからない場合でも、
中間画面の UX でユーザーに
オプトアウトの機会を提供する。
これはブラウザーデータや資格情報を削除する仕組みではなく、 開発者がユーザーエージェントを通じてオプトアウトを促すためのものである。 ユーザーエージェントは、例えば次のような説明文によって、 そのことをユーザーに明確にするべきである。 「このプロバイダーは、お客様の支払い方法に関する情報を保存している可能性があります。 その情報の削除を要求できます。」
12.8. ロケールによるフィンガープリンティング
locale
メンバーには、フィンガープリンティングのリスクがある。
安全な支払いの確認のダイアログで使用されるロケールが、
ユーザーに通知されずに明らかになる可能性があるためである。
これを行うため、攻撃者は異なるロケールを指定した複数の
安全な支払いの確認の要求を作成し、
PaymentRequest.canMakePayment()の
呼び出しがエラーで拒否されるかどうかを観察し、
安全な支払いの確認のダイアログで使用される
ロケールを特定できる。
安全な支払いの確認のダイアログで使用されるロケールが比較的まれな場合、 攻撃者がユーザーを一意に識別する手段となり得る。
これはフィンガープリンティングの手段となるが、 このロケールはすでに他の API を通じて公開されている可能性があることに注意 (例えば、HTML § 8.10.1.2 言語設定)。
13. アクセシビリティに関する考慮事項
ユーザーエージェントは、
iconと
displayNameを
一緒に表示する。依拠当事者は、
displayNameを通じて十分な情報を提供することで、
アイコンの表示におけるアクセシビリティを確保する
(例えば、アイコンが銀行を表す場合は、
displayNameに銀行名を含める)。
この仕様を実装するユーザーエージェントは、 WebAuthn のアクセシビリティに関する 考慮事項と PaymentRequest のアクセシビリティに関する考慮事項の両方に従うべきである。
14. 国際化に関する考慮事項
API の呼び出し元は、
locale
メンバーを使用して、取引ダイアログのロケールを
API の入力として提供する表示可能な文字列
(例えば displayName)のロケールと一致させるべきである。
特に、呼び出し元は次のようにするべきである。
-
localeの 値(指定されている場合)と表示可能な 文字列の言語との一貫性を 保つようにする。 -
PaymentRequest.canMakePayment()を使用して、 安全な支払いの確認のダイアログがlocaleに設定された ロケールで表示されるかどうかを判定する。 -
追加の言語サブタグを含むロケールで一致が見つからない場合、 第一言語サブタグのみを含む言語タグ (例えば
"en")にフォールバックする。 -
提供された表示可能な文字列内での書字方向の変更が、 文字列の表示時に正しくレンダリングされることを保証する (詳細については、 双方向テキストに Unicode 制御文字を使用する方法および 基本方向のインライン 変更を参照)。
実装(および値を表示しようとするその他の処理)は、 表示可能な文字列値をユーザーインターフェイスに挿入する際、 その周囲に双方向分離を適用するべきである。 書字方向がわかっている場合はそれを設定し、 わからない場合は最初の強い文字に基づく方式("auto")をデフォルトとするべきである。
15. IANA に関する考慮事項
この節では、[RFC8809]によって設立された IANA「WebAuthn 拡張識別子」レジストリ [IANA-WebAuthn-Registries]に、 以下の拡張 識別子を追加する。
-
WebAuthn 拡張識別子: payment
-
説明: この拡張は、安全な支払いの確認 API で定義される次の機能をサポートする。 (1) オリジン間の iframe 内で資格情報を作成できるようにする。 (2) 依拠当事者以外の主体が、その資格情報を使用して 依拠当事者に代わって認証手続きを実行できるようにする。 (3) ブラウザーが安全な支払いの確認の資格情報を識別してキャッシュできるようにする。 SPC と Web 認証の重要な違いについては、特に § 11 セキュリティに関する 考慮事項および§ 12 プライバシーに関する考慮事項を参照。
-
仕様文書: この仕様の§ 5 WebAuthn 拡張 - "payment"
-
注記: 登録は、Web Authentication Working Group との 2023年5月3日の議論に従う。