Get your free and exclusive +45-page Authentication Analytics Whitepaper
概要に戻る

Chrome、Safari、FirefoxにおけるClient HintsとUser-Agent

Chrome、Safari、FirefoxにおけるUser-AgentとClient Hints APIのサポート状況と、JavaScriptコンポーネントでのパスキーおよびデバイス検出における活用方法について解説します。

Vincent Delitz
Vincent Delitz

作成日: 2024年7月2日

更新日: 2026年7月27日

Chrome、Safari、FirefoxにおけるClient HintsとUser-Agent

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

PasskeysCheatsheet Icon

Passkeysチートシート. パスキープログラム向けの実践ガイド、展開パターン、KPI。

チートシートを入手
重要なポイント
  • **User-Agent Reduction(ユーザーエージェント情報の削減)**は、主要ブラウザ全体で完了しています。ChromeとEdgeでは2023年以降、Firefoxでは部分的に、Safariでは2025年9月にリリースされたiOS 26以降で固定されています。
  • FirefoxはClient Hintsnavigator.userAgentDataをサポートしていないため、開発者はMozillaのブラウザでは従来のUser-Agent文字列の解析にフォールバックする必要があります。
  • getHighEntropyValues() JavaScript APIは、Chromiumブラウザでのみ高エントロピーなデバイスデータにアクセスできます。SafariとFirefoxにはこのAPIはまったくありません。
  • Windows 10とWindows 11をUser-Agent文字列だけで区別することは不可能です。ChromeとEdgeのClient Hintsのみが、実際のプラットフォームバージョンを明らかにできます。
  • CorbadoはパスキーインテリジェンスにClient Hintsを使用しています。新しいデバイスを検出し、クロスデバイス認証の適格性を評価します。特にWindowsバージョンの区別に役立てています。

1. はじめに: Client HintsとUser-Agent Reductionとは何か?#

異なるユーザー環境を検出し、それに対応する方法は常に変化しています。伝統的に、ブラウザとデバイス情報を特定する方法としてはUser-Agent文字列が使用されており、これによりWebサイトはエクスペリエンスを適切に調整できました。しかし、これらの文字列は、マーケティング目的でユーザーの同意なしにフィンガープリンティングやユーザー識別にしばしば使用され、プライバシーの懸念を引き起こしてきました。

この状況の中で、JavaScript APIとしてのClient Hintsがツールとして登場し、ユーザーのデバイスや設定に関する必要な情報を共有するための、より制御されプライバシーを尊重する方法を提供しています。この記事では、User-Agent Reductionの影響に焦点を当て、Client Hintsがこの新しい状況への適応にどのように役立つかを探ります。

この記事で取り上げる重要なポイントは以下の通りです。

  • User-Agent Reductionとは何か: 削減されたUser-Agent文字列への移行とその意味を理解します。
  • Client Hintsの仕組み: Client Hintsの背後にあるメカニズムと、それらを効果的に実装する方法を探ります。

ブラウザとオペレーティングシステムは異なる立場を取り、アプローチを異なる方法で適応させているため、ソフトウェア開発者は、ブラウザやオペレーティングシステム間でアプリケーションが引き続き様々なユーザー環境を正確に検出し、対応できるようにするという課題に直面しています。

この記事は、これらの変更の包括的な概要を提供し、ユースケースやソフトウェアがデバイスやオペレーティングシステムの詳細(例:詳細なデバイス管理、既知のデバイスの検出、不正行為の防止、その他の機能検出など)に依存している場合や、私たち自身のようにUser-AgentとClient Hintsでパスキーエクスペリエンスを最適化する場合に、開発者を支援する洞察と実践的なガイダンスを提供することを目指しています。

Client Hintsに関する技術的な詳細に入る前に、User-Agentの歴史と、さまざまなUser-Agent Reductionの取り組みがどのように機能するかを簡単に探ります。

1.1 User-Agentの簡単な歴史#

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の始まりを示しています。

