このページは自動翻訳されています。英語の原文は こちら.
| アプローチ | 採用状況 | パスキーの作成 | パスキーの使用 | パスキーの管理 | 技術的複雑さ | OAuthのサポート |
|---|---|---|---|---|---|---|
| ネイティブ実装 | 🟢🟢🟢 | 高い採用率、最高のUX、シームレスな生体認証 | 即座にサイレントな認証 | 完全なネイティブ制御 | 中〜高 | 別途フローが必要 |
| システムWebView | 🟢🟢 | 良好な採用率、ブラウザに近い体験 | 標準的なブラウザのUX、共有キーチェーン | ブラウザベースの管理 | 低 | 優れている |
| 埋め込みWebView | 🟢 | 採用率は低め、追加の設定が必要 | iOSおよびAndroidのネイティブサポート(WebKit 1.12.1以上)、Conditional UIなし | 限定的な制御 | 中〜高 | 該当なし |
注意: システムWebViewと埋め込みWebViewは組み合わせて使用されることが多く、システムWebViewでログイン(自動的な認証情報の共有を含む)を処理し、埋め込みWebViewで設定画面のパスキー管理をレンダリングします。
重要な決定要因:
最新のモバイルプラットフォームでは、ネイティブアプリにパスキーを統合するための3つの異なるアプローチが提供されており、それぞれユーザー体験、技術的な複雑さ、OAuthの互換性においてトレードオフがあります。
ネイティブ実装: プラットフォームのAPI(iOSのAuthenticationServices、AndroidのCredential Manager)を使用して、アプリのUIに直接パスキーのフローを構築します。シームレスな生体認証による最高のユーザー体験を提供しますが、中〜高程度の技術的な実装作業が必要です。
システムWebView: プラットフォームのブラウザコンポーネント(iOSのASWebAuthenticationSession / SFSafariViewController、AndroidのChromeカスタムタブ)を使用して認証を処理します。OAuthベースのログインフローに最適であり、システムブラウザと認証情報を共有します。
埋め込みWebView: カスタマイズ可能なWebView(iOSのWKWebView、AndroidのWebView)をアプリ内に埋め込み、ネイティブアプリの骨組みとともにWeb認証を再利用します。URLバーのないネイティブな外観と、WebViewのUIに対する完全な制御を提供します。パスキー機能を有効にするには、権限やエンタイトルメント(iOS)、およびAndroidX WebKit 1.12.1以上のWebView構成(Android)などの追加の設定が必要です。
適切な選択は、アプリの認証アーキテクチャ、OAuthプロバイダーを使用しているかどうか、UIをどの程度制御する必要があるか、ネイティブファーストで構築しているか、またはWebコンポーネントを再利用しているかによって異なります。
ネイティブのパスキー実装は、プラットフォーム固有のAPIを使用してアプリのUIに直接組み込まれた認証フローにより、最適なユーザー体験を提供します。ユーザーは、プラットフォームネイティブのダイアログ、シームレスな生体認証、および可能な限り最速のログイン時間の恩恵を受けます。
ネイティブ実装を選択すべきケース:
preferImmediatelyAvailableCredentials
を使用して、パスキーが利用可能な場合に自動的にパスキーオーバーレイを表示できます。これにより、識別子を入力することなく、最速のログイン体験が提供されます。主な利点: preferImmediatelyAvailableCredentials()
ネイティブ実装では preferImmediatelyAvailableCredentials()
を活用して、パスキーが利用可能な場合にアプリの起動時に即座に表示される自動パスキーオーバーレイを作成できます。このユーザー名不要のフローは、可能な限り最速のログイン体験を提供します。ユーザーは識別子を先に入力することなく、即座にパスキーを確認できます。この機能はネイティブ実装専用であり、WebViewのバリアントでは利用できません。
以下の図は、ネイティブ認証がWebViewのConditional UIアプローチと比較して、どのように高速なユーザー体験を提供するかを示しています。
ネイティブの自動オーバーレイは、アプリ起動時に即座に認証が開始されるため、WebView実装がユーザーに入力フィールドの操作を求めるのに対し、パスキーの利用率が高く、優れたUXを提供します。
技術的要件の概要:
ネイティブのパスキー統合には、アプリとWebドメイン間の暗号化による信頼が必要です。これがないと、OSはすべてのWebAuthn操作を拒否します。主な要件は次のとおりです。
/.well-known/ でホストされるアプリドメイン関連付けファイル最大のメリット: Webサイトで作成されたパスキーがアプリでシームレスに機能し、その逆も同様です。
iOSでパスキーをネイティブに実装するには、WebAuthn操作用のAPIを提供するAppleのAuthenticationServicesフレームワークを使用します。
主なコンポーネント:
ASAuthorizationController: 認証フローを管理しますASAuthorizationPlatformPublicKeyCredentialProvider: パスキー要求を作成します開発のヒント
?mode=developer を追加して、強制的に最新のファイルを取得します。Androidのネイティブパスキー実装では、Credential Manager API(または下位互換性のための古いFIDO2 API)を使用します。
エンタープライズPasskeyホワイトペーパー. パスキープログラム向けの実践ガイド、展開パターン、KPI。
主なコンポーネント:
CredentialManager: すべての認証情報操作の中心となるAPICreatePublicKeyCredentialRequest: パスキーの登録用GetCredentialRequest: パスキーの認証用注: 現在、Androidのネイティブアプリには、iOSのConditional UIのようなキーボードでの提案機能はありません(ただし、WebアプリではConditional UIが機能します)。
パスキーをネイティブに実装するには、重要な課題と学んだ教訓があります。OSレベルで統合すると、デバイスやOSのバージョン間で問題が発生する可能性があります。
生のプラットフォームAPIを使用してパスキーを実装することもできますが、専用のSDKを使用すると、WebAuthnの複雑さやエッジケースを処理し、組み込みのテレメトリを提供することで、開発を大幅に加速できます。SDKは、ユニットテスト用のモック可能なインターフェースも提供します(シミュレーターでは生体認証をテストできないため、これは重要です)。
推奨: ネイティブ実装の場合、Corbado SDK(iOS Swift Passkey SDK、Android Kotlin Passkey SDK)の使用をお勧めします。これは、本番環境のデプロイを通じて発見された数多くのエッジケースを処理し、追加のテレメトリとテストを提供します。
Igor Gjorgjioski
Head of Digital Channels & Platform Enablement, VicRoads
We hit 80% mobile passkey activation across 5M+ users without replacing our IDP.
See how VicRoads scaled passkeys to 5M+ users — alongside their existing IDP.
Read the case studyシステムWebViewは、プラットフォームのネイティブなブラウザコンポーネントを使用して、アプリ内の認証を処理します。完全なネイティブ実装とは異なり、システムWebViewは実際のシステムブラウザ(iOSのSafari、AndroidのChrome)を使用してWebコンテンツを表示し、共有Cookie、保存された認証情報、および使い慣れたブラウザのセキュリティインジケーターを維持します。
システムWebViewを選択すべきケース:
主な利点:
プラットフォームのコンポーネント:
ASWebAuthenticationSession(認証フローに推奨)または
SFSafariViewController(一般的なブラウジング)GoogleやGitHubなどの主要企業は、既存のWeb認証ページのWebViewオーバーレイを介してモバイルアプリにパスキーログインを追加するために、このアプローチを採用しています。これは、完全なネイティブ認証の再構築がすぐに実現できない場合に適しています。
iOSには、認証用の2つの主要なシステムWebViewコンポーネントが用意されています。
ASWebAuthenticationSession(認証に推奨):
SFSafariViewController(一般的なブラウジング):
| 機能 | ASWebAuthenticationSession | SFSafariViewController |
|---|---|---|
| 主なユースケース | 認証フロー | 一般的なWebブラウジング |
| OAuth/OIDC | 非常に優れている | 良好 |
| パスキー対応 | あり | あり |
| カスタマイズ性 | 限定的 | 最小限 |
アプリがOAuthベースのログインを使用している場合、ASWebAuthenticationSession
は認証シナリオ専用に設計されており、セキュリティとユーザー体験の最適なバランスを提供するため、推奨される選択肢です。
Chromeカスタムタブ (CCT) は、アプリ内にChromeを活用した認証体験を提供します。
主な機能:
OAuth統合: Chromeカスタムタブは、iOSのASWebAuthenticationSessionに相当するAndroidの機能であり、保存されているパスキーへのアクセスを維持しながら、優れたOAuthサポートを提供します。
ライブデモでパスキーを試せます。
埋め込みWebViewは、アプリ内のWebコンテンツのレンダリングを完全に制御し、URLバーなしでCookie、セッション、ナビゲーションを直接操作できるようにします。ただし、この制御機能により、パスキー機能を有効にするための追加の技術的要件が発生します。
埋め込みWebViewを選択すべきケース:
重要なコンテキスト:
多くのアプリではハイブリッドなアプローチを使用しています。システムWebViewが最初のOAuth認証(パスキーがシームレスに機能する)を処理し、認証後に埋め込みWebViewに切り替えて設定でパスキーを管理します。問題は、埋め込みWebView内でパスキーを直接使用しようとする場合に発生します。
技術的要件:
埋め込みWebViewは、システムWebViewと比較して追加の設定が必要です。
プラットフォームのコンポーネント:
WKWebViewandroid.webkit.WebViewトレードオフ:
WebViewを介してパスキーを実装する場合、システムWebViewと埋め込みWebViewの違いを理解することが重要です。上記で概説した3つのアプローチ(ネイティブ実装、システムWebView、および埋め込みWebView)は、それぞれ異なるユースケースに対応しています。
iOSでは、アプリ内でWebコンテンツを表示するための複数のオプションがあります。
Androidの主な選択肢は次のとおりです。
android.webkit.WebView)であり、本質的にはアクティビティに埋め込むことができるミニブラウザです。高度にカスタマイズ可能ですが、アプリのプロセスで実行されます。次のセクションでは、iOSとAndroidのこれらのWebViewタイプについて少し深く掘り下げ、パスキー認証フローにどれが最も適しているかを説明します。
最新ニュースを受け取るためにPasskeys Substackを購読しましょう。
Appleのプラットフォームは、上記の3つのWebViewオプションを提供しています。どれを選択するかによって、アプリ内でパスキーをどれだけスムーズに使用できるかが変わります。
iOSでのさまざまなWebViewの動作をテストするには、アプリWebView - WKWebView and UIWebView renderingをお勧めします。
WKWebViewは、iOS用の多目的なWebViewコンポーネントです。開発者はWKWebViewを埋め込んで、UIと動作を高度に制御しながらWebコンテンツをレンダリングできます。WKWebViewはSafariと同じレンダリングエンジンを使用するため、非常にパフォーマンスが高く、最新のWeb機能をサポートしています。理論的には、正しく構成されていれば、WKWebViewはWebAuthn(したがってパスキー)を処理できますが、セキュリティ上の理由から一部の高度なブラウザ機能が制限される可能性があることに注意してください。注意すべき点の1つは、WKWebViewはデフォルトでモバイルSafariとCookieやキーチェーンのデータを共有しないことです。WebViewセッションはSafariのセッションから分離されているため、ユーザーは最初からログインし直す必要がある場合があります。また、WKWebViewのコンテンツはアプリによって完全にカスタマイズできるため、ユーザーにはアドレスバーやSafariのUIが表示されません。これはブランディングには最適ですが、ページの正当性を確認するための手がかりが少なくなることを意味します(フィッシング対策の懸念)。一部のアプリはWKWebViewを悪用してスクリプトを挿入したり、コンテンツを変更したりしたため(たとえば、TikTokはアプリ内ブラウザ経由で追跡用のJSを挿入したと指摘されています)、WKWebViewを安全でユーザーに信頼される方法で使用するように注意する必要があります。
SFSafariViewControllerは、アプリ内でのSafariの体験を提供します。SFSafariViewControllerでURLを開くと、実際のSafariブラウザで開くのとほぼ同じですが、ユーザーはアプリのUI内に留まります。パスキーに関する利点は非常に大きいです。これは本質的にSafariであるため、ユーザーのiCloudキーチェーンと保存されたパスキーにアクセスできます。iOS 11以降ではCookieは共有されないことに注意してください。これは、ユーザーがすでにサイトのパスキーを持っている場合、Safariがそれを見つけ、簡単なログインのためにConditional UIのオートコンプリートを表示することさえできることを意味します。SFSafariViewControllerはカスタマイズ性が低く(ツールバーをあまり変更できません)、セキュリティとプライバシーの機能の多くを自動的に処理します。HTTPS用の南京錠アイコンとともにURLバーが表示されるため、ユーザーは正しいドメインにいると確信できます。一般的に、SFSafariViewControllerは生のWKWebViewよりも安全であると考えられており、実装も簡単です(Appleがドロップインとして提供しています)。主なトレードオフは、ルックアンドフィールに対するある程度の制御を犠牲にすることです。認証フローの場合、それは通常許容されます。ここでの優先事項はセキュリティとログインの容易さであり、SFSafariViewControllerはSafariのコンテキストを使用することでこれに優れています。
| WKWebView | SFSafariViewController | |
|---|---|---|
| ユーザー体験 | - ネイティブな感覚: 開発者はアプリのデザインに合わせて外観をカスタマイズできるため、ユーザーはWebコンテンツをアプリのネイティブな部分であると感じる可能性があります。 - 自動入力: Safariのデータによる自動入力が可能です。 | - シームレス: ユーザーのSafariの設定を利用したシームレスなユーザー体験により、ネイティブアプリとブラウザ間で一貫したWebブラウジングが保証されます。 |
| 開発者体験 | - 高度なカスタマイズ性: 幅広いカスタマイズと構成が可能です。 - 柔軟性: Webコンテンツを操作するための多くのAPIがあります。 | - 中程度のカスタマイズ性: 特にWKWebViewと比較して、カスタマイズのオプションは限られています。 - シンプル: WKWebViewと比較して実装が簡単です。 |
| パフォーマンス | - やや遅い: 実装やWebコンテンツによっては、読み込み速度を最適化できますが、カスタム機能やインタラクションの追加処理により、SFSafariViewControllerと比較して遅くなる場合があります。 | - やや速い: 速度と効率を最適化したSafariエンジンを活用するため、通常はパフォーマンスが向上し、Webページの読み込み時間が短縮されます。 |
| 信頼と認識 | - URL表示は不要: WKWebViewは多くの場合URLを表示しないため、ユーザーがWebページを検証するのが難しくなります。悪意のあるアプリがこの動作を模倣し、認証情報をフィッシングする可能性があります。 | - ブラウザのような体験: Safariを使用してWebページをレンダリングし、「ブラウザのような」体験を提供します。ユーザーはURLを確認し、Safariの自動入力機能にアクセスできるため、使い慣れたインターフェースにより信頼が高まる可能性があります。 |
| 分離 | - 分離されている: CookieとセッションはSafariから分離されています。ユーザーがWKWebViewに自動的にログインすることはありません。 | - 分離されている: CookieとセッションはSafariから分離されています。ユーザーがSFSafariViewControllerに自動的にログインすることもありません。 |
| 脆弱性 | - 安全: Appleのアプリサンドボックスにより本質的に安全ですが、動作とセキュリティはアプリの実装に依存します。正しく実装されていない場合、潜在的な脆弱性があります。 | - より安全: フィッシング対策や悪意のあるWebサイトの警告など、Safariの組み込みセキュリティ機能の恩恵を受けます。これらの機能とSafariに対するユーザーの親しみやすさから、一般に、Webコンテンツの表示においてWKWebViewよりも安全であると考えられています。 |
| その他 | - 利用できない機能: セキュリティ上の懸念と、WKWebViewがアプリケーションコンテキストで実行されるため、一部のブラウザ機能(WebAuthnなど)には完全にアクセスできない場合があります。 - JavaScriptの挿入: TikTokなどの一部のアプリは、アプリ内のWKWebViewに追跡用のJavaScriptを挿入したり、ユーザーのコントロールを制限したりします(Facebookなど)。 - プライバシーの問題: プライバシーに関するコミュニティのフィードバックが多くなっています。 | - JavaScriptの挿入なし: アプリからのJavaScriptの実行を許可しないため、セキュリティとプライバシーが強化されます。また、JavaScriptのアラートや確認をサポートしていないため、特定のWebページでのユーザー体験に影響を与える可能性があります。 - リーダーモード: クリーンで読みやすいバージョンの記事を表示するリーダーモードを提供します。 |
SFAuthenticationSession / ASWebAuthenticationSession – これらのクラス(後者は新しいSwift向けの名称)は、OAuthやOpenID Connectなどのログインフロー専用に構築されています。Webページを介してユーザーを(おそらく外部のIdPに対して)認証する必要がある場合、iOSではこれらのセッションが推奨される選択肢です。これらは内部でSafariブラウザを利用し、SafariとCookieやストレージを共有するという点でSFSafariViewControllerに非常によく似ています。主な違いは、SFAuthenticationSessionは常にWebページを使用して認証することをアプリがユーザーに(ユーザーの認識のために)プロンプトで通知し、利用可能な場合はユーザーの既存のSafariセッションを自動的に使用することです。
利点はシームレスなSSO体験です。ユーザーがSafariですでにプロバイダーにログインしている場合、このセッションはそのCookieを使用して別のログインを回避できます。パスキーの場合、これはSafari/iCloudキーチェーンに保存されているパスキー認証情報をここでも使用できることを意味するため重要です。Appleの公式ガイダンスでは、ログインフローのように見えるものにはASWebAuthenticationSessionを使用することを推奨しています。利点は、プライバシーの強化(アプリは認証情報やCookieを認識せず、Safariが処理します)と、組み込みのSSOサポートです。欠点は、認証フローに限定されていることです(アプリ内で任意のWebコンテンツをレンダリングするだけのためには使用しません)。要約すると、iOSでWebViewアプローチを選択する場合、ASWebAuthenticationSessionは安全であり、Safariと状態を共有し、認証専用に構築されているため、パスキーを実装するための最良の選択であることが一般的です。
実際にどれだけの人がパスキーを使っているか確認できます。
AndroidでのWebViewの選択は、従来のWebViewとChromeカスタムタブの間で行われます。
AndroidでのさまざまなWebViewの動作をテストするには、WebView vs Chrome Custom Tabsアプリをお勧めします。
Android WebView (android.webkit.WebView) は、アクティビティのレイアウトにWebページを埋め込むことができるコンポーネントです。WKWebViewと同様に完全な制御を提供します。ナビゲーションの傍受、JavaScriptの挿入、UIのカスタマイズなどが可能です。また、アプリのプロセス内で実行されます。パスキーにWebViewを使用するということは、アプリがWebログインページを読み込み、そのページがWebAuthnパスキーのセレモニーを開始できることを意味します。最新のAndroid WebViewはWebAuthnをサポートしています(デバイスのWebView実装がAndroid System WebViewまたはChromeコンポーネント経由で最新である場合)。重要な考慮事項の1つは、デフォルトではAndroid WebViewはユーザーのChromeブラウザとCookieや保存された認証情報を共有しないことです。そのため、WebViewで作成または使用されたパスキーがChromeに認識されない場合があり、その逆も同様です。この分離はセキュリティには良いことですが(アプリはブラウザのCookieを読み取れません)、ユーザーがすでにChromeで認証されている場合でも、再度ログインを強制する可能性があります。もう1つの問題は信頼です。プレーンなWebViewにはURLやSSLのロックアイコンが表示されないため、ユーザーはフィッシングされないようにアプリを完全に信頼する必要があります。Googleは、潜在的なフィッシングのリスクがあるため、Google OAuthサインインにWebViewを使用することを禁止しています。パフォーマンスの面では、WebViewは問題ありませんが、特に重いページを読み込む場合、ユーザーのデフォルトのブラウザを使用するよりも遅くなったり、メモリを消費したりする可能性があります。
**Chromeカスタムタブ (CCT)**はハイブリッドなアプローチです。これらは、アプリの一部のように見えるChromeレンダリングページをアプリから開くことを可能にします。ツールバーの色をカスタマイズしたり、アプリのロゴを追加したりできますが、コンテンツは別のプロセスでChromeによってレンダリングされます。パスキーの場合、CCTにはいくつかの利点があります。ユーザーのCookieと認証情報をChromeブラウザと共有するため、ユーザーがChrome(Googleパスワードマネージャー)を介してパスキーを保存している場合、カスタムタブはそれにアクセスできます。ユーザーには実際のURLとセキュリティインジケーターも表示され、信頼が構築されます。多くの場合、パフォーマンスも優れています。より高速な読み込みのために、バックグラウンドでChromeを「ウォームアップ」することができます。そして重要なのは、セキュリティが強力であることです。本質的にChromeアプリであるため、Googleセーフブラウジングなどによりセッションが保護され、アプリがページに任意のスクリプトを挿入することはできません(特定の攻撃を防ぎます)。
欠点は、ユーザーがサポートされているブラウザ(通常はChrome)をインストールし、最新の状態に保つ必要があることです。ほとんどのAndroidユーザーはそうしていますが、一部の地域の特定のデバイスでは、これが問題になる可能性があります。全体として、Androidで埋め込みWebアプローチを採用する場合、統合とセキュリティのバランスが良いため、パスキーのフローにはChromeカスタムタブが推奨されます。実際、認証にデフォルトのブラウザを活用するという点で、iOSのSFSafariViewController/ASWebAuthSessionに多くの点で似ています。
(余談: AppleのWKWebView対SFSafariViewControllerとAndroidのWebView対CCTには多くの類似点があります。Safari VCとChrome Tabsはどちらもブラウザの状態を共有し、より優れたセキュリティを提供しますが、WKWebView/Android WebViewはより多くの制御を提供しますが、Webコンテンツを分離します。パスキーの場合、状態(Cookie、認証情報ストア)を共有して、パスキーにシームレスにアクセスして作成できるようにすることが通常は望ましいです。)
| 機能 | WebView | Chromeカスタムタブ |
|---|---|---|
| ユーザー体験 | - 柔軟性: Webコンテンツの操作や、JavaScriptダイアログ、権限リクエストの処理など、ユーザーインタラクションを管理するための豊富なAPIセットを提供します。 - 一貫性: 特に多様なWebコンテンツにおいて、一貫したUXを管理するのは困難な場合があります。 | - ブラウザの機能: データセーバーやデバイス間で同期される自動入力などの機能を共有します。 - 戻るボタン: 統合された戻るボタンにより、ユーザーは簡単にアプリに戻ることができます。 - 依存性: Chromeアプリに依存しており、すべてのユーザーのデバイスで利用可能または更新されているとは限りません。 - ブラウザへのリダイレクト: 特定の機能はユーザーをChromeアプリにリダイレクトし、ユーザー体験を妨げる可能性があります。 - 部分的なカスタムタブ: 画面の一部のみをChromeカスタムタブに使用し、残りの部分にネイティブアプリを表示できます。 - サイドシート: 横向きモードや大画面デバイスでは、Chromeカスタムタブは画面の片側にのみ表示され、画面の残りの部分にはネイティブアプリが表示されます。 |
| 開発者体験 | - 高度なカスタマイズ性: 広範なカスタマイズのオプション/ニーズを提供します。 - インタラクティビティ: Webコンテンツを操作し、ユーザーインタラクションを管理するための多数のAPIを提供します。 | - カスタマイズ性: ツールバーの色、アクションボタン、下部ツールバー、カスタムメニューアイテム、イン/アウトのアニメーションをカスタマイズできます。 - コールバック: 外部ナビゲーション時にアプリケーションにコールバックを提供します。 - セキュリティ機能: すぐに使える機能を提供し、リクエスト、権限の付与、Cookieストアを管理する必要をなくします。 |
| パフォーマンス | - 平凡なパフォーマンス: Chromeカスタムタブ (CCT) と同レベルのパフォーマンスを提供できない場合があります。 | - プレウォーミング: ページの読み込み時間を短縮するために、バックグラウンドでのブラウザのプレウォーミングとURLの推測的な読み込みが含まれます。 - 優先度: カスタムタブを起動するアプリの重要度を「フォアグラウンド」レベルに引き上げることで、使用中にアプリが排除されるのを防ぎます。 |
| 信頼と認識 | - URLとSSLが非表示: WebViewでは、URLとSSLの情報は本質的に表示されません。アプリ開発者がこれらの機能を実装しない限り、ユーザーは正しいWebサイトにいるのか、フィッシングサイトにいるのかを知ることができません。 | - URLとSSLが表示される: 実際のChromeブラウザを使用してページをレンダリングします。ユーザーはURLとSSL証明書(接続が安全であることを示す)を確認できます。これにより、ユーザーはフィッシングサイトにいないという確信を持てる可能性があります。 |
| 分離 | - アプリのプロセス内で実行: アプリに悪意のあるコードの実行を許可する脆弱性がある場合、WebViewが侵害されるリスクがあります。ただし、WebViewもアップデートを受け取りますが、その動作とセキュリティは、それを使用するアプリにより依存する可能性があります。 - Cookie / セッションの共有なし: デバイスのメインブラウザとCookieやセッションを共有しないため、分離は提供されますが、ユーザーは再度ログインする必要がある場合があります。 | - Chromeのプロセス内で実行: カスタムタブはChromeの一部であるため、同じプロセスで実行され、Chromeと同じセキュリティアップデートおよび機能を備えています。 - 共有Cookieと権限モデル: ユーザーがサイトに再度サインインしたり、権限を再付与したりする必要がないようにします。 - Chromeの設定と環境設定: Chromeの設定と環境設定を利用します。 |
| 脆弱性 | - 認証情報を盗むコールバック: 潜在的な脆弱性として、JavaScriptが必要な場合があり、これにより他のアプリが悪意のあるコードを実行する可能性が生じます。たとえば、ユーザー名とパスワードを傍受しようとするコールバックの登録などです。 - フィッシング: さらに、悪意のあるアプリがフィッシングの試みとして、リンクフローを模倣した別のWebページを開く可能性があります。 | - Googleセーフブラウジング: Googleのセーフブラウジングを採用して、ユーザーとデバイスの両方を危険なサイトから保護します。 - 安全なブラウザの装飾: ユーザーが操作している正確なURLを常に確認できるようにし、Webサイトの証明書情報を表示できるようにして、フィッシングのリスクを軽減します。さらに、カスタムタブではJavaScriptの挿入は許可されていません。 |
| その他 | - GoogleはGoogleアカウントへのログインのためのWebViewを禁止しました |
どのアプローチを選択する場合でも、パスキー機能を有効にするには特定の技術的要件を満たす必要があります。このセクションでは、Well-known関連付けファイル、iOSのエンタイトルメント、およびAndroid WebViewの構成に関する包括的なガイダンスを提供します。
管理対象デバイスに関する注意事項: モバイルデバイス管理 (MDM) ポリシーが認証情報の保存を制御している管理対象デバイスでは、パスキーの動作が大きく変わります。管理対象デバイスでのパスキーのテストについては、管理対象のiOSおよびAndroidデバイスでのパスキーを参照してください。
ネイティブおよび埋め込みWebViewのフローでは、アプリとWebドメイン間の暗号化による信頼を確立するために関連付けファイルが必要です。システムWebView(ASWebAuthenticationSession)およびChromeカスタムタブでは、アプリとサイトの関連付けは必要ありません。
AASAファイルは、iOSアプリとWebドメインの間の接続を確立し、両方のプラットフォームでパスキーが機能するようにします。
ファイルの場所: https://yourdomain.com/.well-known/apple-app-site-association
構成要件:
/.well-known/apple-app-site-association でホストするapplication/json.well-known パスでのリダイレクトなしAASAファイルの例:
{ "webcredentials": { "apps": ["TEAMID123.com.example.app"] } }
AASAのキャッシュとテスト:
AppleはCDNを使用してAASAファイルを積極的にキャッシュするため(最大24〜48時間)、開発やテストの妨げになる可能性があります。開発中にキャッシュをバイパスするには:
?mode=developer を追加します⚠️ 重要: 本番環境のリリースで ?mode=developer
を使用しないでください。このパラメーターは開発専用です。本番環境で使用すると、iOSがAASAファイルを正しく検出できなくなり、パスキー機能が壊れます。
検証: AppleのAASA Validator を使用して、構成を確認してください。
AndroidはDigital Asset Linksを使用して、アプリとWebサイトの関係を検証します。
ファイルの場所: https://yourdomain.com/.well-known/assetlinks.json
構成要件:
/.well-known/assetlinks.json でホストするapplication/jsonassetlinks.jsonファイルの例:
[ { "relation": [ "delegate_permission/common.handle_all_urls", "delegate_permission/common.get_login_creds" ], "target": { "namespace": "android_app", "package_name": "com.example.app", "sha256_cert_fingerprints": [ "AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99" ] } } ]
検証: GoogleのDigital Asset Links Generator を使用して、構成を作成および確認してください。
iOSアプリがパスキー機能にアクセスするには、適切なエンタイトルメントが必要です。要件は、実装アプローチによってわずかに異なります。
エンタイトルメントファイル(Flutterアプリでは多くの場合
Runner.entitlements、ネイティブiOSプロジェクトでは YourApp.entitlements
という名前)は、Appleのシステムによって付与される特別な権限と機能を定義します。パスキーの場合、このファイルでAssociated
Domainsを構成します。
ファイルの場所: 通常はXcodeプロジェクトの ios/Runner/Runner.entitlements にあります
ネイティブ実装および埋め込みWebViewでは、アプリをWebドメインにリンクするためにAssociated Domains機能が必要です。システムWebView(ASWebAuthenticationSession)はSafariコンテキストで実行されるため、これは必要ありません。
Xcodeでの設定:
webcredentials: プレフィックスを付けてドメインを追加します構成の例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.developer.associated-domains</key> <array> <string>webcredentials:yourdomain.com</string> <string>webcredentials:subdomain.yourdomain.com</string> </array> </dict> </plist>
| アプローチ | Associated Domains 要否 | 追加の構成 |
|---|---|---|
| ネイティブ実装 | 必要 | 専用の実装 |
| システムWebView | 不要 | デフォルトのWebセットアップで機能します |
| 埋め込みWebView | 必要 | AndroidX WebKit 1.12.1以上の構成が必要です |
複数ドメイン: アプリが複数のドメインと連携する必要がある場合は、Related Origin Requests (ROR) が必要になる場合があります。
Androidの埋め込みWebViewは、2つの異なるアプローチを通じてパスキーをサポートします。新しいWebKitベースのアプローチ(セクション5.3.1)と、古いJavaScriptブリッジアプローチ(セクション5.3.2)です。システムWebView(Chromeカスタムタブ)には構成は必要ありません。認証情報は自動的に機能します。
Androidでは、両方の実装アプローチを示す公式のWebViewパスキーサンプルが提供されています。
ネイティブなパスキー処理と統合された最新のWebKit。このアプローチは、カスタムブリッジコードを必要とせずにネイティブのWebAuthnサポートを提供します。
公式サンプル: Webkit WebView MainActivity
要件:
実装:
import androidx.webkit.WebSettingsCompat import androidx.webkit.WebViewFeature // Web Authenticationがサポートされているか確認 if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) { // Web Authenticationを有効にする WebSettingsCompat.setWebAuthenticationSupport( webView.settings, WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP ) // JavaScriptを有効にする webView.settings.javaScriptEnabled = true }
重要なポイント:
WebViewFeature.WEB_AUTHENTICATION
を確認してくださいmediation:"conditional"(入力フィールドでのパスキー自動入力)は埋め込みWebViewでは機能しませんバージョンの注意事項:
AndroidX WebKit 1.12.0以前では、埋め込みWebViewにネイティブなWebAuthnサポートは存在しませんでした。この古いアプローチでは、ネイティブなWebView WebAuthnサポートを持たないデバイスのパスキーを処理するために、Webとネイティブのブリッジを使用します。
公式サンプル:
使用すべきケース: 古いAndroidバージョン、または従来のWebView実装を持つデバイスをサポートする場合。
チームは次のいずれかを行う必要がありました。
詳細な実装については、AndroidのCredential Manager WebView統合ガイドを参照してください。ただし、最新のアプリにはネイティブなWebKit 1.12.1以上のアプローチを使用することを強くお勧めします。
推奨: AndroidX WebKit 1.12.1以上でネイティブなWebAuthnサポートを使用します。実行時に利用できない場合は、共有認証情報による優れたパスキーサポートを提供するChromeカスタムタブにフォールバックします。
ネイティブアプリにパスキーを実装する場合、アプリとWebドメイン間で信頼を確立する必要があります。このセクションでは、単一ドメイン、複数の関連ドメイン (ROR) の処理方法、およびWell-known関連付けファイルが正しく構成されているかを確認する方法について説明します。
単一のドメイン(例: kayak.com)を使用するアプリの場合は、次のものが必要です。
webcredentials:kayak.com で構成されたAssociated DomainsエンタイトルメントRelated Origins
(ROR) は、単一のパスキーセットが複数の関連ドメイン(例:
kayak.com、kayak.de、kayak.co.uk)で機能するようにするWebAuthnの機能です。
RORは、各サイトの
/.well-known/webauthn
エンドポイントを使用して関連するオリジンを定義し、AASAやassetlinksファイルは使用しません。
重要なポイント:
/.well-known/webauthn をホストします構成の例:
アプリが kayak.com および kayak.de
と連携する場合、両方のドメインで次のことを行う必要があります。
本番環境に移行する前に、Well-knownファイルが正しく構成され、アクセス可能であることを確認してください。AppleとGoogleは、ファイルの可用性を確認するためのCDNベースのテストURLを提供しています。
| ドメイン | Apple AASA の検証 | Google Digital Asset Links の検証 |
|---|---|---|
| kayak.com | テスト AASA ファイル Apple CDN がファイルを取得できるか確認 | テスト assetlinks.json Google が asset links にアクセスできるか検証 |
| kayak.de | テスト AASA ファイル Apple CDN がファイルを取得できるか確認 | テスト assetlinks.json Google が asset links にアクセスできるか検証 |
これらのテストURLの使用:
?nocache=1
パラメーターは、CDNキャッシュをバイパスして強制的に最新の取得を行いますkayak.com または kayak.de をご自身のドメインに置き換えてくださいテストの注意点: すべてのドメインに適切に構成されたWell-knownファイルがあることを確認してください。いずれかのドメインでファイルが欠落していたり、誤って構成されていたりすると、そのドメインのパスキー機能が壊れる可能性があります。
詳細情報: ネイティブアプリでのWebAuthn Relying Party ID
適切な実装アプローチの選択は、アプリの認証アーキテクチャ、OAuth要件、およびセッション制御のニーズによって異なります。このデシジョンツリーを使用して、最適な方針を決定してください。
次のフローチャートは、アプリの要件に基づいて適切な実装アプローチを選択するためのガイドです。
各パスのクイックリファレンス:
各アプローチの主な側面におけるパフォーマンスは次のとおりです。
| アプローチ | パスキーの作成 | パスキーの使用 | パスキーの管理 | 技術的複雑さ | OAuthのサポート | セットアップ時間 |
|---|---|---|---|---|---|---|
| ネイティブ実装 | 高い採用率 シームレスな生体認証、最高のUX | 即座にサイレントpreferImmediatelyAvailableCredentials によりアプリ起動時に自動オーバーレイが表示される | 完全なネイティブ制御 アプリの設定に統合 | 中〜高 プラットフォーム固有のAPI | 別途OAuthフローの実装が必要 | 数週間〜数ヶ月 |
| システムWebView | 良好な採用率 ブラウザに近い体験、使い慣れている | 標準的なブラウザのUX 入力フィールドでのConditional UI、共有キーチェーン | ブラウザベース ユーザーはブラウザ経由で管理 | 低 最小限のネイティブコード | 優れている OAuth専用に構築されている | 数日〜数週間 |
| 埋め込みWebView | 採用率は低め 構成が必要 | ネイティブWebAuthnサポート WebKit 1.12.1以上、Conditional UIなし | 限定的な制御 ネイティブ統合なし | 中〜高 WebViewの構成+権限 | 構成が必要 | 1〜2週間 |
側面の解説:
推奨: システムWebView
アプリがOAuth2、OIDC、またはソーシャルログインプロバイダー(Google、GitHub、Microsoftなど)を介して認証を行う場合、システムWebViewが最適な選択肢です。
ASWebAuthenticationSession はOAuthフロー専用に構築されています例: kayak.comやkayak.deなどの旅行アプリは、認証にOAuthを使用しています。システムWebViewにより、既存のOAuthインフラストラクチャを維持しながら、Web認証ページを通じてパスキーのサポートを追加できます。
推奨: ハイブリッドアプローチ
最初のOAuth認証にはシステムWebViewを使用し、認証後のセッションには埋め込みWebViewを使用します。
使用すべきケース: OAuthを介して認証を行うが、セッションの直接操作が必要な認証済みWebコンテンツを表示する必要があるアプリ。
推奨: ネイティブ実装
ゼロから構築する場合、またはネイティブ画面がある場合は、完全にネイティブにします。
preferImmediatelyAvailableCredentials
を使用してアプリ起動時に自動パスキーオーバーレイを表示します。これはネイティブ実装専用であり、最高のコンバージョン率を提供します新しいアプリの場合: 初日からネイティブログインを構築することを強くお勧めします。最適なUXを実現し、将来のWebViewからネイティブへの移行を回避できます。
推奨: 段階的な移行
次の図は、増分的な移行パスを示しています。
各段階は前の段階に基づいて構築されるため、既存のユーザーを混乱させることなく段階的な改善が可能になります。
| 要件 | ネイティブ | システムWebView | 埋め込みWebView |
|---|---|---|---|
| Well-knownファイル (AASA/assetlinks) | 必要 | 不要 | 必要 |
| iOS Associated Domains | 必要 | 不要 | 必要 |
| Android WebKit ライブラリ | 該当なし | 不要 | 必要 (1.12.1以上) |
| Relying Party ID | ドメインと一致させる必要がある | ドメインと一致させる必要がある | ドメインと一致させる必要がある |
詳細な構成手順については、セクション5を参照してください。
ネイティブアプリでのパスキーのテストには、構造化された多層的なアプローチが必要です。テストピラミッドに従ってください。ユニットテスト(分離されたロジック)、統合テスト(シミュレーター/エミュレーターでのWebAuthnセレモニー)、およびシステムテスト(実機でのエンドツーエンド)です。
必須のテストカテゴリ:
自動化戦略、プラットフォーム固有の注意点、完全なプレフライトチェックリストなど、包括的なテストのガイダンスについては、専用のガイド「ネイティブiOSおよびAndroidアプリでのパスキーフローのテスト」を参照してください。
従来のログイン(パスワード、OAuth)が成功した後に、パスキーの作成をユーザーに促すことを検討してください。この段階的な変換アプローチには、次の利点があります。
例: システムWebView経由でOAuthログインした後、ネイティブプロンプト「Face IDを使用してすばやくログインできるようにしますか?」を表示します。同意した場合は、システムWebViewで読み込まれたWebページを通じてパスキーを作成します。
ネイティブ実装、システムWebView、埋め込みWebViewのいずれを介してパスキーを実装するかを決定することは、セキュリティ、ユーザー体験、開発の複雑さに影響を与える重要な設計上の選択です。万能の答えはありません。
OAuthベースのアプリの場合: システムWebView(ASWebAuthenticationSession、Chromeカスタムタブ)が推奨される出発点です。優れたOAuthサポート、最小限の実装労力、および認証情報の自動共有を提供します。
ネイティブファーストのアプリの場合: できるだけ早くネイティブに移行してください。ネイティブのパスキーログインは、WebView実装では提供できないアプリ起動時の自動パスキーオーバーレイを可能にする
preferImmediatelyAvailableCredentials
のような専用機能により、最もシームレスなUXを提供します。iOSとAndroidがパスキーをファーストクラスでサポートするようになった現在、現実世界での成功事例は高い採用率を示しています。オープンソースのSDKやプラットフォームのライブラリなどのツールは成熟しており、妥当な期間でのネイティブ統合が可能になっています。デバイス管理ポリシー、デバイス間の同期、サードパーティのプロバイダーに留意する必要がありますが、これらの課題は慎重なエンジニアリングとテストで管理できます。その結果、セキュリティが大幅に向上するとともに、使いやすさと速さでユーザーを喜ばせるアプリのログインが実現します。
埋め込みWebViewフレームの要件がある場合: 埋め込みWebViewは、現実世界の2つのシナリオで一般的に使用されます。まず、OAuthベースのアプリでは、多くの場合、最初のログインフローにシステムWebViewを使用し、セッション制御が必要な設定画面でパスキー管理オプションをレンダリングするために埋め込みWebViewに切り替えます(ただし、両方のフローにシステムWebViewを維持することでこれを簡略化するアプリもあります)。次に、パスキーを採用する前にWebViewフレームに認証フローをすでに埋め込んでいるアプリは、一貫性を保つためにこのパターンを継続します。ネイティブのWebAuthnサポート(AndroidX WebKit 1.12.1以上)を備えた埋め込みWebViewには構成とセットアップ(権限、エンタイトルメント、WebView設定)が必要ですが、カスタムJavaScriptブリッジコードは不要になりました。Conditional UIは埋め込みWebViewではサポートされていないことに注意してください。既存の埋め込み認証パターンを維持する場合、または認証後の画面のセッション/Cookie制御が必要な場合に、このアプローチを選択します。
結局のところ、ネイティブアプリのパスキーは、ユーザーの利便性とセキュリティの両方において大きな飛躍を意味します。ネイティブ、システムWebView、または埋め込みWebViewのいずれで実装されていても、フィッシングのリスクとユーザーのパスワード管理の負担を排除します。VicRoadsのネイティブアプリのパスキー統合のような現実世界の実装は、自動パスキーオーバーレイのような機能を使用して適切に実行された場合、ネイティブファーストのアプローチが最も高いユーザーの採用率と満足度をもたらすことを示しています。ユーザーフレンドリーな認証のベストプラクティスに従い、新しいアプリのネイティブファースト、OAuthフローのシステムWebView、または既存の埋め込みパターンの埋め込みWebViewなど、アプリのアーキテクチャに合った実装アプローチを選択することで、パスキーのビジョンである「誰にとってもシンプルで安全かつ楽しい認証」を真に実現するパスワードレスの生体認証ログインを提供できます。
ネイティブアプリでパスキーが機能しない場合は、実装アプローチ別に以下の一般的な問題を確認してください。
application/json.well-known パスでのリダイレクトがないhttps://your-domain.com(app:// ではない)webcredentials:yourdomain.com が設定されているASWebAuthenticationSession(推奨)または SFSafariViewController
を使用している?mode=developer でテストする(本番環境では削除する)WebViewFeature.WEB_AUTHENTICATION のランタイム機能チェックWEB_AUTHENTICATION_SUPPORT_FOR_APP を指定して
setWebAuthenticationSupport() が呼び出されている"NotAllowedError: The request is not allowed by the user agent or the platform in the current context"
setWebAuthenticationSupport()
の呼び出しパスキーのプロンプトが表示されない
?mode=developer
を使用する、WebViewのタイプを確認する詳細なデバッグについては、ネイティブアプリのRelying Party IDに関する記事を参照してください。
よくある落とし穴: アクセスが制限された(IPホワイトリスト、VPNのみ)ステージング環境は失敗します。AppleとGoogleのCDNが関連付けファイルを取得できる必要があるからです。
https://app-site-association.cdn-apple.com/a/v1/your-staging-domain.com?nocache=1https://digitalassetlinks.googleapis.com/v1/statements:list/?source.web.site=https://your-staging-domain.com&relation=delegate_permission/common.handle_all_urls本番環境のrpIDを使用したステージングサブドメイン:
ステージング環境(例: stg.login.example.com)がrpIDとして本番環境ドメイン(例:
example.com)を使用している場合、AASAのルックアップはステージングのサブドメインではなくrpIDドメインで発生します。これは次のことを意味します。
例(複数の環境で1つのAASAを共有する場合):
{ "webcredentials": { "apps": [ "TEAMID123.com.example.app", "TEAMID123.com.example.app.dev", "TEAMID123.com.example.app.stg", "TEAMID123.com.example.app.pre" ] } }
推奨: 環境間で認証情報が重複しないように、ステージングドメインに一致する別のステージングrpIDを使用します。これには、ステージングドメインにパブリックにアクセス可能なAASAファイルが必要です。
?mode=developer の明確化:
Associated Domainsの ?mode=developer
パラメーターはAppleのCDNキャッシュをバイパスしますが、アクセス可能性の要件はバイパスしません。AASAファイルは、デバイスから(AppleのCDNを経由せず、直接)到達可能である必要があります。これは、AASAの変更を反復する開発中は役立ちますが、ステージングサーバーがIPホワイトリストに登録されている場合は役立ちません。
Corbado ネイティブ SDK:
プラットフォームのドキュメント:
検証ツール:
Corbadoは、大規模なconsumer認証を運用するCIAMチームのためのPasskey Intelligence Platformです。IDPのログや一般的なanalyticsツールでは見えないものを可視化します。どのデバイス、OSバージョン、ブラウザ、credential managerがpasskeyに対応しているか、なぜ登録がログインにつながらないのか、WebAuthnフローのどこで失敗するか、OSやブラウザのアップデートがいつ静かにログインを壊すか — Okta、Auth0、Ping、Cognito、あるいは自社IDPを置き換えることなく、すべてを把握できます。2つのプロダクト:Corbado Observeは passkeyとその他あらゆるログイン方式のobservabilityを提供します。Corbado Connectは analytics内蔵のmanaged passkeyを追加します(既存のIDPと併用)。VicRoadsはCorbadoで500万人超のユーザーにpasskeyを提供しています(passkey有効化率+80%)。 Passkeyエキスパートに相談する →
選択は認証アーキテクチャによって異なります。アプリがOAuth2やOIDCを使用している場合、システムWebView(iOSのASWebAuthenticationSessionやAndroidのChromeカスタムタブ)を使用すると実装の労力が最小限で済み、関連付けファイルのセットアップも不要です。新規のネイティブファーストアプリの場合、ネイティブ実装は優れたUXを提供しますが、埋め込みWebViewは、すでにWebViewフレーム内に認証を埋め込んでおり、ログイン後にセッションやCookieの制御が必要なアプリに適しています。
SFSafariViewControllerはSafariのエンジンを利用し、SSLインジケーター付きのURLバーを表示してフィッシング対策を提供するため、認証フローにおいてより信頼性が高くなります。WKWebViewはUIのカスタマイズ性に優れていますが、Safariとは別の独立したCookieストアを持ち、パスキーを有効にするにはAssociated DomainsエンタイトルメントとAASAファイルが必要です。また、URLバーを表示しないため、ユーザーからの信頼シグナルが低下します。
Chromeカスタムタブは、ユーザーのChromeブラウザとCookieおよび保存された認証情報を共有するため、認証中にGoogleパスワードマネージャーに保存されたパスキーにアクセスできます。標準のAndroid WebViewには独立したCookieストアがあり、URLやSSLインジケーターを表示しません。また、フィッシングのリスクがあるため、GoogleはGoogleアカウントのサインインにこれを使用することを明示的に禁止しています。
ユーザーが1Passwordなどのサードパーティのクレデンシャルマネージャーをアクティブなプロバイダーとして設定している場合、多くの場合、パスキーの作成と保存を傍受し、プラットフォームのネイティブなクレデンシャルマネージャー(iCloudキーチェーンまたはGoogleパスワードマネージャー)よりも優先されます。これは、パスキーがプラットフォームのキーチェーンではなくサードパーティのアプリに保存される可能性があることを意味し、デバイス間の同期とパスキーの管理動作に影響を与えます。
MDMポリシーで認証情報の同期が無効になっている場合、通常のコンシューマーシナリオとは異なり、パスキーはデバイスにバインドされ、代替デバイスにローミングできません。企業環境をターゲットとするアプリは、ユーザーが新しい管理対象デバイスを受け取った場合に対処するために、パスワードやマジックリンクのログインなどのフォールバック認証メカニズムを計画する必要があります。
関連記事
目次