User Agent 解析

任意の User-Agent 文字列を貼り付けると、ブラウザー、レンダリングエンジン、OS、デバイス種別、CPU アーキテクチャーを解析し、JSON でコピーできます。

User-Agent 文字列を読める情報に変換します。 初期状態ではお使いのブラウザーの User-Agent を読み込みます。別の文字列を貼り付ければ解析結果を確認でき、JSON はバグ報告やテストデータにそのままコピーできます。

ブラウザー
エンジン
OS
デバイス種別
CPU アーキテクチャー

User-Agent 文字列がこうなった理由

三十年にわたる「なりすまし」の地層

現代の User-Agent は説明文というより化石の記録です。ほぼすべてのデスクトップブラウザーがいまだに Mozilla/5.0 で始まりますが、このトークンは Netscape がブラウザー戦争に敗れて以来なんの意味も持ちません。それでも残っているのは、初期のサーバーがフレームを配信する前に Mozilla を探していたからで、競合各社は格下げを避けるためにこのトークンを追加しました。あるブラウザーが嘘をついて良い方のページを受け取れば、残りも同じ嘘をつかなければユーザーを失います。

文字列の残りも同じ渦から生まれました。Chrome は 2013 年に WebKit をやめ、KHTML はさらに前に消滅しているのに、いまも AppleWebKit/537.36 (KHTML, like Gecko) を送ります。Edge が Edge/ ではなく Edg/ を付けるのは、旧トークンを部分一致で判定して壊れた代替ページを返すサイトが多すぎたからです。Safari の本当のバージョンは Version/ トークンに隠れ、末尾の Safari/537.36 は凍結されています。解析を具体的なものから順に行わなければならないのはこのためです。Chromium 派生はすべて Chrome を名乗り、WebKit 系はすべて Safari を名乗るので、最初に確信を持って一致したものを採用するしかありません。

信じてよいもの、いけないもの

この文字列はクライアントが送るヘッダーであり、手がかりではあっても証拠には決してなりません。どんな HTTP クライアントでも任意の値を送れますし、ユーザーは拡張機能や開発者ツールで日常的に偽装します。ログの補助情報として扱い、認可の入力やセキュリティ境界には使わないでください。

誰も嘘をついていない場合でも、値はどんどん粗くなっています。Chrome と Edge はマイナーバージョンを 0.0.0 に凍結し、簡略化したプラットフォーム文字列を報告するようになりました。Windows NT 10.0 は Windows 10 と Windows 11 の両方を指し、macOS は実際のリリースにかかわらず何年も 10_15_7 に固定されています。Firefox も同様に OS 情報を丸めます。バージョン番号が不自然にきれいなら、たいていは凍結された値です。

デバイス判定が最も脆い部分です。文字列にデバイス欄は存在せず、MobileiPadTablet といったトークンの有無から推測するしかありません。Android タブレットは典型的な落とし穴で、多くは Mobile トークンがないことだけで判別されます。iPadOS は既定設定でデスクトップの Mac として振る舞います。

基本は機能検出に置き換える

挙動を変える判定は、ラベルではなく能力を調べてください。if ('share' in navigator) は正しく長持ちしますが、if (isSafari) は別のエンジンが同じ API を実装した瞬間、あるいは Safari が修正を出した瞬間に壊れます。レイアウトについては、CSS メディアクエリのほうが実際のビューポートや入力方式をはるかに正確に表します。

User-Agent がいまも価値を持つのは、アナリティクス、クラッシュの仕分け、バグの再現です。あるスタックトレースが Gecko でしか出ない、あるレイアウト崩れが Samsung Internet に限られる、と分かれば、再現不能な報告が具体的なテストケースに変わります。現代的な後継は User-Agent Client Hints API で、同じ事実を構造化された値として提供し、完全なプラットフォームバージョンのような高エントロピー情報は明示的に要求した場合のみ得られます。

オープンソースに関する注記:バニラ JavaScript で実装。サードパーティライブラリは使用していません。

よくある質問

Chrome が Mozilla と Safari を同時に名乗るのはなぜですか。
歴史的な互換性のためです。かつてサーバーは Mozilla を確認してから現代的なマークアップを送り、のちに Safari を確認してから WebKit 向け CSS を送っていました。各ブラウザーは劣化ページを避けるためこれらのトークンを追加し、いま削除すると今も判定しているサイトが壊れます。
User-Agent をセキュリティ判断に使えますか。
使えません。クライアントが完全に制御できるリクエストヘッダーで、任意の値を設定できます。診断と統計にとどめてください。アクセス制御やポリシー適用は、自己申告の文字列ではなく認証に基づく必要があります。
macOS のバージョンが 10.15.7 と表示されるのはなぜですか。
Safari と Chrome はフィンガープリントの手がかりを減らすため、報告する macOS バージョンを意図的に 10_15_7 で凍結しています。ブラウザーは実際のバージョンを知っていますが、ヘッダーには入れません。Client Hints ならサイトが明示的に要求した場合に取得できます。
タブレットとスマートフォンはどう区別していますか。
iPad トークン、Mobile トークンを含まない Android 文字列、あるいは明示的な Tablet 表記を探します。多くのライブラリと同じ方法ですが、本質的にヒューリスティックです。文字列だけでは大画面スマートフォンと区別できない Android タブレットもあります。
入力した User-Agent はどこかに送信されますか。
送信されません。解析はすべてブラウザー内で正規表現によって行われ、何もアップロードされません。初期値はローカルの navigator.userAgent から読み取られ、ページの外に出ることはありません。
User-Agent スニッフィングの代わりに何を使うべきですか。
機能については機能検出、レイアウトについては CSS メディアクエリ、本当にプラットフォーム情報が必要なときは User-Agent Client Hints API を使ってください。Client Hints は構造化された値を返し、高エントロピーな詳細は明示的な要求の背後に置かれます。