User-AgentとClient Hints:何が分かり、何が凍結されたのか

User-Agent文字列は、ウェブで最も古い識別シグナルであり、ここ数年で最も大きく変わったものでもあります。これをきちんと読み解くには、まだ何が含まれているのか、何が意図的に凍結されたのか、そして取り除かれた詳細がどこへ行ったのかを知る必要があります。
文字列が語ること
WindowsでのChromiumの現在の文字列は、Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/154.0.0.0 Safari/537.36のようになります。歴史的なトークン(Mozilla/5.0、AppleWebKit、like Gecko、Safari)は数十年前に書かれたスクリプトとの互換性のためにあり、情報は持っていません。有用な部分は、プラットフォーム(Windows 11でもWindows NT 10.0)、アーキテクチャ、そしてブラウザのメジャーバージョンです。
かつてあったものは、意図的に取り除かれました。マイナーバージョンとパッチバージョンは今では0.0.0です。Windowsのバージョンは10.0に固定されています。Androidの文字列には、もうデバイスのモデルが含まれません。これは、文字列がフィンガープリンティングの足がかりになっていたために、Chromiumが2022年から2023年にかけて導入した「User-Agentの縮小」です。
Client Hints:同じデータを、要求に応じて
取り除かれた詳細は消えたのではなく、User-Agent Client Hintsへ移りました。サーバーはAccept-CHヘッダーで特定のフィールドを要求でき、するとブラウザは以降のリクエストでSec-CH-UA-Platform-VersionやSec-CH-UA-Modelなどのヘッダーを送信します。低エントロピーのヒント(ブランドとメジャーバージョン、プラットフォーム、モバイルかどうかのフラグ)は既定で送信されます。高エントロピーのヒント(完全なバージョン、アーキテクチャ、ビット数、モデル、プラットフォームのバージョン)は、要求したサイトにのみ送られ、スクリプトはnavigator.userAgentData.getHighEntropyValues()を通じて同じ組を要求できます。
設計上の目標は、サイトが欲しいものを宣言しなければならないようにし、収集を可視化して監査可能にすることです。実際には、フィンガープリントを取りたいサイトは今でもすべてを要求できます。違いは、その要求がブラウザから見え、記録でき、拒否もできるものになったことです。
一貫性の問題
同じ事実が2つの情報源から得られるようになったため、両者を比較できます。User-Agent文字列をmacOSを名乗るように変更しながら、navigator.userAgentData.platformがWindowsを報告したままのブラウザは、簡単に検出できる矛盾を生み出しています。navigator.platformプロパティ、ページから見えるOS固有のフォント、そして1つのオペレーティングシステムにしか存在しないグラフィックスドライバの名前を示すWebGLレンダラーの文字列にも、同じことが当てはまります。文字列だけを偽装する方法は、何年も前から負け戦でした。
自分のものを読む
診断には、生の文字列、そこから解析されたブラウザとバージョン、そしてエンジン(Blink、Gecko、WebKit)が表示されます。なお、iOSのすべてのブラウザは、ブランドが何であれWebKitを報告します。Appleがそれを義務づけているからです。解析されたブラウザ名が意外だった場合、拡張機能かプロファイルの設定によって文字列が書き換えられています。それが問題かどうかは、ブラウザの他の部分がその書き換えと整合しているかどうかで決まります。