1.2 User-Agent ReductionとClient Hintsの紹介#

User-Agent Reductionに向けた動きは、プライバシーへの懸念の高まりへの対応として始まりました。 この進化における重要なマイルストーンの時系列の概要は以下の通りです。

1.2.1 SafariのUser-Agent#

2017年、Appleはフィンガープリンティングと闘いプライバシーを向上させることを目的として、Safari Technology Preview 46(STP 46)でUser-Agent文字列を固定するという有名なTwitter投稿でUser-Agent Reductionの動きを開始しました。

しかし、この決定は、最新のUser-Agent情報に依存するWebサイトとの間で重大な互換性の問題が発生したため、2021年に部分的に撤回されました。

1.2.2 Chrome(とEdge)のUser-Agent#

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と同じように動作します。

1.2.3 FirefoxのUser-Agent#

2021年にMozillaはこの取り組みに参加し、User-Agent文字列の粒度を徐々に下げていきましたが、MozillaはFirefoxでClient Hintsをサポートしないことを決定しました。

1.2.4 今日のUser-Agent(2025年9月更新)#

  • 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として何を送信しているかを見てみましょう。

Substack Icon

最新ニュースを受け取るためにPasskeys Substackを購読しましょう。

購読する

2. User-Agent Reductionとは何か?#

User-Agent Reductionについて話すとき、それが意味するのはUser-Agent文字列内の情報を削減することです。削減前にUser-Agentに何が埋め込まれていたのかを調べるために、さらに深く掘り下げてみましょう。

2.1 従来の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

  • オペレーティングシステム: オペレーティングシステムの名前(例:Windows、macOS、Linux)。
  • オペレーティングシステムのバージョン番号: オペレーティングシステムの特定のバージョン。
  • ブラウザ名: ブラウザの名前(例:Chrome、Firefox、Safari)。
  • ブラウザのバージョン: ブラウザの特定のバージョン。
  • アーキテクチャ: システムのアーキテクチャ(例:x86、ARM)。
  • デバイスタイプ/モデル: デバイスのタイプまたはモデルに関する情報(例:iPhone、Pixel)。
  • その他の情報: プラットフォーム、ビルド番号などの追加の詳細が含まれる場合があります。

2.1.1 なぜ機能検出にUser-Agentを使用するのか?#

歴史的に、User-Agent文字列は機能とプラットフォームの検出によく使用され、Webサイトが検出されたブラウザとデバイスの特性に基づいてコンテンツと機能を調整できるようにしていました(例:特定のバイナリに対してどのダウンロードを提供するかを決定する)。これは、レスポンシブに構築されておらず、携帯電話を特定のバージョンにリダイレクトする必要があったレイアウトにおいて、携帯電話やタブレットの台頭とともに特に重要になりました。

しかし、このアプローチは現在では最適ではないと考えられています。なぜなら、必ずしも真実ではないか、十分に具体的ではないブラウザの機能に関する仮定に依存しているからです。最新のWeb開発の実践では、特定のブラウザ機能やケーパビリティを直接チェックするために、可能な限りブラウザAPIを介した機能検出を使用することを提唱しています。この方法はより信頼性が高く、User-Agent文字列やブラウザのバージョンに関係なく、Webサイトが正しく機能することを保証します。機能検出はブラウザの実際の機能に焦点を当て、ブラウザの動作と機能の違いを処理するためのより堅牢で将来性のある方法を提供します。

機能を検出するための新しいブラウザAPIは異なる時期に実装され、大規模なブラウザチーム(Chromiumベースのブラウザなど)と小規模なブラウザチーム(Firefoxなど)の間でアプローチが異なることが多いため、今日までこれは完全には可能ではありません。

2.1.2 フィンガープリンティングにおけるエントロピーの理解: なぜ多くの情報を提供することが問題なのか?#

