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に格納する必要があります。これにはいくつかの課題があります:
-
challengeフィールドの誤用となる(本来リプレイ攻撃防止用)。 -
仕様が存在せず、各銀行が独自の決済情報フォーマットやchallengeへのエンコード方法を考案する必要があり、導入の複雑化や断片化を招く。
-
規制要件でユーザーへの決済情報表示や同意記録が必要とされる場合があり、プレーンな[webauthn-3]では
challenge利用に表示指定UXがなく対応できない。
これらの限界は次の安全な決済確認の振る舞いを動機付けています:
-
プレーン[webauthn-3]と同様、
challengeフィールドはリプレイ攻撃防止のみに使用する。 -
SPCで決済情報のフォーマットを規定する。これにより汎用的な検証コードやテスト群の開発が可能となる。
-
SPCにより、ユーザーエージェントが決済情報を必ずユーザーに提示したこと、および悪意あるウェブサイトや信頼されたサイト上の悪意あるJavaScriptコードによる迂回ができないことを保証する。
-
決済情報は
CollectedClientData辞書に格納され、JavaScriptで改ざんできません。
注: 今日、ブラウザ経由のweb決済は、TLSやiframe等ウェブ機能で十分信頼されており、現行仕様はweb決済の安全性と利便性向上を目的としています。
-
1.1.2. 加盟店による認証管理
加盟店はチェックアウト時のユーザー離脱を避け、特に認証摩擦の軽減を目指します。Relying Party(例:銀行)が[webauthn-3]による認証を利用する際、iframe内で実行するのが一般的です。しかし加盟店は、Relying Partyによる認証結果の検証は維持しつつ、認証体験の管理を望んでいます。
この制限を踏まえ、安全な決済確認では次の振る舞いを導入します:
-
SPCではRelying Party以外の事業体もRelying Partyの代理として認証情報を利用可能。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. チェックアウト時の登録
これは初回フローで、新規認証情報が発行銀行によって加盟店のチェックアウト時に作成・保存されます。
-
ユーザーは
merchant.exampleにアクセスし、購入商品を選択した後、チェックアウトフローに進みます。支払い手段情報を入力し、支払い意思(例: 「支払う」ボタン押下)を示します。 -
加盟店は支払い手段発行銀行と帯域外通信(例:他のプロトコル)でやり取りし、銀行はユーザーの認証を要求し、加盟店に銀行制御のURLをiframeで開くよう提供します。
-
加盟店は
bank.exampleへのiframeをallow属性"publickey-credentials-create"付きで開きます。 -
銀行iframe内で、銀行は従来方式(例: SMS・OTP)でユーザー本人性を確認後、SPC認証への登録をユーザーに勧めます。
-
ユーザーは銀行UXの「登録」ボタンなどで同意し、銀行はiframe内で下記例のコードを実行します。
-
ユーザーはWebAuthn登録フローを経て、新規認証情報を銀行へ返送。銀行はその認証情報を自サーバ側DBにユーザー・支払い手段に紐付け保存します。
-
認証終了後、銀行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)を利用する場合のフローです。
-
ユーザーは
merchant.exampleにアクセスし、商品を選択してチェックアウトフローに進みます。支払い手段情報を入力し、支払い意思(例:「支払う」ボタン押下)を示します。 -
加盟店は支払い手段の発行銀行と帯域外通信(例:他のプロトコル)でやり取りします。発行銀行はユーザーの認証を要求し、同時に加盟店へSPC対応を伝え、API利用に必要な情報(チャレンジや当該ユーザー・支払い手段に関連付けられた認証情報ID群等)を提供します。
-
加盟店は以下のサンプルコードを実行します。
-
ユーザーはSPC UXで表示される決済情報に同意し、続けてWebAuthn認証セレモニーを実施します。署名済み暗号文が加盟店に返送されます(
AuthenticationExtensionsPaymentOutputsでブラウザバウンドキーの出力も含まれる)。 -
加盟店は署名済み暗号文を発行銀行へ帯域外で送付します。発行銀行は暗号文を検証し、ユーザーが有効であること、どんな決済情報を表示したか、取引へ同意したかを把握します。発行銀行は取引を承認し、加盟店はユーザーのチェックアウト処理を終えます。発行銀行はブラウザバウンドキーの公開鍵、
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では両方
name
と
displayName
が必須ですが、userメンバーの定義により、その後の認証時に両方を表示する必要はありません。2023年10月時点では
name
の方が一貫して表示されます。開発者は各実装の動向に注意してください。
4. 認証 - セキュアペイメント確認決済方式
セキュアペイメント確認を通じて決済を認証するために、本仕様は以下を定義します:
-
決済ハンドラー、すなわちセキュアペイメント確認決済ハンドラー、与えられた決済の認証要求を処理します。
-
本決済ハンドラーのための標準化済み決済方式識別子である "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"
4.2. Payment Requestコンストラクタの変更
PaymentRequestオブジェクトのコンストラクタの手順で、新たなステップを4.3の後に追加:
-
決済方式の処理:[サブステップ1-3省略]
-
seenPMIsに"secure-payment-confirmation"が含まれ、かつseenPMIsのサイズが1を超える場合、
RangeErrorをthrowする。
-
4.3. ユーザーアクティベーション要件の変更
PaymentRequest.show()
メソッドの手順で、ステップ2と3を修正:
-
関連グローバルオブジェクトがrequest のもので、一時的アクティベーション(transient activation)がない場合、ユーザーエージェントは次を実施可能:
-
拒否されたPromiseを返すが、その理由は
"SecurityError"DOMException。
-
-
そうでなければ、ユーザーアクティベーションの消費を関連グローバルオブジェクトで行う。
注: これにより、ユーザーエージェントはユーザーアクティベーション不要となり、例えばリダイレクト認証フローでリダイレクト時点にアクティベーションがなくても対応できる。セキュリティ面は§ 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-
リプレイ攻撃防止のため、Relying Partyがサーバ側で生成する乱数チャレンジ。
rpId-
認証情報のRelying Party識別子。
credentialIds-
与えられた支払い手段の認証情報IDリスト。
instrument-
登録画面表示や取引詳細署名時に利用する手段の名称とアイコンの説明。
timeout-
取引詳細署名要求のタイムアウトまでのミリ秒数。最大1時間。デフォルト値・許可範囲はユーザーエージェントが決定。Web Authenticationは追加タイムアウト指針あり。
payeeName-
本SPC呼び出し対象の受取人(加盟店等)の表示名。任意。
payeeOriginと併用・代用可能。 payeeOriginpaymentEntitiesLogos-
本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"
を返しても良い。
-
ユーザーエージェントがセキュアペイメント確認非対応、または対応だがユーザーエージェント固有の仕組みで機能無効の場合、 "
unavailable-feature-not-enabled" を返す。 -
documentで"payment"パーミッションポリシーが未有効なら、 "
unavailable-no-permission-policy" を返す。 -
ユーザー認証可能プラットフォーム認証器がない場合、 "
unavailable-no-user-verifying-platform-authenticator" を返す。 -
他にセキュアペイメント確認機能が稼働しない理由あれば、 "
unavailable-unknown-reason"を返す。 -
"
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について、以下の通りです:
テスト
-
data["
credentialIds"] が空の場合は、RangeErrorをthrowする。 -
data["
credentialIds"]内の各idに対し:-
idが空の場合は
RangeErrorをthrowする。
-
-
data["
instrument"]["displayName"] が空の場合はTypeErrorをthrowする。 -
data["
instrument"]["icon"] が空の場合はTypeErrorをthrowする。 -
data["
instrument"]["icon"] に URLパーサーを実行する。失敗ならTypeErrorをthrow。 -
data["
instrument"]["details"] が存在し、空の場合はTypeErrorをthrowする。 -
data["
payeeName"]と data["payeeOrigin"] の両方が省略されている場合、TypeErrorをthrow。 -
data["
payeeName"]または data["payeeOrigin"] のいずれかが存在し、空の場合、TypeErrorをthrow。 -
data["
payeeOrigin"] が存在する場合:-
parsedURLを、URLパーサーでdata["
payeeOrigin"] に対し実行して得る。 -
parsedURLが失敗なら
TypeErrorをthrow。
-
-
data["
paymentEntitiesLogos"] が存在し、空でない場合: -
注:
localeは特定入力メンバーに対する言語や方向性メタデータとは異なり、呼び出し元要求のローカライズ体験表現であり特定文字列値への主張ではない。 詳しくは§ 14 国際化の考慮参照。
4.8. 支払い可能か確認手順
この決済方式の支払い可能か確認手順は、
入力SecurePaymentConfirmationRequest
dataについて、以下の通りです:
テスト
-
data["
payeeOrigin"] が存在する場合:-
parsedURLをdata["
payeeOrigin"]に URLパーサーを実行して得る。 -
parsedURLが失敗でないことを保証する。
-
parsedURLのschemeが"
https"であることを保証する。
注: これらの事前条件は以前決済方式データの検証手順でチェックされていた。
-
data["
payeeOrigin"] をparsedURLのオリジンのシリアル化結果に設定する。
-
-
アイコン画像リソースをフェッチし、«["
src" → data["instrument"]["icon"]]»をimageに渡す。失敗した場合:-
data["
instrument"]["iconMustBeShown"] がtrueならfalseを返す。 -
それ以外ならdata["
instrument"]["icon"]を 空文字列に設定する。注: 指定されたアイコンが表示されなかったことをRPに通知(出力
instrumentのicon文字列が空になる)。
注: 画像リソースは認証情報一致の有無にかかわらずフェッチされ、認証情報ID存在のプロービング対策となる。
-
-
ユーザーエージェントは任意でdata["
paymentEntitiesLogos"] のエントリーをリスト末尾から削除可能。注: ユーザーエージェントは表示ロゴ数を自身で調整可能。ロゴは表示優先度降順維持。
-
data["
paymentEntitiesLogos"]の各logoについて:-
logo画像リソースをフェッチし、«["
src" → logo["url"]]»をimageに渡し、結果をデコードする。 -
フェッチまたはデコード失敗ならlogo["
url"]を空文字列に設定。注: 指定ロゴが表示されなかったことをRPに通知(出力
paymentEntitiesLogosシーケンス内の当該logoのurlが空文字になる)。
注: ロゴリソースも認証情報一致の有無にかかわらずフェッチされ、認証情報ID存在のプロービング対策となる。
-
-
data["
credentialIds"]の各idについて:-
認証情報が現デバイスで利用可能かサイレント判定する手順をdata["
rpId"]とidで行う。結果がfalseならidをdata["credentialIds"]から削除。 -
data["
rpId"]がrequestのオリジンでない場合は、 SPC認証情報がサードパーティ対応かサイレント判定する手順をdata["rpId"]とidで行い、結果がfalseならidをdata["credentialIds"]から削除。
-
-
trueを返す。
4.9. 取引確認UXの表示
PaymentRequest.show()
が呼び出され、Secure Payment Confirmation payment
handlerが選択された場合(当該アルゴリズムのステップ19–24)、ユーザーエージェントはユーザーに対して、続行するかどうかおよびどのように続行するかを選択できるユーザーインターフェイスを必ず提示しなければなりません。
4.9.1. ユーザーに提示される情報
ユーザーエージェントの実装の選択肢を制限しないために、本仕様は特定のユーザーインターフェイスの表示を要求しません。しかし、Relying
PartyがCollectedClientPaymentData
に含まれる情報を信頼できるようにするため、ユーザーエージェントは次の事項がユーザーに伝えられ、認証に対するユーザーの同意が収集されることを保証しなければなりません:
-
存在する場合は
payeeNameを表示すること。 -
存在する場合は
payeeOriginを表示すること。 -
instrumentの詳細、すなわち決済手段のdisplayName、detailsおよびiconを表示すること。 入力のiconから画像リソースをフェッチまたはデコードできなかった場合、ユーザーエージェントはアイコンを表示しないか、汎用の決済手段アイコンを代わりに表示してよい。注: 指定されたアイコンをフェッチまたはデコードできなかった場合、
iconMustBeShownはここではfalseでなければならない。そうでないと支払い可能か確認する手順が先に失敗しているはずだからである。 -
非空の場合は、
urlエントリで表されるpaymentEntitiesLogosのロゴを表示すること。-
ユーザーエージェントは各
labelを必ず表示する必要はないが、アクセシビリティの目的で使用するべきである。labelは引き続き含まれ、CollectedClientAdditionalPaymentDataに署名されることになる。
-
ユーザーエージェントは、あればlocale
の情報を利用して、ウェブサイトと整合した言語でローカライズされたUXやロケールに基づく書式で表示してもよい。
もしshowOptOut
がtrueであれば、ユーザーエージェントはユーザーに対して当該指定されたRelying Party
に関してプロセスからオプトアウトしたいかを示す機会を与えなければなりません。
4.9.2. 取引確認UXの結果
ユーザーエージェントは、続行するかどうか、またどのように続行するかについて、ユーザーが次のいずれかの選択を示せるようにしなければなりません:
- ユーザーは支払いを続行したい。認証には SPC Credentialを使用する、
-
ユーザーが対話している
PaymentRequest上で、user accepts the payment request algorithmを実行する。 - ユーザーは支払いを続行したいが、data["
credentialIds"] が空であるためにできないか、あるいはSPC Credentialを使用したくない、 -
以下の手順を実行する:
-
data["
credentialIds"] を空のリストに設定すること。注: これにより
PaymentRequest.show()のPromiseは"NotAllowedError"DOMExceptionで拒否される;§ 4.10 支払い要求への応答手順参照。 -
ユーザーが対話している
PaymentRequest上で、user accepts the payment request algorithmを実行すること。
-
- ユーザーは支払いを続行したくない、
-
ユーザーが対話している
PaymentRequest上で、user aborts the payment request algorithm を実行すること。注: これにより
PaymentRequest.show()のPromiseは"AbortError"DOMExceptionで拒否される。 - ユーザーは当該
指定されたRelying Partyのプロセスからオプトアウトしたい、 -
PaymentRequest.show()を"OptOutError"DOMExceptionで拒否すること。§ 12.6 ユーザーのオプトアウト参照。注: このオプションは、
showOptOutがtrueに設定されている場合にのみユーザーに提供されればよい。
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によって呼び出されます。
-
data["
credentialIds"] が空であれば、"NotAllowedError"DOMExceptionをthrowすること。これは、ユーザーがSPCを使えないか使いたくない場合の認証セレモニーのプライバシーを保護するためである。注: ここでthrowすると
PaymentRequest.show()のPromiseは"NotAllowedError"DOMExceptionで拒否される。 -
topOriginを、requestの関連設定オブジェクトのトップレベルオリジンとする。
-
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"]
-
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のシーケンス。
-
AppendでdescriptorをpublicKeyOpts["
allowCredentials"] に追加する。
-
-
outputCredentialを、Request a Credentialアルゴリズムを実行して得る結果とする。渡す引数は«["
publicKey" → publicKeyOpts]»である。注: Chrome の初期実装では、
data.credentialIdsの全リストを Request a Credential に渡しません。代わりにリストの中から現在のデバイスに一致する1つの資格情報を選択し、それだけを渡します。注: これにより[webauthn-3]のGet の動作がトリガーされる。
-
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 >; // Only used for authentication.browserBoundPubKeyCredParams 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。
- クライアント拡張処理(登録)
-
新規認証情報作成時:
-
ステップ3の後に下記ステップを挿入:
-
下記のいずれかが真なら:
-
pkOptions["
authenticatorSelection"]["authenticatorAttachment"] が "platform" でない。 -
pkOptions["
authenticatorSelection"]["residentKey"] が "required" または "preferred" でない。 -
pkOptions["
authenticatorSelection"]["userVerification"] が "required" でない。
TypeErrorをthrowする。
注: これらの値はChrome初期実装仕様に合わせてハードコードされています。現状の制限は将来変更される可能性があります。他値サポートで有益なユースケースは実装者からの情報提供を募集しています。
-
-
-
ステップ13(
CollectedClientData作成)の前に。テスト
-
bbk_allowed_algorithmsを
browserBoundPubKeyCredParamsとする。 -
browserBoundPubKeyCredParamsが空の場合は、bbk_allowed_algorithmsをPublicKeyCredentialCreationOptions.pubKeyCredParamsとする。 -
bbk_and_algorithm、bbk_idをbbk_allowed_algorithmsで鍵ペア作成で得る。
-
(bbk_and_algorithm, bbk_id)がnullなら、以降のbbk_and_algorithm及びbbk_public_key関連手順は省略。
-
bbk_public_keyをbbk_and_algorithmでブラウザバウンド公開鍵取得で得る。
-
-
ステップ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-
create credential step 14でのbbk_and_algorithm及びclientDataJsonでブラウザバウンド署名生成の結果。
-
[[clientExtensionsResults]]["payment"]にpayment_outputsを設定。
-
-
- クライアント拡張処理(認証)
-
AuthenticationExtensionsPaymentInputsextension_inputsでアサーション実行時:-
"secure-payment-confirmation"決済ハンドラー外の場合、"
NotAllowedError"DOMExceptionを返す。注: SPCの拡張機能を取引UXを経ずに使う試みの防止。
-
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)内:-
6.1(options.rpIdとeffectiveDomainの比較)をスキップ。
注: クロスドメイン認証セレモニーを可能化。§ 1.1.2 加盟店による認証管理参照。
-
ステップ10の前(CollectedClientData作成前):
-
allowed_algorithmsを
SecurePaymentConfirmationRequest.browserBoundPubKeyCredParamsとする。 -
bbk_and_algorithmをcredential_idおよびallowed_algorithmsでブラウザバウンドキー取得/生成で得る。
-
-
ステップ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でブラウザバウンド公開鍵取得の結果。null時は未設定。
-
他フィールドは従来ステップ10通り。
-
-
"いずれかの認証器が成功"時、ステップ2で
[[clientExtensionsResults]]設定時:-
payment_outputsを
AuthenticationExtensionsPaymentOutputsで初期化、フィールドは:browserBoundSignature-
bbk_and_algorithm非null時は、
BrowserBoundSignatureで初期化、フィールドは:signature-
create credential step 14でのbbk_and_algorithm及びclientDataJsonでブラウザバウンド署名生成の結果。
-
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という名前でも含めることがあります。rpとrpIdの両方が存在する場合、それらの値は同一でなければなりません。 topOrigin-
取引詳細の署名を要求したトップレベルコンテキストのオリジン。
payeeName-
表示されていた場合にユーザーに表示された受取人の名前。
payeeOrigin-
表示されていた場合にユーザーに表示された受取人のオリジン。
paymentEntitiesLogos-
取引ダイアログで表示されたロゴ(ある場合)。これらのロゴは、この取引を仲介する事業体を表すことを意図しています。
total-
PaymentCurrencyAmount型の、[payment-request] のtotalフィールド。 instrument-
ユーザーに表示された決済手段の情報。
browserBoundPublicKey-
browser bound key の公開鍵の Base64url エンコード。WebAuthn の Base64url エンコーディング を参照してください。
呼び出しフレームのオリジンは既にCollectedClientData([webauthn-3])に含まれているため、CollectedClientAdditionalPaymentData
に paymentRequestOrigin フィールドはありません。
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 KeyStore、Apple 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
と鍵ペア識別子のバイト配列を返すように、以下の手順を実行します:
注: 許可されたアルゴリズムまたはデフォルトの許可アルゴリズムから鍵ペアを生成します。
-
もし allowed_algorithms が 空 であれば、このリストを以下を順に含むデフォルトリストに設定します:
-
type=PublicKeyCredentialTypeかつalg= -7 ("ES256"). -
type=PublicKeyCredentialTypeかつalg= -257 ("RS256").
-
-
Remove を使って、allowed_algorithms から
PublicKeyCredential型でないエントリを削除します。 -
Remove を使って、ユーザーエージェントがサポートしていないエントリをallowed_algorithmsから削除します。
注: ユーザーエージェントはデバイスプラットフォームごとに異なる暗号アルゴリズムセットをサポートする可能性があります。
-
もし allowed_algorithms の size が 0 であれば、null を返します。
注: この場合、ユーザーエージェントはブラウザバウンド出力を追加しません。
-
もし allowed_algorithms の size が 0 より大きければ、以下を実行:
-
chosen_algorithm を allowed_algorithms[0] とする。
-
chosen_algorithm に対応する既定手順で公開・秘密鍵の鍵ペアを生成し、その結果を bbk とする。鍵生成アルゴリズムについては IANA COSE Algorithms レジストリ [IANA-COSE-ALGS-REG] を参照してください。生成が失敗した場合は null を返す。
-
bbk_and_algorithm を (bbk, chosen_algorithm) の タプルとする。
-
bbk_id を次のいずれかとする:
-
長さ32の配列として初期化されたバイト配列:
-
bbk_id を長さ32の配列とする。
-
getRandomValues(bbk_id) を呼ぶ。
-
-
実装定義の鍵生成手順から得られる鍵ペアハンドルのシリアライズ結果のバイト配列。このバイト配列は、後に ブラウザバウンドキーの取得/作成 の際に鍵を識別するためのものでなければならない。
注: 多くの暗号APIは秘密鍵の代わりに識別子、ハンドル、またはラップされた鍵を返し、公開鍵と共に返す場合があります。例えば秘密鍵がセキュアエレメントに格納されている場合、秘密鍵自体はユーザーエージェントに直接利用可能でないため、識別子/ハンドル/ラップ鍵を暗号APIの別関数に渡して使用する必要があります。
-
-
Set を使って keypair_map[bbk_id] に bbk_and_algorithm を設定する。
-
(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 に格納します。
-
Set を使って browser_bound_map[credential_id] に bbk_id を設定します。エラー
InvalidStateError、TypeError、 およびQuotaExceededErrorを捕捉したら失敗を返します。注: これらのエラーは基盤となるファイルシステム操作(例:
write(buffer, options))によってスローされることがあります。ここで false が返されると、ユーザーエージェントは取引にブラウザバウンド鍵を含めないようにし、この場合 Relying Party はその取引でブラウザバウンド鍵を受け取らないことになります。次回の支払いアサーション時に新しい鍵ペア作成が試みられます。
6.3. 鍵ペアの取得
ブラウザバウンド鍵を取得または作成する手順は、バイト配列 credential_id と リスト 型の PublicKeyCredentialParameters(allowed_algorithms)を与えられ、鍵ペアとその
COSEAlgorithmIdentifier
のタプルを返す手順です:
注: 与えられた Credential 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] が存在しない場合:
-
(new_bbk_and_algorithm, bbk_id) を create-a-key-pair を使って allowed_algorithms で作成した結果とする。
-
binding_result を bind-a-key-pair を使って bbk_id と credential_id でバインドした結果とする。結果が失敗なら bbk_and_algorithm を null とする。
-
もし binding_result が失敗でなければ、bbk_and_algorithm を new_bbk_and_algorithm とする。
-
-
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 の credentialPublicKey を参照してください(WebAuthn § 6.5.1 Attested Credential Data)。
-
encoded_public_key を返す。
6.5. クライアントデータの署名
指定された鍵ペアと COSEAlgorithmIdentifier
のタプル bbk_and_algorithm とバイト配列 client_data_json を与えられ、バイト配列を返すことで ブラウザバウンド署名を生成する手順を実行します:
注: CollectedClientData
(CollectedClientAdditionalPaymentData
または
CollectedClientAdditionalPaymentRegistrationData
を含む)に対して、browser bound
key の 秘密鍵 を用いて署名を行います。
-
bbk を bbk_and_algorithm[0] とする。
-
algorithm を bbk_and_algorithm[1] とする。
-
signature を、bbk の 秘密鍵 を用いて algorithm に従い client_data_json に対して生成した結果とする。アルゴリズムの詳細は IANA COSE Algorithms レジストリ [IANA-COSE-ALGS-REG] を参照してください。
注: 結果は client_data_json に対する暗号署名であり、bbk の 秘密鍵 を使っています。
-
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.
PaymentEntityLogo 辞書
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 は以下の手順を必ず実行しなければなりません:
-
credential を
PublicKeyCredentialとし、これは Secure Payment Confirmation payment handler を SPC 呼び出し元が正常に呼び出したときに返されたものとします。注: SPC は マーチャントによる認証の制御 を可能にするために設計されており、SPC を呼び出すエンティティが必ずしも Relying Party であるとは限りません。この最初のステップは、SPC 呼び出し元が SPC 経由で取得した credential を Relying Party に返したことを前提としています。
-
WebAuthn に指定されている手順のステップ 3–21 を実行します(WebAuthn の記述)。ただし以下の変更を加えます:
-
ステップ 5 では、credential.
idが SPC 呼び出し元 により Relying Party へ提供された公開鍵資格情報のいずれかを識別することを検証してください。 -
ステップ 11 では、C["
type"] の値が文字列payment.getであることを検証してください。 -
ステップ 12 では、C["
challenge"] が SPC 呼び出し元 が Relying Party に提供したチャレンジの base64url エンコーディングと等しいことを検証してください。 -
ステップ 13 では、C["
origin"] の値が Relying Party が SPC を呼び出したと予期するオリジンと一致することを検証してください。 -
ステップ 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:
-
もし parameters が JSON の Object でない場合、WebDriver エラー を WebDriver エラーコード invalid argument で返してください。
-
mode を プロパティを取得する 操作で
"mode"という名前のプロパティを parameters から取得した結果として得てください。 -
もし mode が undefined または "
autoAccept"、"autoChooseToAuthAnotherWay"、"autoReject"、"autoOptOut" のいずれでもない場合、WebDriver エラー を WebDriver エラーコード invalid argument で返してください。 -
current transaction automation mode を mode に設定してください。
-
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 のログインシステムに対する潜在的な攻撃が可能になります。
攻撃の流れは次のとおりです:
-
ユーザーが
attacker.exampleを訪問します。ここは商用サイトを装ったサイトです。 -
attacker.exampleはユーザーのための資格情報をrelyingparty.exampleから入手します。これは正当な方法でも、relyingparty.exampleから資格情報を盗むなどの方法でもあり得ます。 -
attacker.exampleは SPC 認証を開始し、ユーザーがトランザクションに同意します(正当かどうかは問わない)。 -
attacker.exampleは API 呼び出しから受け取った支払いアサーションを取り、例えばhttps://relyingparty.example/loginへの POST のようにしてログインエンドポイントに送信します。 -
relyingparty.exampleが誤ったアサーション検証コードを使用しており、署名は検証するが必要なフィールドの検証を怠り(以下参照)、ログイン試行を正当と誤認します。 -
relyingparty.exampleは例えばログインクッキーをattacker.exampleに返します。これによりユーザーのrelyingparty.exampleのアカウントが侵害されます。
Relying Parties は、この攻撃に対して二つの方法で防御できます。
第一に、Relying Party は常に適切なアサーション検証手順に従う必要があります(WebAuthn ログイン用または SPC 支払い用のいずれか適切な方に従う)。特に、次のフィールドは資格情報の不適切な使用を検出するために使用できます:
-
CollectedClientData["type"] — ログインの場合は "webauthn.get"、SPC の場合は "payment.get"。 -
CollectedClientData["challenge"] — この値は Relying Party サーバが WebAuthn または SPC の呼び出し前にサイトに提供するべきであり、期待される適切な以前に提供された値と一致することを検証する必要があります。 -
CollectedClientData["origin"] — SPC がクロスオリジンで実行されている場合、この値は呼び出し元のオリジン(上の例ではattacker.example)を含みます。
第二に、Relying Party は支払い用とログイン用の資格情報を分けて管理することを検討できます。これを行う場合、Relying Party は Secure Payment Confirmation 用の資格情報をサブドメイン(例:
https//payment.relyingparty.example)上でのみ登録し、支払い資格情報とログイン資格情報をデータベース内で分離して保持するべきです。
payment
拡張で作成された資格情報のみを許可しています。将来的に仕様はこれを反映するよう更新される可能性があります。
現在の実装と仕様では、payment
拡張で作成された資格情報は、Relying Party が望む場合はログインにも使用できることになっています。これは今後も変わらない見込みです。
11.1.2. 支払い攻撃
Secure Payment Confirmation のアサーションは、進行中のオンライン取引の一部でない限り本質的に無意味です。
悪意のある第三者がユーザーアカウントの乗っ取りを試みる代わりに、正規または不正な方法で取得した Secure Payment Confirmation 資格情報を使って不正な支払いを開始する攻撃を防ぐため、さまざまな仕組みが用意されています:
-
攻撃者が SPC を開始すると、ユーザーエージェントはユーザーに取引内容(受取人および金額を含む)を明確に表示する UI を表示します。この状況では、ユーザーが「キャンセル」する可能性が非常に高いです。
-
もしユーザーが取引に同意して、その後の WebAuthn 認証式を完了した場合、攻撃者は Relying Party に対する署名済み SPC アサーションを入手できます。
-
Relying Party が取引を想定していない場合、そのアサーションは拒否されます。
-
Relying Party が取引を想定している場合でも、少なくとも次のいずれかを検出しアサーションを拒否します:
-
攻撃者が有効な支払いに対して競合する場合、不正な
CollectedClientData["challenge"] -
攻撃者がユーザーと正規マーチャントサイトの間に割って入り、アサーションを転送しようとする場合、不正な
CollectedClientData["origin"]
-
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 の端末紐付けの性質が失われます。
しかし、この攻撃は実質的に成立しません:
-
攻撃者が BBK を差し替える場合:Relying Party は、パスキー公開鍵で
CollectedClientData(BBK 公開鍵を含む)の署名を検証した際に署名の不一致を検出し、この取引を拒否してその BBK 公開鍵を信頼しないものとして扱うべきです。 -
攻撃者がユーザーになりすまそうとする場合: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 が同ユーザーのものであると知ることができる可能性があります。
多くの現行オンライン支払いフローでは、ユーザーがすでにその結び付けを可能にするための十分な情報(例:氏名、電子メールアドレス、配送先住所など)を提供することが多いため、これが重大なリスクになるとは限りません。
しかし、(トークン化など)より少ない識別情報しか含まれない支払い方法が普及した場合は、エコシステム関係者がユーザーのプライバシー保護手段を講じることが重要になります。たとえば:
-
支払いシステムにより、第三者による資格情報 ID や BBK 公開鍵の保存に制限を設けるルールを策定することが考えられます。
-
Relying Party が複数の手段を 1 つの SPC 資格情報に割り当てた場合、その資格情報 ID を他の第三者と共有しない選択肢もあります。この場合でも Relying Party は(第一または第三者コンテキストで)その資格情報自体でユーザーを認証できます。
-
Relying Party(例:銀行)がユーザーごとに支払い手段ごとに別個の SPC 資格情報を登録できるようにすることも考えられます。これでも Relying Party は内部結合を行うことは妨げられません。
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-feature-not-enabled: ユーザーエージェントがどの条件で Secure Payment Confirmation の利用可否を切り替えるかによりフィンガープリンティングリスクがあります。ユーザーエージェントは、(もし仕様を実装するなら)すべてのユーザー、または特定の OS など十分大きなグループに提供することで追加のフィンガープリンティングが発生しないようにすべきです。例として、特定の OS の全ユーザーに Secure Payment Confirmation を提供し、他の OS では提供しないことなどが考えられます(この場合、UA文字列が既に提供している以上のフィンガープリントにはなりません)。 -
unavailable-no-permission-policy: 追加のフィンガープリンティングリスクはありません。既に "payment" パーミッションポリシーは、PaymentRequestオブジェクトを構築時に(パーミッションポリシーが有効でないときエラーになるため)既にサイレントに検出可能です。 -
unavailable-no-user-verifying-platform-authenticator: 既存のisUserVerifyingPlatformAuthenticatorAvailableAPI 以上のフィンガープリンティングリスクはありません。
上記以外にも、この仕様では、たとえ具体的な理由がわかっていても、ユーザーのプライバシー保護のために 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 呼び出し元は:
-
locale(指定する場合)と言語付き表示文字列の値との間の一貫性を意識してください。 -
文字列内に方向転換が含まれる場合には、表示時に正しくレンダリングされるようにしてください(参考:双方向テキスト用 Unicode 制御文字の使い方や 基底方向のインライン変更)。
実装(および表示処理)は、表示用文字列値をユーザーインターフェイスに挿入する際、bidi isolation を適用し、方向がわかれば指定し、分からない場合は first-strong("auto")をデフォルトとすべきです。
15. IANA に関する考慮事項
この節は 拡張識別子 を IANA "WebAuthn Extension Identifiers" レジストリ [IANA-WebAuthn-Registries] に追加します([RFC8809] による)。
-
WebAuthn Extension Identifier: payment
-
説明: この拡張は Secure Payment Confirmation API で定義される次の機能をサポートします:(1)クロスオリジン iframe での資格情報作成(2)Relying Party 以外の第三者が Relying Party の代わりに認証式を実施できること(3)ブラウザによる Secure Payment Confirmation 資格情報の識別とキャッシュ。SPC が WebAuthentication と大きく異なる重要な点については、特に § 11 セキュリティに関する考慮事項 と § 12 プライバシーに関する考慮事項 を参照
-
仕様書: 本仕様書 § 5 WebAuthn Extension - "payment" 節
-
備考: 登録は Web Authentication Working Group との 2023年5月3日討議に準拠