userVerification の詳細

このドキュメントでは、WebAuthn における userVerification の内容と、パスキーの作成時または認証時に userVerification を指定した場合のブラウザの動作について説明します。

「ユーザー確認」とはどうでしょうか

パスキーは公開鍵暗号で構築されます。パスキーを作成すると、公開鍵 / 秘密鍵のペアが生成されます。秘密鍵はパスキー プロバイダによって保存されます。公開鍵はリライング パーティ(RP)サーバーに返されて保存されます。サーバーは、ペア設定された公開鍵を使用して、同じパスキーで署名された署名を検証することでユーザーを認証できます。「ユーザー提示」公開鍵認証情報上の(UP)フラグは、認証中に誰かがデバイスを操作したことを証明するものです。

ユーザー確認はオプションのセキュリティ レイヤで、ユーザー プレゼンス アサートのように、認証時に特定の人物だけでなく正しい人物も存在したことをアサートしようとします。スマートフォンでは、生体認証、PIN、パスワードなど、画面ロックのメカニズムを使用するのが一般的です。ユーザー確認が行われたかどうかは「UV」でレポートされます。パスキーの登録と認証中に認証システムのデータで返されるフラグ

<ph type="x-smartling-placeholder">
</ph> macOS 上の iCloud キーチェーン上のユーザー確認ダイアログのスクリーンショット。ユーザーに Touch ID によるログインを求めるダイアログに、認証をリクエストしているオリジンとユーザー名が表示されます。ダイアログの右上には [キャンセル] ボタンがあります。 <ph type="x-smartling-placeholder">
</ph> macOS の iCloud キーチェーン上のユーザー確認ダイアログ。
で確認できます。
<ph type="x-smartling-placeholder">
</ph> Chrome for Android のユーザー確認ダイアログのスクリーンショット。このダイアログでは、顔認識や指紋認証による本人確認をユーザーに求め、認証を要求しているオリジンが表示されます。左下に、PIN を使用して確認するためのオプションがあります。 <ph type="x-smartling-placeholder">
</ph> Android Chrome のユーザー確認ダイアログ。

サーバーでの UP と UV の検証方法

ユーザー プレゼンス(UP)とユーザー検証(UV)のブール値フラグは、サーバーの認証システムのデータ フィールドでサーバーに送信されます。認証中、認証システムのデータ フィールドの内容は、保存されている公開鍵を使用して署名を検証することで検証できます。署名が有効である限り、サーバーはフラグが本物であるとみなすことができます。

<ph type="x-smartling-placeholder">
</ph> 認証データ構造の図。データ構造の各セクションは、左から順に「RP ID HASH」となっています。(32 バイト)、&#39;FLAGS&#39;(1 バイト)、&#39;COUNTER&#39;(4 バイト、ビッグエンディアン uint32)、&#39;ATTESTE CRED.データ(存在する場合は可変長)、および「EXTENSIONS」(存在する場合は可変長(CBOR))。「FLAGS」セクションが展開され、左から右に「ED」、「AT」、「0」、「BS」、「BE」、「UV」、「0」、「UP」というラベル付きのフラグのリストが表示されています。 <ph type="x-smartling-placeholder">
</ph> 公開鍵認証情報の認証システムのデータ フィールド。

パスキーの登録と認証時に、サーバーは UP フラグが true であることと、要件に応じて UV フラグが truefalse かを確認する必要があります。

userVerification パラメータの指定

WebAuthn の仕様では、RP は、認証情報の作成とアサーションの両方で userVerification パラメータを使用してユーザー確認をリクエストできます。これは、それぞれ次の意味の 'preferred''required''discouraged' を受け入れます。

  • 'preferred'(デフォルト): デバイスでユーザー確認方法を使用することが推奨されますが、使用できない場合はスキップできます。レスポンス認証情報には、ユーザー確認が実行された場合の UV フラグ値 true と、UV が実行されていない場合は false が含まれます。
  • 'required': デバイスで利用可能なユーザー確認メソッドを呼び出す必要があります。利用できない場合、リクエストはローカルで失敗します。つまり、レスポンス認証情報は常に UV フラグが true に設定された状態で返されます。
  • 'discouraged': ユーザー確認方法を使用することはおすすめしません。ただし、デバイスによってはユーザー確認が実行される場合があり、UV フラグに true または false を含めることができます。

パスキー作成のサンプルコード:

const publicKeyCredentialCreationOptions = {
  // ...
  authenticatorSelection: {
    authenticatorAttachment: 'platform',
    residentKey: 'required',
    requireResidentKey: true,
    userVerification: 'preferred'
  }
};

const credential = await navigator.credentials.create({
  publicKey: publicKeyCredentialCreationOptions
});

パスキー認証のサンプルコード:

const publicKeyCredentialRequestOptions = {
  challenge: /* Omitted challenge data... */,
  rpId: 'example.com',
  userVerification: 'preferred'
};

const credential = await navigator.credentials.get({
  publicKey: publicKeyCredentialRequestOptions
});

userVerification にはどのオプションが適していますか。

使用する userVerification 値は、アプリの要件とユーザー エクスペリエンスのニーズによって異なります。

userVerification='preferred' を使用するタイミング

保護よりもユーザー エクスペリエンスを優先する場合は、userVerification='preferred' を使用します。

ユーザーの確認は、保護よりも摩擦が激しい環境があります。たとえば、Touch ID が使用できない macOS の場合(デバイスが対応していない、無効になっている、デバイスがクラムシェル モードになっているなど)、ユーザーはシステム パスワードを入力するよう求められます。これが煩わしさを感じ、ユーザーは認証を完全に断念する可能性があります。手間を省くことがより重要な場合は、userVerification='preferred' を使用してください。

<ph type="x-smartling-placeholder">
</ph> Touch ID が使用できないときに表示される、macOS のパスキー ダイアログのスクリーンショット。このダイアログには、認証を要求しているオリジンやユーザー名などの情報が含まれています。ダイアログの右上には [キャンセル] ボタンがあります。 <ph type="x-smartling-placeholder">
</ph> Touch ID を使用できない場合に macOS に表示されるパスキー ダイアログ。

userVerification='preferred' では、ユーザー確認が正常に行われた場合、UV フラグは true になり、ユーザー確認がスキップされた場合は false になります。たとえば、Touch ID を使用できない macOS では、ユーザー確認をスキップするボタンをクリックするようユーザーに求め、公開鍵認証情報には false UV フラグが含まれています。

UV フラグは、リスク分析のシグナルとして使用できます。他の要因が原因でログインにリスクがあると思われる場合は、ユーザーの確認が行われていない場合は、ユーザーに追加のログイン時の本人確認画面を表示することをおすすめします。

<ph type="x-smartling-placeholder">

userVerification='required' を使用するタイミング

UP と UV の両方が必要だと思われる場合は、userVerification='required' を使用します。

このオプションの欠点は、ユーザーがログインするときに、より多くの煩わしさを感じる可能性があることです。たとえば、Touch ID を使用できない macOS の場合、ユーザーはシステム パスワードを入力するよう求められます。

userVerification='required' を使用すると、ユーザー確認がデバイスで実行されるようにできます。UV フラグが true であることをサーバーが確認していることを確認します。

まとめ

ユーザー確認を活用することで、パスキーを利用する当事者は、デバイス所有者がログインする可能性を測定できます。代替のログイン メカニズムがユーザーフローに与える影響の度合いに応じて、ユーザー確認を要求するかオプションにするかは、ユーザーが選択します。パスキーのユーザー認証の UP フラグと UV フラグをサーバーがチェックすることを確認します。