Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2021年9月.
* Some parts of this feature may have varying levels of support.
安全なコンテキスト用: この機能は一部またはすべての対応しているブラウザーにおいて、安全なコンテキスト (HTTPS) でのみ利用できます。
ウェブ認証 API (WebAuthn) は、公開鍵暗号を用いて強力な認証を可能にする資格情報管理 API の拡張機能で、パスワードレス認証や、 SMS テキストを用いない安全な多要素認証 (MFA) を実現します。
ウェブ認証 API (WebAuthn) は、パスワードや SMS のテキストを使用するのではなく、公開鍵暗号を使用して、ウェブサイトで登録、認証、多要素認証を行います。これにはいくつかの利点があります。
多くのウェブサイトには既に、ユーザーが新規アカウントを登録したり既存アカウントにログインしたりできるページが存在します。 WebAuthn は、このシステムの認証部分を置き換えたり、強化したりする役割を果たします。これは資格情報管理 API を拡張し、ユーザーエージェントと認証器 (authenticator) の間のやりとりを抽象化するとともに、以下の新機能を提供します。
最も基本的な形としては、create() と get() の両方が、「チャレンジ」と呼ばれるとても大きな乱数をサーバーから受け取り、秘密鍵によって署名されたチャレンジをサーバーに返します。これは、ネットワーク上で秘密情報を一切漏らすことなく、ユーザーが認証に必要な秘密鍵を保持していることをサーバーに証明することができます。
メモ: 「チャレンジ」は、少なくとも 16 バイトのサイズのランダムな情報のバッファーでなければなりません。
資格情報の作成プロセスがどのように機能するかを説明するために、ユーザーが RP に対して資格情報を登録しようとする際に発生する一般的な流れを以下に記述します。
RP サーバーは、適切な保護された仕組み(フェッチや XMLHttpRequest など)を使用して、ユーザー情報とRP 情報を、登録処理を担当するウェブアプリケーションに「チャレンジ」と共に送信します。
メモ: RP サーバーとウェブアプリケーション間で情報を共有する形式は、アプリケーション次第です。 推奨される方法は、資格情報および資格情報オプションに対して JSON 型表現オブジェクトを交換することです。 PublicKeyCredential には、JSON 表現から認証 API で要求される形式への変換を行うための便利なメソッドが用意されています。 parseCreationOptionsFromJSON()、parseRequestOptionsFromJSON()、PublicKeyCredential.toJSON() です。
ウェブアプリは、RP 代わりに、 navigator.credentials.create() 呼び出しを通じて、認証器による新しい認証情報の生成を開始します。この呼び出しには publicKey オプションが渡され、端末の機能(生体認証などによる独自のユーザー認証を提供するかどうかなど)を指定します。
一般的な create() 呼び出しは、次のようなものになります。
create() 呼び出しの引数は、改ざん防止のため、署名された SHA-256 ハッシュと共に認証器に渡されます。
認証器はユーザーの同意を取得した後、鍵ペアを生成し、公開鍵とオプションの署名付きアテステーション (attestation) をウェブアプリに返します。これは、 create() 呼び出しが返す Promise が履行された際に、 PublicKeyCredential オブジェクトインスタンスの形式で提供されます(PublicKeyCredential.response プロパティにはアテステーションが含まれます)。
ウェブアプリは、適切な仕組みを使用して再度、PublicKeyCredential を RP サーバーに転送します。
RP サーバーは、公開鍵とユーザー ID を組み合わせて保存し、将来の認証のために資格情報を記憶します。このプロセスの中で、登録が完全に行われ改ざんされていないことを確認するための一連のチェックを実行します。これには以下のもの含まれます。
警告: アテステーションは、RP が認証器の出所を判断する手段を提供します。RP は、認証器の許可リストを保持しようとすべきではありません。
ユーザーが WebAuthn に登録されたら、サービスに対して認証(ログイン)を行うことができます。認証フローは登録フローと類似していますが、主な違いは以下の通りです。
一般的な認証フローは以下の通りです。
RP は「チャレンジ」を生成し、RP およびユーザーの資格情報のリストと共にユーザーエージェントへ、適切な保護された機構を用いて送信する。また、資格情報の検索先、例えばローカル内蔵認証器、USB や BLE 経由の外部認証器などを指定することもできる。
ブラウザーは navigator.credentials.get() 呼び出しを介して、認証器にチャレンジの署名を依頼し、その際に publicKey オプションで証明書を渡す。
一般的な get() 呼び出しは次のようになります。
get() 呼び出しの引数は、認証を処理するために認証器に渡されます。
認証器が指定された資格情報のいずれかを含み、かつチャレンジへの署名が成功した場合、ユーザーの同意を得た後、署名付きアサーションをウェブアプリに返す。これは、 get() 呼び出しが返す Promise が履行された際に、 PublicKeyCredential オブジェクトインスタンスの形式で提供される(PublicKeyCredential.response プロパティにアサーション情報が含まれる)。
ウェブアプリは署名付きアサーションを RP サーバーに転送し、RP が検証します。この検証では以下の点をチェックします。
サーバーによる検証が完了すると、認証フローは成功と見なされます。
検出可能な資格情報は、認証器から取得されます(ブラウザーによって検出されます)。これは、ユーザーが RP のウェブアプリにログインする際のログインオプションとして提供されます。これに対し、検出可能でない資格情報は、RP のサーバーによって提供され、ブラウザーがログインオプションとして提示します。
検出可能な資格情報 ID およびユーザー名や表示名などの関連メタデータは、ブラウザーのパスワードマネージャー、 認証アプリ、ハードウェアソリューション(YubiKey など)といったクライアント側の認証器に格納するために保存されます。この情報を認証器で利用できる状態にすることで、ユーザーは資格情報を入力せずに便利にログインできるし、その資格情報をアサーションする際に、RP は credentialId を提供する必要を持ちません(ただし、必要に応じて提供することは可能です。RP が資格情報をアサーションする場合は、検出可能でないワークフローに従います)。
検出可能な資格情報は、create() の呼び出しで residentKey を指定することで作成されます。新しい資格情報のcredentialId、ユーザーメタデータ、公開鍵は、前述のように認証器に格納されるだけでなく、ウェブアプリにも返され、 RP サーバーに保存されます。
認証において、 RP サーバーは条件付き仲介を指定して get() を呼び出す際に条件付き仲介を指定します。具体的には、mediation を conditional に設定し、空の allowCredentials リスト(つまり、検出可能な資格情報のみが表示可能であるということ)、およびチャレンジを指定します。
条件付き仲介では、認証器で得られる検出可能な資格情報が、資格情報を要求しているオリジンとともに、モーダルダイアログではなく非モーダル UI でユーザーに表示ます。具体的には、ログインフォームで利用できる認証情報を自動入力するということです。検出可能な資格情報に保存されたメタデータは、ユーザーがログイン時に資格情報を選択するための参考になるよう表示できます。ログインフォームで検出可能な資格情報を表示するには、フォームフィールドに autocomplete="webauthn" を同時に記載する必要があります。
繰り返しますが、RP は認証器に、何の資格情報をユーザーに提示すべきかを指示しません。代わりに、認証器が利用可能な資格情報のリストを提供します。ユーザーが資格情報を選択すると、認証器はそれに対応する秘密鍵でチャレンジに署名し、ブラウザーは署名済みチャレンジとそのcredentialIdを RP サーバーに返します。
RP サーバーにおけるその後の認証プロセスは、検出可能でない資格情報の場合と同様です。
メモ: 特定のユーザーエージェントで条件付き仲介が利用可能かどうかは、 PublicKeyCredential.isConditionalMediationAvailable() メソッドを呼び出すことで確認できます。
パスキーは、検出可能な認証情報の重要な使用例です。実装の詳細については、パスワードレスログイン用のパスキーを作成する(英語)およびフォームの自動入力によるパスキーでのログイン(英語)を参照してください。検出可能な資格情報に関するより一般的な情報については、検出可能な資格情報の詳細解説(英語)も参照してください。
条件付き仲介が認証に使用される場合、サイレントアクセス防止フラグ(CredentialsContainer.preventSilentAccess() 参照)は実際の値に関わらず true と 扱われます。適用可能な資格情報が検出された場合、条件付きの動作は常に何らかのユーザー仲介を伴います。
メモ: 資格情報が検出されなかった場合、非モーダルダイアログは表示されず、ユーザーエージェントは資格情報の種類に応じて(例えば、資格情報を持つ機器の挿入など)、ユーザーにアクションを促すことができます。
ユーザーの認証器に格納されている検出可能な資格情報については、RP のサーバーと同期しなくなる可能性があります。これは、ユーザーが認証器を更新せずに、 RP ウェブアプリ上で認証情報を削除したり、ユーザー名/表示名を変更したりした場合に生じる可能性があります。
この API は、RP サーバーが認証器に変更のシグナルを送信し、格納される資格情報を更新できるようにするための方法を提供します。
signalUnknownCredential() と signalAllAcceptedCredentials() は、目的が似ているように見えるかもしれませんが、それぞれどのような状況で使用すべきでしょうか?
登録とログインのワークフローは、WebAuthn クライアント(ブラウザー)の機能に基づいて、独自のカスタマイズが可能です。 PublicKeyCredential.getClientCapabilities() 静的メソッドを使用することができます。このメソッドはオブジェクトを返し、それぞれのキーは WebAuthn の機能または拡張を参照し、それぞれの値はその機能に対応しているかどうかを示す論理値です。
これは、例えば以下のことをチェックするために使用することができます。
以下のコードは、getClientCapabilities() を使用して、クライアントが生体認証によるユーザー認証に対応しているかどうかを確認する方法を示しています。 実際の動作はサイトによって異なることに注意してください。 生体認証を必須とするサイトでは、ログイン UI を置き換え、生体認証が必要である旨と、ユーザーが別のブラウザーや端末を試すよう促すメッセージを表示することができます。
WebAuthnの利用可否は、権限ポリシーを使用して制御できます。特に以下の 2 つのディレクティブを指定します:
両方のディレクティブとも、既定の許可リスト値は "self" です。これは、既定ではこれらのメソッドが最上位の文書コンテキストで使用できることを意味します。 さらに、get() は最上位の文書と同じオリジンから読み込まれた、その中に含まれる閲覧コンテキストでも使用できます。 get() および create() は、最上位の文書とは異なるオリジンから読み込まれた、入れ子にされた閲覧コンテキスト(つまり、異なるオリジンの <iframes> 内)で、Permissions-Policy の publickey-credentials-get および publickey-credentials-create ディレクティブによって許可されている場合に限ります。 オリジンをまたいだ create() 呼び出しにおいて、iframe の allow= によって許可が与えられた場合、そのフレームは一時的な有効化もされていなければなりません。
メモ: ポリシーがこれらのメソッドの使用を禁止している場合、それらが返すプロミスは NotAllowedError の DOMException で拒否されます。
特定のサブドメインのみへのアクセスを許可したい場合は、次のように指定できます。
<iframe> 内で get() または create() による認証を行う場合、以下の手順に従ってください。
RP サイトを埋め込むサイトは、 allow 属性で許可する必要があります。
get() を使用する場合:
create() を使用する場合:
create() がオリジンをまたいで呼び出される場合、 <iframe> には一時的な有効化も必要です。
RP サイトは、Permissions-Policy ヘッダーを介して上記のアクセスに対して許可する必要があります。
または、特定の URL のみが <iframe> 内で依存先サイトを表示できるようにします。
サービスに対し、認証者が CredentialsContainer.get() 呼び出しによって開始された認証要求を正常に処理するために必要な鍵ペアを保持していることを証明します。get() の Promise が履行された際に取得される PublicKeyCredential インスタンスの response プロパティで利用可能です。
AuthenticatorAttestationResponseWebAuthn 資格情報の登録結果(つまり、CredentialsContainer.create() の呼び出し)。これには、サーバーが WebAuthn アサーションを実行するために必要な資格情報に関する情報が含まれます。例えば、資格情報 ID や公開鍵などです。create() の Promise が履行された際に取得される PublicKeyCredential インスタンスの response プロパティで利用可能です。
AuthenticatorResponseAuthenticatorAttestationResponse および AuthenticatorAssertionResponse の基本インターフェイスです。
PublicKeyCredential公開鍵 / 秘密鍵ペアに関する情報を提供します。これは、パスワードの代わりにフィッシング攻撃やデータ侵害に耐性のある非対称鍵ペアを使用してサービスにログインするための認証情報です。 Promise が create() または get() の呼び出しを通じて返され解決されたときに取得されます。
create() を publicKey オプション付きで呼び出すと、前述のように認証器を介して新しい非対称鍵資格情報の作成が開始されます。
CredentialsContainer.get() の publicKey オプションget() を publicKey オプション付きで呼び出すと、ユーザーエージェントは既存の資格情報セットを使用して信頼先への認証を実行するよう指示されます。
| Web Authentication: An API for accessing Public Key Credentials - Level 3 # iface-pkcredential |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 2025年9月30日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.