情報が増えると、Webサイトはより多くの「エントロピー」を持つフィンガープリントを作成する可能性が広がります。このコンテキストにおけるエントロピーとは、Webサイトの異なる訪問者間で一意のフィンガープリントを生成するために使用できる変動の量を指します。

フィンガープリントはさまざまな目的に使用できます。新しいデバイスを識別することで不正行為を検出し、アカウントの乗っ取りを阻止するなどの保護目的で使用できますが、同意なしに訪問者を識別したり、より具体的な広告ターゲティングに使用したりすることもできます。

User-Agent文字列のコンテキストでは、エントロピーは、個々のユーザーを追跡し区別するために使用できる、一意で識別可能な情報の量を指します。

  • 高エントロピー情報: 特定のブラウザやOSのバージョンなどは、ユーザーのフィンガープリントの独自性に大きく寄与し、さまざまなWebサイトでユーザーを追跡しやすくします。
  • 低エントロピー情報: 一般的なブラウザ名やオペレーティングシステム名は、詳細なデータを提供せず、より多くのユーザーがそれらの組み合わせを持っているため、ユーザー追跡への寄与は少なくなります。

User-Agentの下には、エントロピーの源として使用できる追加情報がたくさんあります。たとえば、https://coveryourtracks.eff.orgでさまざまなエントロピーの源を見つけることができます。

2.2 User-Agentエントロピーの削減#

したがって、ブラウザがUser-Agent Reductionについて語るとき、彼らは主に高エントロピー情報を削減することを目標としています。削減のさまざまな例を以下に示します。

2.2.1 例1: Chromeの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のフォーマットは、ライブラリの既存の解析ロジックに干渉しないように変更されませんでした。以下の値が削減されました。

  • オペレーティングシステムのバージョン
  • ブラウザのマイナーバージョン
  • ハードウェアモデル

グラフィックは、オペレーティングシステムに基づいて引き続き更新される値を示しており、緑色の値は、すべてのプラットフォームで一定のままである値を示しています。さまざまなオペレーティングシステムの値については、一定のままであるバリアントのみが利用可能になります。

オペレーティングシステム削減/固定された名前
MacMacintosh; Intel Mac OS X 10_15_7
WindowsWindows NT 10.0; Win64; x64
ChromeOSX11; CrOS x86_64 14541.0.0
LinuxX11; Linux x86_64
AndroidLinux; Android 10; K
iOS削減(iOS 26以降)

2.2.2 例2: FirefoxのUser-Agent Reduction#

以下に、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アーキテクチャ、オペレーティングシステムのバージョン、ブラウザのマイナーバージョンが固定されています。

2.2.3 例3: macOS上のSafariのUser-Agent Reduction#

以下に、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にも当てはまります。

2.2.4 例4: iOS上のSafariのUser-Agent(現在はiOS 26以降で削減)#

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

2.3 User-Agent Reductionによる検出の制限#

全体として、User-Agentが特に高エントロピー情報において削減されていることは明らかです。次の概要は、どのプラットフォーム/オペレーティングシステムの組み合わせでUser-Agentが削減されるかを示しています。

ブラウザWindowsMacOSiOSAndroid
Chrome削減削減削減(iOS 26以降)削減
Edge削減削減削減(iOS 26以降)削減
Firefox削減削減削減(iOS 26以降)削減
Safari-削減*削減(Safari 26以降)**-
Samsung Internet---削減
WebViews--削減(iOS 26以降)削減なし(16以降は削減)

