Chrome のユーザー エージェントの情報量削減に備える

Chrome では、ユーザーのプライバシーを保護するために、ユーザー エージェント文字列で共有される情報を引き続き削減しています。

Chrome 110(2023 年 2 月)より、Android のバージョンとデバイスモデルの固定値を段階的に導入しています。モデル K のデフォルト値は常に Android 10 です。 訪問者のオペレーティング システムのバージョン、Android デバイスのモデル、ブラウザの詳細バージョンの検出に user-agent を使用している場合は、なんらかの対応が必要になることがあります。以下で詳しく説明します。

user-agent とは、ユーザーのブラウザとユーザーの環境に関する情報を提供する文字列です。たとえば、サイトの訪問者が Android の Chrome バージョン 110 を実行していることがわかります。 ブラウザはこれを HTTP ヘッダーで送信し、JavaScript で利用できるようにします。

完全なユーザー エージェント文字列の問題は、クロスサイト トラッキングを許可する重要な要素であるリクエストごとにブラウザに関する詳細情報をデフォルトで共有していることです。Google は、このようなデータをパッシブに収集する機会を減らすと同時に、ユーザーが必要なときに能動的にデータにアクセスできる API を提供することを目指しています。

これまでのユーザー エージェントの削減

Google ではすでに、デフォルトで使用できるユーザー エージェント データの一部を削除し、固定値に置き換え始めています。

Chrome 101 以降では、マイナー バージョン番号がゼロに置き換えられています。たとえば、Chrome/101.3.2.1Chrome/101.0.0.0 になりました。

Chrome 107 より、パソコンのオペレーティング システムのバージョンと CPU の情報が、プラットフォームの固定値に置き換えられました。

MacMacintosh、Intel Mac OS X 10_15_7
ウィンドウWindows NT 10.0、Win64、x64
ChromeOSX11、CrOS x86_64 14541.0.0
LinuxX11、Linux x86_64

Android のバージョンとデバイスモデルを修正(Chrome 110 以降)

Chrome 110 より、Android のバージョンとデバイスモデルの固定値を段階的に導入しています。 Pixel 7Android 13 などが表示される代わりに、デフォルト値は常にモデル KAndroid 10 になります。

変更前: user-agent に Android のバージョンとデバイスモデルを含める

Mozilla/5.0(Linux、Android 13Google Pixel 7)AppleWebKit/537.36(Gecko などの KHTML)Chrome/95.0.0.0 Mobile Safari/537.36

変更後: ユーザー エージェントを縮小し、Android のバージョンとデバイスモデルを修正

Mozilla/5.0(Linux、Android 10K)AppleWebKit/537.36(KHTML, like Gecko)Chrome/95.0.0.0 Mobile Safari/537.36

ユーザー エージェントの形式に変更なし

ユーザー エージェントの情報量削減では、ユーザー エージェントで返される値は変更されますが、形式は変わりません。オペレーティング システムの種類やブラウザのメジャー バージョンを読み取るためだけにユーザー エージェントを使用する場合、そのデータは以前と同様に更新されるため、何もする必要はありません

ユーザー エージェント文字列のプラットフォーム、ブラウザ名、ブラウザのメジャー バージョン、モバイル インジケーターの各部分は、以前と同様に更新されます。オペレーティング システムの種類、デバイスモデル、ブラウザのマイナー バージョンは静的な値です。
ユーザー エージェント文字列のその他の部分はすべてそのままにします。

user-agent の代替手段

より詳細なデータを現在使用している場合は、代わりにプログレッシブ エンハンスメントや機能検出を使用できるかどうかを確認することをおすすめします。

ユーザー エージェントは他のユーザーが指定した値と同様であることを常に念頭に置いてください。正確であることを前提とせずに、検証する必要があります。ユーザー エージェントの値は、ユーザー、拡張機能、他のクライアントによって簡単に変更される場合があり、まったく送信されない場合もあります。 ほとんどの場合、ユーザー エージェント データがなくても作業コンテンツを訪問者に配信できるはずです。

User-Agent Client Hints を使用して詳細データをリクエストする

デバイス固有のコンテンツの提供、不正防止機能、詳細なロギングなど、詳細なユーザー エージェント データにアクセスする正当な理由は多数あります。より詳細なデータが必要な場合は、User-Agent Client Hints(UA-CH)API を使用してアクセスできます。ユーザー エージェントと同様に、UA-CH は HTTP ヘッダーまたは JavaScript で使用できます。

Sec-CH-UA- プレフィックスを付けて送信されるデフォルトのヘッダーは、ブラウザ、メジャー バージョン、オペレーティング システム、ブラウザがモバイル デバイスかどうかを示すものです。

Chrome の Default User-Agent Client Hints リクエスト ヘッダー:

Sec-CH-UA: "Chromium";v="110", "Not A(Brand";v="24", "Google Chrome";v="110"
Sec-CH-UA-Mobile: ?1
Sec-CH-UA-Platform: "Android"

レスポンスの Accept-CH ヘッダーを使用して、追加データをリクエストできます。この場合、Sec-CH-UA-Platform-VersionSec-CH-UA-Model をリクエストして、後続のリクエストでその Android バージョンとデバイスタイプを取得できます。

プラットフォームのバージョンとモデルを指定したサーバーからのレスポンス ヘッダー:

Accept-CH:
  Sec-CH-UA-Platform-Version,
  Sec-CH-UA-Model

Android のバージョンとモデル名を含む Chrome からヘッダーをリクエストする:

Sec-CH-UA-Platform-Version: "13.0.0"
Sec-CH-UA-Model: "Pixel 7"

JavaScript でも同じことができます。userAgentData API で getHighEntropyValues() を呼び出して、必要な値(platformVersionmodel)の配列を渡します。これにより、特定の値を含むオブジェクトを持つ Promise が返されます。

navigator.userAgentData
 .getHighEntropyValues(
   ['platformVersion', 'model']
 ).then(ua => { console.log(ua)
 });

{
  "platformVersion": "13.0.0",
  "model": "Pixel 7"
}

クロスオリジンまたは初期リクエスト

これらの値を必要とするクロスオリジン リソースがページにある場合は、Permissions-Policy HTTP ヘッダーを使用するか、HTML で Delegate-CH メタタグを使用してアクセスを許可できます。

サイトの最初のトップレベル リクエストでこうした機密性の高い値を使用する必要がある場合は、Critical-CH HTTP ヘッダーを使用して、追加のヒントを追加して最初のリクエストを再試行するようブラウザに指示します。 更新が困難な従来のシステムではこの方法が便利ですが、理想的には、最初の HTML を配信する際、機密性の高い値に依存しないようにする必要があります。

詳細

削減された user-agent 文字列の動作を確認するには、以下をご覧ください。

  • goo.gle/reduced-ua-demo で、ご利用のデバイスのユーザー エージェント文字列の短縮版をご覧ください。
  • goo.gle/ua-ch-demo で、ご利用のデバイスの JavaScript と HTTP ヘッダーのすべての User-Agent Client Hints をご覧ください。
  • #reduce-user-agent Chrome フラグを有効にして、ブラウザでユーザー エージェント文字列を削減して送信します。

また、ユーザー エージェント削減のオリジン トライアルに登録して、減らされたユーザー エージェントをサイトで受信することもできます。ただし、デフォルトで削減したユーザー エージェントの送信を継続するため、このトライアルは 3 月上旬に終了する予定です。

ユーザー エージェントの削減に関するランディング ページにその他のリソースがあります。また、専用の user-agent-reduction GitHub リポジトリで問題を報告することもできます。