---
url: 'https://www.corbado.com/ja/blog/client-hints-user-agent-chrome-safari-firefox'
title: 'Chrome、Safari、FirefoxにおけるClient HintsとUser-Agent'
description: 'Chrome、Safari、FirefoxにおけるUser-AgentとClient Hints APIのサポート状況と、JavaScriptコンポーネントでのパスキーおよびデバイス検出における活用方法について解説します。'
lang: 'ja'
author: 'Vincent Delitz'
date: '2026-07-27T08:23:38.821Z'
lastModified: '2026-07-27T08:25:49.265Z'
keywords: 'User-Agent Reduction, user-agent, ユーザーエージェント, client hints, クライアントヒント, User-Agent Client Hints API, Client Hints API, ブラウザサポート, ユーザーエージェント文字列, Chrome'
category: 'Engineering'
---

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

## Key Facts

- **User-Agent Reduction（ユーザーエージェント情報の削減）**は、主要ブラウザ全体で完了しています。ChromeとEdgeでは2023年以降、Firefoxでは部分的に、Safariでは2025年9月にリリースされたiOS 26以降で固定されています。
- **FirefoxはClient Hints**や`navigator.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](https://en.wikipedia.org/wiki/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の動き](https://x.com/rmondello/status/943545865204989953)を開始しました。

![twitter safari user agent reduction](https://www.corbado.com/website-assets/twitter_user_agent_d4776d2a35.png)

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

#### 1.2.2 Chrome（とEdge）のUser-Agent

2019年から2020年にかけて、[GoogleはChromeのUser-Agent文字列の粒度を下げる計画を発表し](https://groups.google.com/a/chromium.org/g/blink-dev/c/-2JIRNMWJ7s/m/u-YzXjZ8BAAJ)、特定のブラウザやデバイス情報を要求するための柔軟で制御された方法として、[User-Agent Client Hints（UA-CH）](https://chromestatus.com/feature/5704553745874944)を導入しました。GoogleはChrome CanaryとBetaバージョンでUser-Agent Reductionのテストを開始し、互換性と機能を確保するためのフィードバックを収集し、Androidおよび他のすべてのChromeプラットフォームで[2023年に完了しました](https://www.chromium.org/updates/ua-reduction/)。同時に、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として何を送信しているかを見てみましょう。

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

- オペレーティングシステムのバージョン
- ブラウザのマイナーバージョン
- ハードウェアモデル ![user agent](https://www.corbado.com/website-assets/user_agent_0fe7987aff.png)

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

| **オペレーティングシステム** | **削減/固定された名前**           |
| -------------------------- | --------------------------------- |
| 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以降）                |

#### 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](https://issues.chromium.org/issues/40167872)にも当てはまります。

#### 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が削減されるかを示しています。

| **ブラウザ**     | **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バージョンについては以下の備考を参照）。

- **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 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の仕組みを見ていきます。

## 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の名前をリストアップしました。
![client hints](https://s3.eu-central-1.amazonaws.com/corbado-cloud-staging-website-assets/client_hints_f186bae2e2.jpg)

| **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    | 高               |

### 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"                                                           |

2. Corbado.comが**後続のリクエスト**でオペレーティングシステムのバージョン（プラットフォームのバージョン）を受け取りたいとします。したがって、最初のリクエストに対するレスポンスに適切な「Sec-CH-UA-Platform-Version」ヘッダーを設定します。

| **ヘッダー** | **値**                     |
| ------------ | -------------------------- |
| Accept-CH    | Sec-CH-UA-Platform-Version |

3. **後続のリクエスト**で、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](https://user-agent-client-hints.glitch.me/headers)を使用すると、通常のヒントで情報のさまざまなレイアウトがどのように見えるかを実際に試すことができます（**Chromeを使用する必要がある**ことに留意してください）。詳細については[こちら](https://github.com/WICG/ua-client-hints)を参照してください。corbado.comが最初のページリクエストでこの情報を必要とする場合、通常のClient Hintsを使用するだけでは不十分ですが、Critical (Client) Hintsを使用してこのプロセスを迅速化する方法があります。

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

[corbado.com](https://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"                                                           |

2. corbado.comが**ページの初回レンダリング時**にオペレーティングシステムのバージョン（プラットフォームバージョン）を受け取りたいとします。次に、最初のリクエストに対するレスポンスにCritical Client Hintヘッダー「Sec-CH-UA-Platform-Version」を設定します。

| **ヘッダー** | **値**                     |
| ------------ | -------------------------- |
| Accept-CH    | Sec-CH-UA-Platform-Version |

3. 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 user agent flow complete](https://www.corbado.com/website-assets/chromium_user_agent_flow_complete_cfbf688661.png)_ChromiumでのClient Hints: [https://developers.google.com/privacy-sandbox/protections/User-Agent](https://developers.google.com/privacy-sandbox/protections/User-Agent)_

したがって、ブラウザは直ちに2回目のリクエストを開始してラウンドトリップを追加する必要があるため、Critical Client Hintsを使用すると遅延が増加します。**TLSハンドシェイクを促進して**（チャート上部の緑色のボックス）すでに詳細を送信することで、転送を最適化する方法があります。**[ALPN](https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation)（Application-Layer Protocol Negotiation）**を活用するこのアプローチは[こちら](https://docs.google.com/document/d/1HQd3vosjFls2jp6DwpkNMUN4CBdmmxZJJz0WhhcqOPw/edit)で詳しく説明されていますが、この記事の目的を超えています。

ヘッダーを使用して追加情報を受け取るには、バックエンドまたはWebサーバー/ロードバランサーに構成を追加する必要があります。これは、企業としてWebサイトを完全に制御できるファーストパーティのコンテキストで簡単に実行できます。たとえば、corbado.comのUIコンポーネントでは、[パスキーインテリジェンス](https://docs.corbado.com/corbado-connect/features/passkey-intelligence)の精度を高めるためにプラットフォームバージョンが必要です。開発者はさまざまなページにコンポーネントを統合しており、ヘッダーを追加してその情報をコンポーネントに渡すことを要求するのは、好ましくないオーバーヘッドになります。SPAやその他の埋め込みJavaScriptアプリケーションの場合、使用できる別のインターフェースがあります。これについては次のセクションで説明します。

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

[navigator.userAgentData.getHighEntropyValues()](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/getHighEntropyValues)関数を使用すると、JavaScript APIを介してClient Hintsにアクセスすることもでき、ユーザーのブラウザやデバイスに関する特定の情報を柔軟かつ動的に要求する方法が提供されます。この方法では、Webページのスクリプト内で`navigator.userAgentData`オブジェクトを使用してClient Hintsを照会します。**この方法ではClient Hintヘッダーを設定する必要はありませんが、`navigator.userAgentData`をサポートしているブラウザ（ChromeやEdgeなどのChromiumベースのブラウザ）でのみ機能します。FirefoxとSafariはこのAPIをサポートしていないため、開発者は機能を検出し、フォールバックを提供する必要があります。**

たとえば、macOS上のChromeコンソールでこのコードを実行すると次のようになります。

```javascript
if (navigator.userAgentData) {
    navigator.userAgentData
        .getHighEntropyValues(["architecture", "model", "platformVersion"])
        .then((ua) => {
            console.log(ua);
        });
}
```

Promiseが解決されると、関連情報が返されます。上で概説したように、名前はヘッダーと完全に同一ではありませんが、非常に似ています。

![platform version](https://www.corbado.com/website-assets/platform_version_6111c471f1.png)

その後、`platformVersion`はPromiseで返され、埋め込みJavaScriptコードから直接アクセスできます。この関数のカバレッジは、実際のUser-Agent Reductionよりもはるかに低くなっています。

![get high entropy list](https://www.corbado.com/website-assets/get_high_entropy_list_75834fcb30.png)

さらに、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）にアクセスできる場合に、オペレーティングシステムのバージョンをまだ検出できる場所をまとめたものです。

| **ブラウザ**     | **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](https://web.wurfl.io/)や[51degrees.com](https://51degrees.com)などのプロフェッショナルなライブラリにフォールバックしてください。これらは重労働を代行してくれます。どちらのライブラリもクライアントリンクの検出への統合をサポートしており、iPhoneモデルを検出する独自の方法も備えています。

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

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

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

![get high entropy value](https://www.corbado.com/website-assets/get_high_entropy_value_538459bd28.png)_詳細はこちら: [https://learn.microsoft.com/en-us/microsoft-edge/web-platform/how-to-detect-win11](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がこのトピックで分岐し続けるかはまだわかりません。

## よくある質問

### 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文字列が公開するもの以上の検出機能を利用できます。