したがって、削減されたUser-Agentの最も重要な検出の問題は以下の通りです(* = macOSバージョンについては以下の備考を参照)。

  • Windows 10とWindows 11を区別できない: User-Agentだけでは、Windows 10とWindows 11システムを区別できなくなりました。
  • Androidデバイスとオペレーティングシステムバージョンを区別できない: Appleとは対照的に、Androidは以前、実際のハードウェアモデルをUser-Agentに含めていました。これはもう当てはまりません。したがって、さまざまなハードウェアモデルをUser-Agentのみで区別することはできなくなりました。Appleでは、これは最初から不可能でした。
  • macOSのバージョンとアーキテクチャを区別できない: User-Agentに基づいてmacOSのバージョンとプラットフォームのアーキテクチャを区別する方法はありません。
  • (*)SafariでのmacOSバージョン: Safariはオペレーティングシステムのバージョンを固定しましたが、引き続きSafariのバージョンを表示します。執筆時点では、10.15以降の場合、Safariのバージョンから3を引いてメジャーなMacOSのバージョンを検出するのが安全です。
  • )Safari 26以降のiOSバージョン:** iOS 26(2025年9月)の時点で、AppleはmacOSと同様にiOS/iPadOSのUser-Agentを固定しました。OSバージョンは公開されなくなりました。

macOSバージョンと対応するSafariバージョンのマッピング表を以下に示します。

macOSバージョンSafariバージョンリリース年
macOS Sequoia (15)Safari 182024
macOS Sonoma (14)Safari 172023
macOS Ventura (13)Safari 162022
macOS Monterey (12)Safari 152021
macOS Big Sur (11)Safari 142020
macOS Catalina (10.15)Safari 132019

TLSフィンガープリンティングのような、より高度なフィンガープリンティング手法に基づいてオペレーティングシステムやブラウザを検出する他の方法があります。より深いオペレーティングシステムの検出が意味を成す正当なシナリオがあるため、Googleはこの情報をプログラムで受け取ることができるようにClient Hintsを導入しました。次の章でClient Hintsの仕組みを見ていきます。

3. Client Hintsはどのように機能するか?#

Client Hintsを使用すると、Webサイトはプライバシーに配慮した方法で、User-Agent文字列から削除された高エントロピー情報にアクセスできます。Client Hintsにアクセスするには、主に2つの方法があります。

  • HTTPヘッダー: HTTPリクエストヘッダーを使用するもので、ファーストパーティコンテキストでのみ利用可能です。
  • JavaScript API: 埋め込みスクリプトで使用できるJavaScript APIを使用します。

Client Hintsを使用して、User-Agentにすでに含まれている低エントロピー情報を取得することもできます。これは、Client HintsがサポートされているChromeでは、User-Agentがもはや必要ないことを意味します。

3.1 どのClient Hintsが存在するか?#

使用するアクセス方法によって、Client Hintsの名前はわずかに異なります。 最も重要なClient Hintsの名前をリストアップしました。

HTTP UA-CH トークンUA-CH JS APIエントロピー
Sec-CH-UA-Platform-VersionUADataValues.platformVersion
Sec-CH-UA-MobileNavigatorUAData.mobile
Sec-CH-UA-ModelUADataValues.model
Sec-CH-UANavigatorUAData.brands
Sec-CH-UA-ArchUADataValues.architecture

3.2 HTTPリクエストヘッダーを介してClient Hintsにアクセスする方法#

ファーストパーティコンテキストでは、WebサイトはHTTPリクエストヘッダーを使用して、ユーザーのブラウザとデバイスに関する特定の情報を要求できます。このアプローチでは、サーバーのHTTPレスポンスに正しいヘッダーを設定し、サーバーがどのClient Hintsに関心があるかを示します。ブラウザは、同じオリジンへの後続のリクエストにこれらのヒントを含めます。

このヘッダーは、ブラウザに将来のリクエストで詳細なユーザー情報を送信するように指示し、サーバーがそれに応じてレスポンスを調整できるようにします。この方法により、詳細なユーザー情報はファーストパーティのWebサイトのみがアクセスできるようになり、サードパーティのリソースが高エントロピーのデータを取得するのを防ぎます。利用可能なリクエストヘッダーには2種類あり、これらについて説明します。

  • 通常のClient Hintヘッダー
  • Critical (Client) Hintヘッダー

3.2.1 通常のClient Hintヘッダーの使用方法#

