このページは自動翻訳されています。英語の原文は こちら.

Passkeysチートシート. パスキープログラム向けの実践ガイド、展開パターン、KPI。
navigator.userAgentDataをサポートしていないため、開発者はMozillaのブラウザでは従来のUser-Agent文字列の解析にフォールバックする必要があります。getHighEntropyValues() JavaScript APIは、Chromiumブラウザでのみ高エントロピーなデバイスデータにアクセスできます。SafariとFirefoxにはこのAPIはまったくありません。異なるユーザー環境を検出し、それに対応する方法は常に変化しています。伝統的に、ブラウザとデバイス情報を特定する方法としてはUser-Agent文字列が使用されており、これによりWebサイトはエクスペリエンスを適切に調整できました。しかし、これらの文字列は、マーケティング目的でユーザーの同意なしにフィンガープリンティングやユーザー識別にしばしば使用され、プライバシーの懸念を引き起こしてきました。
この状況の中で、JavaScript APIとしてのClient Hintsがツールとして登場し、ユーザーのデバイスや設定に関する必要な情報を共有するための、より制御されプライバシーを尊重する方法を提供しています。この記事では、User-Agent Reductionの影響に焦点を当て、Client Hintsがこの新しい状況への適応にどのように役立つかを探ります。
この記事で取り上げる重要なポイントは以下の通りです。
ブラウザとオペレーティングシステムは異なる立場を取り、アプローチを異なる方法で適応させているため、ソフトウェア開発者は、ブラウザやオペレーティングシステム間でアプリケーションが引き続き様々なユーザー環境を正確に検出し、対応できるようにするという課題に直面しています。
この記事は、これらの変更の包括的な概要を提供し、ユースケースやソフトウェアがデバイスやオペレーティングシステムの詳細(例:詳細なデバイス管理、既知のデバイスの検出、不正行為の防止、その他の機能検出など)に依存している場合や、私たち自身のようにUser-AgentとClient Hintsでパスキーエクスペリエンスを最適化する場合に、開発者を支援する洞察と実践的なガイダンスを提供することを目指しています。
Client Hintsに関する技術的な詳細に入る前に、User-Agentの歴史と、さまざまなUser-Agent Reductionの取り組みがどのように機能するかを簡単に探ります。
User-Agent文字列の歴史は、初期のWebブラウザの誕生にまでさかのぼることができます。ティム・バーナーズ=リーは、1990年に最初のWebブラウザであるWorldWideWeb(後にNexusに改名)を開発しました。その後すぐに、1991年にはLine Mode Browserなどの先駆的なブラウザが続き、続いてMidasWWW、ViolaWWW、Erwise、Celloなどのブラウザが登場しました。
1993年のNCSA Mosaic(単にMosaicと呼ばれることが多い)のリリースは、Webの人気が最初に急上昇したきっかけとされています。MosaicのUser-Agent文字列は非常にシンプルで、一般的にNCSA_Mosaic/1.0のようにフォーマットされており、製品名に続いてオプションのスラッシュとバージョン番号が含まれていました。
当初、User-Agentフィールドは分析目的と問題の特定を支援するために導入されました。1992年のW3C HTTPアーカイブに記されているように、このフィールドはHTTPリクエストに「含めるべきである」と明示的に推奨されていました。この分かりやすいフィールドは、製品名とバージョンを伝えるシンプルかつ効果的な方法を提供し、ブラウザ関連の問題の理解とトラブルシューティングに役立ちました。
Webが進化するにつれて、User-Agent文字列の複雑さと使用方法も進化しました。それらはより詳細になり、ブラウザ、オペレーティングシステム、およびデバイスに関する豊富な情報を含めるようになりました。この情報はWeb解析とユーザーエクスペリエンスの最適化には価値がありましたが、重大なプライバシーの懸念も引き起こしました。詳細なUser-Agent文字列はデバイスのフィンガープリンティングを可能にし、広告主やトラッカーがユーザーの独自のプロファイルを作成し、さまざまなWebサイト間でオンライン活動を追跡できるようにしました。
プライバシーがユーザーや規制当局にとって同様に重要な関心事となっている現代では、User-Agent文字列の詳細な性質がますます問題視されるようになっています。この認識により、Web機能に必要な情報を提供することとユーザーのプライバシーを保護することのバランスを取ることを目的として、User-Agent文字列の粒度を下げる取り組みが行われるようになりました。 この移行は、プライバシーのリスクを軽減し、セキュリティを強化するために、User-Agent文字列で共有される情報を最小限に抑える動きであるUser-Agent Reductionの始まりを示しています。
User-Agent Reductionに向けた動きは、プライバシーへの懸念の高まりへの対応として始まりました。 この進化における重要なマイルストーンの時系列の概要は以下の通りです。
2017年、Appleはフィンガープリンティングと闘いプライバシーを向上させることを目的として、Safari Technology Preview 46(STP 46)でUser-Agent文字列を固定するという有名なTwitter投稿でUser-Agent Reductionの動きを開始しました。
しかし、この決定は、最新のUser-Agent情報に依存するWebサイトとの間で重大な互換性の問題が発生したため、2021年に部分的に撤回されました。
2019年から2020年にかけて、GoogleはChromeのUser-Agent文字列の粒度を下げる計画を発表し、特定のブラウザやデバイス情報を要求するための柔軟で制御された方法として、User-Agent Client Hints(UA-CH)を導入しました。GoogleはChrome CanaryとBetaバージョンでUser-Agent Reductionのテストを開始し、互換性と機能を確保するためのフィードバックを収集し、Androidおよび他のすべてのChromeプラットフォームで2023年に完了しました。同時に、Chromeは、その情報にアクセスする新しい方法としてClient Hintsを導入しました。Microsoft EdgeはChromiumに基づいているため、すべてのプラットフォームでChromeと同じように動作します。
2021年にMozillaはこの取り組みに参加し、User-Agent文字列の粒度を徐々に下げていきましたが、MozillaはFirefoxでClient Hintsをサポートしないことを決定しました。
User-Agent Reductionはブラウザによって異なります: Chromium(Chrome、Edge)はClient Hintsサポートとともに完全なUA削減を実装しました。しかし、SafariはUA-CHを採用せずに独自の固定UAアプローチを使用し、Firefoxはnavigator.userAgentDataを実装していません。エコシステムは依然として断片化されています。
Client HintsはChromium内で進化しました: すべてのブラウザは引き続きUser-Agentヘッダーを送信しますが、そのほとんどにおいて古いバージョンに固定されています(以下の表を参照)。Chromiumの場合、Client Hintsを使用してさらに多くの情報を取得できます。
次の章では、ブラウザが現在User-Agentとして何を送信しているかを見てみましょう。
最新ニュースを受け取るためにPasskeys Substackを購読しましょう。
User-Agent Reductionについて話すとき、それが意味するのはUser-Agent文字列内の情報を削減することです。削減前にUser-Agentに何が埋め込まれていたのかを調べるために、さらに深く掘り下げてみましょう。
従来のUser-Agent文字列には、機能の検出に使用できる以下のコンポーネントが通常含まれていました。
Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.2.1.0 Mobile Safari/537.36
歴史的に、User-Agent文字列は機能とプラットフォームの検出によく使用され、Webサイトが検出されたブラウザとデバイスの特性に基づいてコンテンツと機能を調整できるようにしていました(例:特定のバイナリに対してどのダウンロードを提供するかを決定する)。これは、レスポンシブに構築されておらず、携帯電話を特定のバージョンにリダイレクトする必要があったレイアウトにおいて、携帯電話やタブレットの台頭とともに特に重要になりました。
しかし、このアプローチは現在では最適ではないと考えられています。なぜなら、必ずしも真実ではないか、十分に具体的ではないブラウザの機能に関する仮定に依存しているからです。最新のWeb開発の実践では、特定のブラウザ機能やケーパビリティを直接チェックするために、可能な限りブラウザAPIを介した機能検出を使用することを提唱しています。この方法はより信頼性が高く、User-Agent文字列やブラウザのバージョンに関係なく、Webサイトが正しく機能することを保証します。機能検出はブラウザの実際の機能に焦点を当て、ブラウザの動作と機能の違いを処理するためのより堅牢で将来性のある方法を提供します。
機能を検出するための新しいブラウザAPIは異なる時期に実装され、大規模なブラウザチーム(Chromiumベースのブラウザなど)と小規模なブラウザチーム(Firefoxなど)の間でアプローチが異なることが多いため、今日までこれは完全には可能ではありません。
情報が増えると、Webサイトはより多くの「エントロピー」を持つフィンガープリントを作成する可能性が広がります。このコンテキストにおけるエントロピーとは、Webサイトの異なる訪問者間で一意のフィンガープリントを生成するために使用できる変動の量を指します。
フィンガープリントはさまざまな目的に使用できます。新しいデバイスを識別することで不正行為を検出し、アカウントの乗っ取りを阻止するなどの保護目的で使用できますが、同意なしに訪問者を識別したり、より具体的な広告ターゲティングに使用したりすることもできます。
User-Agent文字列のコンテキストでは、エントロピーは、個々のユーザーを追跡し区別するために使用できる、一意で識別可能な情報の量を指します。
User-Agentの下には、エントロピーの源として使用できる追加情報がたくさんあります。たとえば、https://coveryourtracks.eff.orgでさまざまなエントロピーの源を見つけることができます。
したがって、ブラウザがUser-Agent Reductionについて語るとき、彼らは主に高エントロピー情報を削減することを目標としています。削減のさまざまな例を以下に示します。
以下に、AndroidスマートフォンにおけるGoogle ChromeのUser-Agent Reductionの例を示します。
変更前:
Mozilla/5.0 (Linux; Android <span style={{color: '#016F01' }}>13; Pixel 7</span>) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.0.0 Mobile Safari/537.36
変更後:
Mozilla/5.0 (Linux; Android <span style={{color: '#016F01' }}>10; K</span>) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.0.0 Mobile Safari/537.36
User-Agentのフォーマットは、ライブラリの既存の解析ロジックに干渉しないように変更されませんでした。以下の値が削減されました。
グラフィックは、オペレーティングシステムに基づいて引き続き更新される値を示しており、緑色の値は、すべてのプラットフォームで一定のままである値を示しています。さまざまなオペレーティングシステムの値については、一定のままであるバリアントのみが利用可能になります。
| オペレーティングシステム | 削減/固定された名前 |
|---|---|
| Mac | Macintosh; Intel Mac OS X 10_15_7 |
| Windows | Windows NT 10.0; Win64; x64 |
| ChromeOS | X11; CrOS x86_64 14541.0.0 |
| Linux | X11; Linux x86_64 |
| Android | Linux; Android 10; K |
| iOS | 削減(iOS 26以降) |
以下に、GoogleのUser-Agent Reductionに関する立場のほとんどに従っているMozilla FirefoxのUser-Agent Reductionの例を示します。
以下は、現在のFirefoxバージョンを搭載したWindows 11でのUser-Agentの例です。
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0
このUser-Agentでは、CPUアーキテクチャ、オペレーティングシステムのバージョン、ブラウザのマイナーバージョンが固定されています。
以下に、macOS上のSafariのUser-Agent Reductionの例を示します。
まず、Mac Silicon M2上のmacOS Sonomaバージョン14.5のSafari User-Agentから始めましょう。
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15
macOSバージョンが10_15_07に上限が設けられ、アーキテクチャもIntelに固定され、Mac CPUアーキテクチャを報告していないことがわかります。これはmacOS上のFirefoxやChromeにも当てはまります。
iOS 26(2025年9月リリース)以前は、iOS上のSafariは実際のオペレーティングシステムバージョンを公開していました。しかし、Appleは現在、macOSと同様にSafari 26でiOS/iPadOSのUser-Agentを固定しています。以下の例は、iOS 26以前のUser-Agentを示しています。
Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1
注: iOS 26の時点で、iOS上のすべてのブラウザ(Chrome、Firefox、Safari)は、macOSと同様に固定されたUser-Agent文字列を持つようになりました。以下の例は、iOS 26以前の動作を示しています。
Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/126.0.6478.153 Mobile/15E148 Safari/604.1
Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/127.1 Mobile/15E148 Safari/605.1.15
全体として、User-Agentが特に高エントロピー情報において削減されていることは明らかです。次の概要は、どのプラットフォーム/オペレーティングシステムの組み合わせでUser-Agentが削減されるかを示しています。
| ブラウザ | Windows | MacOS | iOS | Android |
|---|---|---|---|---|
| Chrome | 削減 | 削減 | 削減(iOS 26以降) | 削減 |
| Edge | 削減 | 削減 | 削減(iOS 26以降) | 削減 |
| Firefox | 削減 | 削減 | 削減(iOS 26以降) | 削減 |
| Safari | - | 削減* | 削減(Safari 26以降)** | - |
| Samsung Internet | - | - | - | 削減 |
| WebViews | - | - | 削減(iOS 26以降) | 削減なし(16以降は削減) |
したがって、削減されたUser-Agentの最も重要な検出の問題は以下の通りです(* = macOSバージョンについては以下の備考を参照)。
macOSバージョンと対応するSafariバージョンのマッピング表を以下に示します。
| macOSバージョン | Safariバージョン | リリース年 |
|---|---|---|
| macOS Sequoia (15) | Safari 18 | 2024 |
| macOS Sonoma (14) | Safari 17 | 2023 |
| macOS Ventura (13) | Safari 16 | 2022 |
| macOS Monterey (12) | Safari 15 | 2021 |
| macOS Big Sur (11) | Safari 14 | 2020 |
| macOS Catalina (10.15) | Safari 13 | 2019 |
TLSフィンガープリンティングのような、より高度なフィンガープリンティング手法に基づいてオペレーティングシステムやブラウザを検出する他の方法があります。より深いオペレーティングシステムの検出が意味を成す正当なシナリオがあるため、Googleはこの情報をプログラムで受け取ることができるようにClient Hintsを導入しました。次の章でClient Hintsの仕組みを見ていきます。
Client Hintsを使用すると、Webサイトはプライバシーに配慮した方法で、User-Agent文字列から削除された高エントロピー情報にアクセスできます。Client Hintsにアクセスするには、主に2つの方法があります。
Client Hintsを使用して、User-Agentにすでに含まれている低エントロピー情報を取得することもできます。これは、Client HintsがサポートされているChromeでは、User-Agentがもはや必要ないことを意味します。
使用するアクセス方法によって、Client Hintsの名前はわずかに異なります。 最も重要なClient Hintsの名前をリストアップしました。
| HTTP UA-CH トークン | UA-CH JS API | エントロピー |
|---|---|---|
| Sec-CH-UA-Platform-Version | UADataValues.platformVersion | 高 |
| Sec-CH-UA-Mobile | NavigatorUAData.mobile | 低 |
| Sec-CH-UA-Model | UADataValues.model | 高 |
| Sec-CH-UA | NavigatorUAData.brands | 低 |
| Sec-CH-UA-Arch | UADataValues.architecture | 高 |
ファーストパーティコンテキストでは、WebサイトはHTTPリクエストヘッダーを使用して、ユーザーのブラウザとデバイスに関する特定の情報を要求できます。このアプローチでは、サーバーのHTTPレスポンスに正しいヘッダーを設定し、サーバーがどのClient Hintsに関心があるかを示します。ブラウザは、同じオリジンへの後続のリクエストにこれらのヒントを含めます。
このヘッダーは、ブラウザに将来のリクエストで詳細なユーザー情報を送信するように指示し、サーバーがそれに応じてレスポンスを調整できるようにします。この方法により、詳細なユーザー情報はファーストパーティのWebサイトのみがアクセスできるようになり、サードパーティのリソースが高エントロピーのデータを取得するのを防ぎます。利用可能なリクエストヘッダーには2種類あり、これらについて説明します。
通常のClient Hintsは、サーバーがブラウザに要求してユーザー環境に関する情報を収集できるヘッダーであり、後続のリクエストで送信されます。
例: corbado.comで通常のClient Hintsを使用するmacOS 14.5のChrome
| ヘッダー | 値 |
|---|---|
| Sec-Ch-Ua | "Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24" |
| Sec-Ch-Ua-Mobile | ?0 |
| Sec-Ch-Ua-Platform | "macOS" |
| ヘッダー | 値 |
|---|---|
| Accept-CH | Sec-CH-UA-Platform-Version |
| ヘッダー | 値 |
|---|---|
| Sec-Ch-Ua | "Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24" |
| Sec-Ch-Ua-Mobile | ?0 |
| Sec-Ch-Ua-Platform | "macOS" |
| Sec-Ch-Ua-Platform | "14.5.0" |
同時に、このリクエストのUser-Agentは(プラットフォームバージョンなしで)同じままです。
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36
https://user-agent-client-hints.glitch.me/headersを使用すると、通常のヒントで情報のさまざまなレイアウトがどのように見えるかを実際に試すことができます(Chromeを使用する必要があることに留意してください)。詳細についてはこちらを参照してください。corbado.comが最初のページリクエストでこの情報を必要とする場合、通常のClient Hintsを使用するだけでは不十分ですが、Critical (Client) Hintsを使用してこのプロセスを迅速化する方法があります。
corbado.comが正確なmacOSバージョンに合わせて調整された適切なダウンロードページをレンダリングするために、最初のリクエストでプラットフォームバージョンを必要としているとします。ヘッダーを含めてページをレンダリングするためだけにリクエストの即時再試行を促すCritical (Client) Hintsを使用できます。
例: corbado.comでCritical Client Hintsを使用するmacOS 14.5のChrome
| ヘッダー | 値 |
|---|---|
| Sec-CH-UA | "Google Chrome";v="125", "Chromium";v="125", "Not_A/Brand";v="24" |
| Sec-CH-UA-Mobile | ?0 |
| Sec-CH-UA-Platform | "macOS" |
| ヘッダー | 値 |
|---|---|
| Accept-CH | Sec-CH-UA-Platform-Version |
| ヘッダー | 値 |
|---|---|
| Sec-CH-UA | "Google Chrome";v="125", "Chromium";v="125", "Not_A/Brand";v="24" |
| Sec-CH-UA-Mobile | ?0 |
| Sec-CH-UA-Platform | "macOS" |
| Sec-CH-UA-Platform-Version | "14.5.0" |
以下のチャートでは、WebサイトがCritical-CHヘッダーでデバイスモデルを重要な部分として要求する別の例を示します。ご覧のとおり、クライアントは上の例(左側のシーケンス図)のようにリクエストを再試行します。
ChromiumでのClient Hints: https://developers.google.com/privacy-sandbox/protections/User-Agent
したがって、ブラウザは直ちに2回目のリクエストを開始してラウンドトリップを追加する必要があるため、Critical Client Hintsを使用すると遅延が増加します。TLSハンドシェイクを促進して(チャート上部の緑色のボックス)すでに詳細を送信することで、転送を最適化する方法があります。**ALPN(Application-Layer Protocol Negotiation)**を活用するこのアプローチはこちらで詳しく説明されていますが、この記事の目的を超えています。
ヘッダーを使用して追加情報を受け取るには、バックエンドまたはWebサーバー/ロードバランサーに構成を追加する必要があります。これは、企業としてWebサイトを完全に制御できるファーストパーティのコンテキストで簡単に実行できます。たとえば、corbado.comのUIコンポーネントでは、パスキーインテリジェンスの精度を高めるためにプラットフォームバージョンが必要です。開発者はさまざまなページにコンポーネントを統合しており、ヘッダーを追加してその情報をコンポーネントに渡すことを要求するのは、好ましくないオーバーヘッドになります。SPAやその他の埋め込みJavaScriptアプリケーションの場合、使用できる別のインターフェースがあります。これについては次のセクションで説明します。
navigator.userAgentData.getHighEntropyValues()関数を使用すると、JavaScript APIを介してClient Hintsにアクセスすることもでき、ユーザーのブラウザやデバイスに関する特定の情報を柔軟かつ動的に要求する方法が提供されます。この方法では、Webページのスクリプト内でnavigator.userAgentDataオブジェクトを使用してClient Hintsを照会します。この方法ではClient Hintヘッダーを設定する必要はありませんが、navigator.userAgentDataをサポートしているブラウザ(ChromeやEdgeなどのChromiumベースのブラウザ)でのみ機能します。FirefoxとSafariはこのAPIをサポートしていないため、開発者は機能を検出し、フォールバックを提供する必要があります。
たとえば、macOS上のChromeコンソールでこのコードを実行すると次のようになります。
if (navigator.userAgentData) { navigator.userAgentData .getHighEntropyValues(["architecture", "model", "platformVersion"]) .then((ua) => { console.log(ua); }); }
Promiseが解決されると、関連情報が返されます。上で概説したように、名前はヘッダーと完全に同一ではありませんが、非常に似ています。
その後、platformVersionはPromiseで返され、埋め込みJavaScriptコードから直接アクセスできます。この関数のカバレッジは、実際のUser-Agent Reductionよりもはるかに低くなっています。
さらに、ChromeはAppleの制限によりiOSにWebKitを展開しているため、iOSではこの機能を提供していません。
ここまで、User-Agent Reductionに関する最も重要な事実と、Client HintsがChromeでそれを回避する方法をまとめてきました。
ユースケースに応じて、アプリケーションが可能な限り最高の結果を得られるように、異なるアプローチを使用する必要があります。
navigator.userAgentData.getHighEntropyValues()関数を使用して、この関数が定義されている場合は常にユーザーのブラウザとデバイスに関する特定の情報を動的に要求し、その他の場合はUser-Agent解析ライブラリにフォールバックすることです。以下の表は、User-Agent(UA)とClient Hints(CH)にアクセスできる場合に、オペレーティングシステムのバージョンをまだ検出できる場所をまとめたものです。
| ブラウザ | Windows | MacOS | iOS | Android |
|---|---|---|---|---|
| Chrome | ✅ CH | ✅ CH | ❌(iOS 26以降) | ✅ CH |
| Edge | ✅ CH | ✅ CH | ❌(iOS 26以降) | ✅ CH |
| Firefox | ❌ | ❌ | ❌(iOS 26以降) | ❌ |
| Safari | - | ✅ UA-Safari | ❌(Safari 26以降) | - |
| Samsung Internet | - | - | - | ✅ CH |
| WebViews | - | - | ❌(iOS 26以降) | ✅ UA(16以降: ❌) |
特定のニーズに基づいて適切な方法を選択することで、詳細なユーザー情報の必要性と、プライバシーおよびパフォーマンスの考慮事項を効果的にバランスさせることができます。抽出が困難な情報や、本当にデバイスに基づいた情報に大きく依存している場合は、wurflや51degrees.comなどのプロフェッショナルなライブラリにフォールバックしてください。これらは重労働を代行してくれます。どちらのライブラリもクライアントリンクの検出への統合をサポートしており、iPhoneモデルを検出する独自の方法も備えています。
Corbadoでは、主にReactで開発されたUIコンポーネントを使用して、パスキーに関するソリューションの開発に注力しています。当社のコンポーネントはさまざまなWebサイトに埋め込まれているため、当社独自の推奨事項に従い、利用可能な場所ではgetHighEntropyValues()を使用し、他のすべてのケースでは従来のUser-Agentの解析にフォールバックしています。主に以下の目的で使用します。
詳細はこちら: https://learn.microsoft.com/en-us/microsoft-edge/web-platform/how-to-detect-win11
コンポーネントの情報を収集し始めたとき、User-Agent Reductionの開始時またはそれ以前に作成された、断片化されたデータが多数見つかりました。そのため、検出を改善したいが、User-AgentやClient Hintsを定期的に使用していない開発者には要約が役立つと考えました。
数十年にわたりUser-Agentベースの検出が標準であった後、User-Agent文字列はユーザーのプライバシーを保護するために詳細な情報を少なくするようになりました。 この記事では以下について取り上げました。
Client Hintsは進化を続けており、より多くのブラウザや開発者がその利点を認識するにつれて、その採用は増加する可能性があります。ただし、そのサポートが広く普及するか、それともWebがこのトピックで分岐し続けるかはまだわかりません。
Corbadoは、大規模なconsumer認証を運用するCIAMチームのためのAuthentication 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エキスパートに相談する →
Appleは2025年9月にリリースされたSafari 26でiOS/iPadOSのUser-Agent文字列を固定しました。つまり、iOS上で動作するどのブラウザでも、User-Agentを介してOSバージョンが公開されることはなくなりました。AndroidやデスクトップのChromeとは異なり、iOSブラウザではClient Hints APIを利用できないため、プログラムから実際のiOSバージョンを取得することはできなくなりました。
Accept-CHレスポンスヘッダーを介してリクエストされる通常のClient Hintsは、後続のリクエストにのみ含まれ、初回のページ読み込み時には利用できません。一方、Critical Client Hintsはレンダリング前にブラウザの即時再試行をトリガーし、初回レンダリング時にヒントが利用可能であることを保証しますが、リクエストサイクルにラウンドトリップの遅延が追加されます。
Appleは2017年のSafari Technology Preview 46でUser-Agentの固定を発表しましたが、最新のUser-Agent情報に依存するWebサイトとの間で重大な互換性の問題が発生したため、2021年にその決定を部分的に撤回しました。その後、Appleは完全な即時固定ではなく、より段階的なUser-Agent固定のアプローチを実装しました。
SafariはClient Hintsをサポートしていませんが、macOSのバージョンはUser-Agent文字列のSafariバージョン番号から推測できます。Safariのメジャーバージョンから3を引くことで、macOS 10.15以降のmacOSメジャーバージョンに確実にマッピングできます。これは、SafariとmacOSのバージョンのリリース時期が一貫していることに基づいています。
推奨されるアプローチは、Chromiumベースのブラウザを対象として、機能が定義されている場合にはnavigator.userAgentData.getHighEntropyValues()を呼び出し、FirefoxやSafariではUser-Agent文字列の解析ライブラリにフォールバックすることです。非常に具体的なデバイスモデルの識別が必要なケースでは、wurflや51degreesなどの専門的なライブラリを使用することで、User-Agent文字列が公開するもの以上の検出機能を利用できます。
関連記事
目次