このドキュメントでは、WebAuthn における userVerification
の内容と、パスキーの作成時または認証時に userVerification
を指定した場合のブラウザの動作について説明します。
WebAuthn の「ユーザー確認」とは何ですか?
パスキーは公開鍵暗号に基づいています。パスキーを作成すると、公開鍵 / 秘密鍵ペアが生成され、秘密鍵はパスキー プロバイダによって保存され、公開鍵は信頼する当事者(RP)のサーバーに返されて保存されます。サーバーは、ペア設定された公開鍵を使用して、同じパスキーで署名された署名を検証することで、ユーザーを認証できます。公開鍵認証情報の「user present」(UP)フラグは、認証中に誰かがデバイスを操作したことを証明するものです。
ユーザー確認は、ユーザーの存在確認が示すように、認証中に誰かが存在しただけでなく、正しい人物が存在したことを主張することを目的とした、オプションのセキュリティ レイヤです。スマートフォンでは、通常、生体認証、PIN、パスワードのいずれかを使用して画面ロック メカニズムによって行われます。ユーザー確認が行われたかどうかは、パスキーの登録と認証時に認証システムのデータで返される「UV」フラグで報告されます。
サーバーで UP と UV が検証される仕組み
ユーザーの存在(UP)とユーザーの確認(UV)のブール値フラグは、認証システムのデータフィールドでサーバーに通知されます。認証時に、保存されている公開鍵を使用して署名を検証することで、認証システムのデータフィールドの内容を検証できます。署名が有効である限り、サーバーはフラグを正規と見なすことができます。
パスキーの登録と認証時に、サーバーは UP フラグが true
であることと、要件に応じて UV フラグが true
か false
かを確認する必要があります。
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 では(デバイスが Touch ID に対応していない、Touch ID が無効になっている、デバイスがクラムシェル モードになっているなど)、代わりにシステム パスワードの入力を求められます。これにより、ユーザーの負担が増加し、認証を完全に放棄する可能性があります。摩擦の除去が優先される場合は、userVerification='preferred'
を使用します。
userVerification='preferred'
の場合、ユーザー確認が正常に行われた場合は UV フラグが true
、ユーザー確認がスキップされた場合は false
になります。たとえば、Touch ID を使用できない macOS では、ユーザー確認をスキップするにはボタンをクリックするようユーザーに求めるメッセージが表示され、公開鍵認証情報には false
UV フラグが含まれます。
UV フラグは、リスク分析のシグナルとして使用できます。他の要因によりログイン試行がリスクが高いと思われる場合は、ユーザー確認が実行されていない場合は、ユーザーに追加のログイン チャレンジを提示することをおすすめします。
userVerification='required'
を使用するタイミング
UP と UV の両方が絶対に必要な場合は、userVerification='required'
を使用します。
このオプションのデメリットは、ユーザーがログインする際に手間がかかることである。たとえば、Touch ID を使用できない macOS の場合、ユーザーはシステム パスワードを入力するよう求められます。
userVerification='required'
を使用すると、ユーザー確認がデバイスで実行されるようにできます。UV フラグが true
であることをサーバーが確認していることを確認します。
まとめ
ユーザー確認を活用することで、パスキーを利用する当事者は、デバイス所有者がログインする可能性を測定できます。フォールバック ログイン メカニズムがユーザーフローに与える影響の重大さに応じて、ユーザー確認を必須にするか、任意にするかを選択できます。サーバーがパスキーのユーザー認証で UP フラグと UV フラグをチェックしていることを確認します。