通常のClient Hintsは、サーバーがブラウザに要求してユーザー環境に関する情報を収集できるヘッダーであり、後続のリクエストで送信されます。

例: corbado.comで通常のClient Hintsを使用するmacOS 14.5のChrome

  1. Corbado.comへの最初のリクエストで、Chromeは以下の低エントロピーヘッダーをすでに含めます。この情報はUser-Agentにも含まれているためです。
ヘッダー
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"
  1. Corbado.comが後続のリクエストでオペレーティングシステムのバージョン(プラットフォームのバージョン)を受け取りたいとします。したがって、最初のリクエストに対するレスポンスに適切な「Sec-CH-UA-Platform-Version」ヘッダーを設定します。
ヘッダー
Accept-CHSec-CH-UA-Platform-Version
  1. 後続のリクエストで、Corbado.comはプラットフォームバージョンを含む追加のヘッダーを1つ受け取ります。
ヘッダー
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を使用してこのプロセスを迅速化する方法があります。

3.2.2 Critical (Client) Hintヘッダーの使用方法#

corbado.comが正確なmacOSバージョンに合わせて調整された適切なダウンロードページをレンダリングするために、最初のリクエストでプラットフォームバージョンを必要としているとします。ヘッダーを含めてページをレンダリングするためだけにリクエストの即時再試行を促すCritical (Client) Hintsを使用できます。

例: corbado.comでCritical Client Hintsを使用するmacOS 14.5のChrome

  1. corbado.comへの最初のリクエストで、Chromeは以下の低エントロピーヘッダーをすでに含めます。この情報はUser-Agentにも含まれているためです。
ヘッダー
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"
  1. corbado.comがページの初回レンダリング時にオペレーティングシステムのバージョン(プラットフォームバージョン)を受け取りたいとします。次に、最初のリクエストに対するレスポンスにCritical Client Hintヘッダー「Sec-CH-UA-Platform-Version」を設定します。
ヘッダー
Accept-CHSec-CH-UA-Platform-Version
  1. Chromeはレンダリングを開始せず、すぐにリクエストを再試行し、corbado.comの初回レンダリング時にヘッダーが利用できるようにします。次に、プラットフォームバージョンを含む追加のヘッダーを受け取ります。
ヘッダー
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アプリケーションの場合、使用できる別のインターフェースがあります。これについては次のセクションで説明します。

3.3 JavaScript API(埋め込みスクリプト)を介してClient Hintsにアクセスする方法#

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でそれを回避する方法をまとめてきました。

4. 今日のUser-Agentへのアプローチの推奨事項#

ユースケースに応じて、アプリケーションが可能な限り最高の結果を得られるように、異なるアプローチを使用する必要があります。

  • 機能検出: 可能な限り既存のブラウザJavaScript APIを使用する。実現可能な場合は常に、User-Agentを使用するのではなく、ブラウザAPIを利用して機能を直接検出します。これはより信頼性が高く、将来を見据えた対応となります。
  • デバイスタイプなどの低エントロピーなヒントの場合: User-Agentで十分です。アプリケーションがデバイスタイプやその他の低エントロピーの詳細のみを決定する必要がある場合は、User-Agent文字列で十分詳細です。これらの目的に既存のAPIを使用することもできます。
  • 高エントロピー情報とドメインの制御について: ヘッダーアプローチを使用する。詳細な情報が必要で、ドメインを制御できる場合は、サポートされている(Chrome、Edge)高エントロピー情報を要求するためにHTTPヘッダーアプローチを利用します。(Client Hintヘッダーを送信しない)他のすべてのブラウザでは、従来のUser-Agentを使用します。情報がすぐに必要か、わずかな遅延が許容されるかに基づいて、Critical Client Hintsを使用するかどうかを決定します。
  • JavaScriptライブラリの場合: getHighEntropyValuesを使用する。JavaScriptライブラリを開発している場合、最良のオプションは、navigator.userAgentData.getHighEntropyValues()関数を使用して、この関数が定義されている場合は常にユーザーのブラウザとデバイスに関する特定の情報を動的に要求し、その他の場合はUser-Agent解析ライブラリにフォールバックすることです。

