WebGLレンダラー文字列とハードウェアシグナル:GPUはあなたについてどこまで語るのか

ブラウザが動いているハードウェアは、いくつかの小さな経路を通じてページに漏れ出します。どれもマシンの名前を明かしませんが、組み合わせると、他のほとんどのマシンと区別できるほど詳しくそれを描き出します。
レンダラー文字列
WebGLはWEBGL_debug_renderer_infoという拡張を公開しており、マスクされていないベンダーとマスクされていないレンダラーの二つの値を提供します。WindowsのChromiumでは、レンダラーは通常、ANGLE (NVIDIA, NVIDIA GeForce RTX 2060 SUPER (0x00001F06) Direct3D11 vs_5_0 ps_5_0, D3D11)のように読めます。この1行から、GPUのベンダー、正確なモデル、PCIデバイスID、グラフィックスAPI、シェーダーモデルが分かり、これはオペレーティングシステムの強い手がかりでもあります。この文字列はWindowsにしか存在しないからです。
FirefoxとSafariは、時期によってこの文字列をマスクしたり一般化したりしてきましたが、Chromiumは公開しています。マスクするブラウザは汎用的な値を返し、診断では推測せずに「レンダラー情報はマスクされています」と表示されます。
数とサイズ
navigator.hardwareConcurrencyは、論理CPUスレッドの数を返します。navigator.deviceMemoryはRAMのおおよその量を返し、少数の値に丸められ、Chromiumでは8が上限なので、32 GBのマシンでも8と報告されます。screen.widthとscreen.heightはディスプレイのサイズを、availWidthとavailHeightはタスクバーを差し引いたサイズを返し、devicePixelRatioは拡大率を明らかにします。screen.colorDepthはほぼ常に24です。navigator.maxTouchPointsは、タッチデバイスとそれ以外を分けます。
これらの一部は、無害に見えるわりに、特定力が異常に高いものです。スレッド数にはよくある値が数個しかありませんが、有名な商用フィンガープリンティングサービスが重く重み付けしているフィールドの一つです。安価で安定しているからこそです。画面サイズに、ピクセル比と利用可能な高さを組み合わせると、ユーザーエージェントよりもマシンを絞り込めます。
メディアデバイス
navigator.mediaDevices.enumerateDevices()は、システムが持つカメラ、マイク、スピーカーを返します。許可がなければ、最近のブラウザは種類と数だけを返し、ラベルは空なので、ページが知るのは「カメラ1台、マイク1台、出力1台」ということだけです。いずれかのサイトにアクセスを許可すると、ラベルが明らかになります。数だけを表示する診断は、許可を持たないページと同じ振る舞いをしています。
再び、一貫性という観点
ハードウェアのシグナルは、偽装が最も失敗しやすい場所です。NVIDIAのDirect3Dレンダラー、24スレッド、1366×768の画面を持つMacBookを名乗るプロファイルは、存在しないマシンを描いています。サイトはそれに気づくのにデータベースを必要とせず、いくつかのルールで見抜けます。プロファイルがこれらの値のどれかを変更するなら、実在のデバイスが実際に出荷される組み合わせにすべてを変更し、訪問をまたいでそのままにしなければなりません。
確認すること
レンダラー文字列を読み、ユーザーエージェントのオペレーティングシステムと一致しているかを問います。画面サイズを読み、ピクセル比や利用可能な高さと一致しているかを問います。スレッド数とメモリを読み、そのGPUに対してその組み合わせがもっともらしいかを問います。診断は、まさにこの目的のためにこれらを並べて表示します。判断はあなた次第です。


