User Agent文字列:ブラウザフィンガープリントを読む
あの変な文字列が訪問者について何を教えてくれるか、そしてなぜしばしば誤解を招くか。
すべてのHTTPリクエストにはUser-Agentヘッダーが含まれます。こんな感じ:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
これはブラウザを識別するはず。実際は歴史的な混乱。
なぜすべてのブラウザが嘘をつくか
そのChromeのuser agentはMozilla、AppleWebKit、KHTML、Safariに言及。Chromeはそれらのどれでもありません。
理由がこちら:ウェブサイトはuser agentをチェックして異なるコンテンツを提供していました。新しいブラウザは認識されないためブロックされました。
だからブラウザは嘘をつき始めました。「Mozillaと互換性がある」が標準になりました。「AppleWebKitと互換性がある」が追加されました。すべてのブラウザが他のすべてのブラウザであると主張します。
実際に学べること
混乱にもかかわらず、user agentはまだ有用な情報を含みます:
ブラウザ名とバージョン: 実際のブラウザは通常最後。「Chrome/120」や「Firefox/121」。
オペレーティングシステム: 「Windows NT 10.0」や「Mac OS X 10_15_7」や「Linux」。
デバイスタイプ: モバイルuser agentにはデバイス名か「Mobile」が含まれます。
ボット識別: Googlebot、Bingbot、その他のクローラーは自己識別します。
一般的な検出パターン
デスクトップChrome:
...Chrome/120.0.0.0 Safari/537.36
Android上のモバイルChrome:
...Android 10; Pixel 4...Chrome/120.0.0.0 Mobile Safari/537.36
iPhone上のSafari:
...iPhone; CPU iPhone OS 17_0 like Mac OS X...Safari/605.1.15
Firefox:
...Firefox/121.0
Edge、Opera、Braveなどは�hromeベースでChromeに似て見えます。
なぜ機能検出の方が良いか
User agent検出は「何のブラウザ?」に答えます。機能検出は「このブラウザはXができる?」に答えます。
// User agent検出(壊れやすい)
if (navigator.userAgent.includes('Chrome')) {
// Chrome機能を仮定
}
// 機能検出(堅牢)
if ('serviceWorker' in navigator) {
// service workerを使う
}
ブラウザは変わります。User agent文字列は修正されます。機能検出は関係なく機能します。
User Agentがまだ重要な時
アナリティクス。 オーディエンスを理解:ブラウザ市場シェア、モバイル vs デスクトップ、OS分布。
ボット検出。 クローラーを識別してサーバー動作を調整。
ターゲットテスト。 特定ブラウザでユーザーが報告した問題を再現。
レガシーサポート決定。 0.1%のユーザーがIE11を実行しているなら、サポートをやめるかも。
スプーフィングとプライバシー
User agentは簡単に偽造できます。プライバシー拡張は修正します。一部のブラウザはユーザーが手動で変更できます。
セキュリティのためにuser agentに依存しないでください。ヒントであって、認証ではありません。
ブラウザフィンガープリンティングはuser agentを他のシグナル(画面サイズ、フォント、プラグイン)と組み合わせて追跡。これは議論を呼び、ブラウザによってますますブロックされています。
Client Hints:現代の代替
User-Agent Client Hintsはより新しいアプローチ。サーバーが特定情報を要求:
Sec-CH-UA: "Chromium";v="120", "Google Chrome";v="120"
Sec-CH-UA-Platform: "Windows"
Sec-CH-UA-Mobile: ?0
構造化され、信頼でき、プライバシーを尊重。でも採用はまだ成長中。
パースライブラリ
User agentを正規表現でパースしないでください。エッジケースがあなたを打ち負かします。
パターンデータベースを維持する確立されたライブラリを使いましょう:
- ua-parser-js(JavaScript)
- user-agents(Python)
- DeviceDetector(PHP)
これらは歴史的混乱を処理し、新しいブラウザが現れた時に更新されます。
User agentはアナリティクスと診断に便利ですが、機能決定には信頼できません。ライブラリでパースし、機能には機能検出を優先し、どのユーザーもuser agentを偽造できることを覚えておきましょう。