以下の表は、User-Agent(UA)とClient Hints(CH)にアクセスできる場合に、オペレーティングシステムのバージョンをまだ検出できる場所をまとめたものです。

ブラウザWindowsMacOSiOSAndroid
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以降: ❌)

特定のニーズに基づいて適切な方法を選択することで、詳細なユーザー情報の必要性と、プライバシーおよびパフォーマンスの考慮事項を効果的にバランスさせることができます。抽出が困難な情報や、本当にデバイスに基づいた情報に大きく依存している場合は、wurfl51degrees.comなどのプロフェッショナルなライブラリにフォールバックしてください。これらは重労働を代行してくれます。どちらのライブラリもクライアントリンクの検出への統合をサポートしており、iPhoneモデルを検出する独自の方法も備えています。

5. パスキーにUser-AgentとClient Hintsを使用する方法#

Corbadoでは、主にReactで開発されたUIコンポーネントを使用して、パスキーに関するソリューションの開発に注力しています。当社のコンポーネントはさまざまなWebサイトに埋め込まれているため、当社独自の推奨事項に従い、利用可能な場所ではgetHighEntropyValues()を使用し、他のすべてのケースでは従来のUser-Agentの解析にフォールバックしています。主に以下の目的で使用します。

  • パスキー管理: パスキー管理サイトでは、パスキーが作成されたデバイスに関する利用可能なすべての情報を表示します。
  • クロスデバイス認証: クロスデバイス認証では、オペレーティングシステムに関する情報を使用して、クライアントがCDAを活用できる可能性がどの程度あるかを判断します。これは、Windows 10と11を区別する場合に特に重要です。これはChromeとEdgeのClient Hintsでのみ可能です。

詳細はこちら: https://learn.microsoft.com/en-us/microsoft-edge/web-platform/how-to-detect-win11

  • パスキーインテリジェンス: 当社は、パスキーログインを開始するかどうかはプラットフォームが決定すべきだと考えています。したがって、新しいデバイスが使用されているかどうかを検出するために、可能な限り多くのロジックをコンポーネントに統合しています。このようなシナリオでは、新しい、またはより小さいオペレーティングシステムのバージョンは、状況が変化した可能性があるという貴重なヒントになります。

コンポーネントの情報を収集し始めたとき、User-Agent Reductionの開始時またはそれ以前に作成された、断片化されたデータが多数見つかりました。そのため、検出を改善したいが、User-AgentやClient Hintsを定期的に使用していない開発者には要約が役立つと考えました。

6. 結論#

数十年にわたりUser-Agentベースの検出が標準であった後、User-Agent文字列はユーザーのプライバシーを保護するために詳細な情報を少なくするようになりました。 この記事では以下について取り上げました。

  • User-Agent Reductionとは何か? User-Agent Reductionは、ユーザーのプライバシーを保護するために、User-Agent文字列を通じて共有される情報の量を最小限に抑えるプロセスです。この移行により、以前はさまざまなWebサイトでユーザーのフィンガープリンティングや追跡に使用されていた、オペレーティングシステムのバージョンやハードウェアモデルなどのデータの粒度が低下します。この削減が開発者にどのような影響を与えるか、そしてこれらの変更にどのように適応できるかを探りました。
  • Client Hintsはどのように機能するか? Client Hintsは、よりプライバシーに配慮した方法で、ユーザーのデバイスに関する特定の高エントロピー情報を要求するメカニズムを提供します。HTTPヘッダーとJavaScript APIを使用することで、開発者は必要に応じてユーザーの環境に関する詳細データにアクセスできます。Client Hintsがどのように実装されているか、利用可能なヒントの種類、HTTPリクエストヘッダーとJavaScriptを介してそれらにアクセスする方法について説明しました。

Client Hintsは進化を続けており、より多くのブラウザや開発者がその利点を認識するにつれて、その採用は増加する可能性があります。ただし、そのサポートが広く普及するか、それともWebがこのトピックで分岐し続けるかはまだわかりません。

Corbado

Corbadoについて

Corbadoは、大規模なconsumer認証を運用するCIAMチームのためのAuthentication Intelligence Platformです。IDPのログや一般的なanalyticsツールでは見えないものを可視化します。どのデバイス、OSバージョン、ブラウザ、credential managerがpasskeyに対応しているか、なぜ登録がログインにつながらないのか、WebAuthnフローのどこで失敗するか、OSやブラウザのアップデートがいつ静かにログインを壊すか — Okta、Auth0、Ping、Cognito、あるいは自社IDPを置き換えることなく、すべてを把握できます。2つのプロダクト:Corbado Observepasskeyとその他あらゆるログイン方式のobservabilityを提供します。Corbado Connectanalytics内蔵のmanaged passkeyを追加します(既存のIDPと併用)。VicRoadsはCorbadoで500万人超のユーザーにpasskeyを提供しています(passkey有効化率+80%)。 Passkeyエキスパートに相談する

よくある質問#

iOS 26以降、Webアプリで実際のiOSバージョンを取得するにはどうすればよいですか?#

Appleは2025年9月にリリースされたSafari 26でiOS/iPadOSのUser-Agent文字列を固定しました。つまり、iOS上で動作するどのブラウザでも、User-Agentを介してOSバージョンが公開されることはなくなりました。AndroidやデスクトップのChromeとは異なり、iOSブラウザではClient Hints APIを利用できないため、プログラムから実際のiOSバージョンを取得することはできなくなりました。

通常のClient HintsとCritical Client Hintsの違いは何ですか?#

Accept-CHレスポンスヘッダーを介してリクエストされる通常のClient Hintsは、後続のリクエストにのみ含まれ、初回のページ読み込み時には利用できません。一方、Critical Client Hintsはレンダリング前にブラウザの即時再試行をトリガーし、初回レンダリング時にヒントが利用可能であることを保証しますが、リクエストサイクルにラウンドトリップの遅延が追加されます。

Appleが2017年のSafari User-Agent固定の決定を撤回したのはなぜですか?#

Appleは2017年のSafari Technology Preview 46でUser-Agentの固定を発表しましたが、最新のUser-Agent情報に依存するWebサイトとの間で重大な互換性の問題が発生したため、2021年にその決定を部分的に撤回しました。その後、Appleは完全な即時固定ではなく、より段階的なUser-Agent固定のアプローチを実装しました。

Client Hintsがサポートされていない場合、SafariでmacOSバージョンを検出するにはどうすればよいですか?#

SafariはClient Hintsをサポートしていませんが、macOSのバージョンはUser-Agent文字列のSafariバージョン番号から推測できます。Safariのメジャーバージョンから3を引くことで、macOS 10.15以降のmacOSメジャーバージョンに確実にマッピングできます。これは、SafariとmacOSのバージョンのリリース時期が一貫していることに基づいています。

JavaScriptライブラリの開発者は、クロスブラウザのデバイス検出にどのようなアプローチを使用すべきですか?#

推奨されるアプローチは、Chromiumベースのブラウザを対象として、機能が定義されている場合にはnavigator.userAgentData.getHighEntropyValues()を呼び出し、FirefoxやSafariではUser-Agent文字列の解析ライブラリにフォールバックすることです。非常に具体的なデバイスモデルの識別が必要なケースでは、wurflや51degreesなどの専門的なライブラリを使用することで、User-Agent文字列が公開するもの以上の検出機能を利用できます。

パスキーの展開で実際に何が起きているかを把握できます。

Consoleを見る

この記事を共有


LinkedInTwitterFacebook