先に要点
- User-Agent(UA)とは、ブラウザやアプリがサーバーへのリクエストに添える 「自分が何のソフトか」を名乗るHTTPヘッダ です。ブラウザ名・バージョン・OSなどが文字列で入っています。
- UA文字列が ほぼ必ず
Mozilla/5.0で始まる のは、互換性のために各社が名乗りを真似し続けた歴史的な経緯によるもので、今ではほとんど意味のない接頭辞です。 - UAは 簡単に詐称できる自己申告 です。UAだけで処理を分岐させる「UAスニッフィング」は壊れやすく、現在は機能検出やUA Client Hintsへの移行が推奨されています。
- 実務では アクセス解析・ボット判別・SEO(クローラ識別)・配信最適化 に使われますが、信頼しすぎないのが鉄則です。
User-Agent: Mozilla/5.0 ... ── アクセスログやブラウザの開発者ツールで一度は見たことがある文字列だと思います。なぜFirefoxでもChromeでもSafariでも、判で押したように Mozilla/5.0 から始まるのか。そもそもこの文字列は何のためにあるのか。
この記事では、User-Agent(UA)とは何かを、HTTPヘッダとしての役割から、UA文字列の読み方、Mozilla/5.0 で始まる歴史的な理由、UAスニッフィングがなぜ嫌われるようになったか、そして後継のUA Client Hintsまで、実務で踏む場面に沿って整理します。
User-Agentとは何か
User-Agent(ユーザーエージェント、略してUA)とは、Webブラウザやアプリがサーバーにリクエストを送るとき、「自分はこういうソフトウェアです」と名乗るために添える情報 のことです。HTTPの世界では User-Agent という名前のリクエストヘッダとして送られます。
User-Agentは「来訪者が差し出す名刺」です。ブラウザの名前、バージョン、動いているOSなどが1行の文字列に書かれていて、サーバーは「どんな相手が来たか」をこれで知ります。ただし名刺は自分で好きに書けるので、本物である保証はありません。
たとえばWindowsのChromeでアクセスすると、サーバーには次のようなUAヘッダが届きます。
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
ブラウザのJavaScriptからは navigator.userAgent で同じ文字列を読めます。サーバー側ではPHPなら $_SERVER['HTTP_USER_AGENT']、アクセスログ(Apache/Nginx)にもそのまま記録されます。
UA文字列の構造を読む
一見ランダムに見えるUA文字列ですが、ゆるやかな構造があります。先ほどのChromeのUAを分解すると、こう読めます。
Mozilla/5.0
ほぼ全ブラウザ共通の接頭辞。歴史的な互換性のための飾りで、今は実質的な意味を持たない。
(Windows NT 10.0; Win64; x64)
カッコ内はプラットフォーム情報。OSとアーキテクチャ。macならMacintosh; Intel Mac OS Xなど。
AppleWebKit/537.36 (KHTML, like Gecko)
レンダリングエンジンの名乗り。これも互換目的で多くのブラウザが踏襲している。
Chrome/124.0.0.0 Safari/537.36
ようやく出てくる本当のブラウザ名とバージョン。SafariまでくっつくのもWebKit互換の名残。
つまりUA文字列は「正確な仕様で1つに定まるフォーマット」ではなく、各社が互換性のために過去の名乗りを継ぎ足してきた、歴史の地層のような文字列 です。だからこそ機械的にパースするのが難しく、後述のトラブルの原因になります。
なぜどのブラウザもMozilla/5.0で始まるのか
ここが一番面白い、そして実務でも納得しておくと役立つ部分です。結論から言うと、「サーバーに弾かれないよう、各ブラウザが先行ブラウザの名乗りを真似し続けた」 結果です。
- 1990年代、Netscape Navigator(コード名Mozilla)が高機能ブラウザとして普及し、サーバーは
Mozillaを名乗る相手にだけリッチなページを返すようになりました。 - 後発のInternet Explorerは、その分岐に弾かれないよう
Mozilla/4.0 (compatible; MSIE ...)と「自分もMozilla互換だ」と名乗りました。 - 同じ理由でその後のブラウザも
Mozilla/5.0を踏襲。さらにレンダリングエンジン互換のためAppleWebKitKHTML, like GeckoSafariまで連ねるようになりました。
要するに、「機能でフィルタリングするサーバーに弾かれたくない」という防御の積み重ねが、全ブラウザ共通の無意味な接頭辞を生んだ わけです。この歴史こそ、次に述べる「UAで処理を分けるべきではない」理由の根っこになっています。
UAスニッフィングはなぜ非推奨なのか
UA文字列を見てブラウザやOSを判定し、処理を分岐させることを UAスニッフィング と呼びます。「IEならこのCSS、Safariならこの処理」といった分岐です。手軽に見えますが、現在は強く非推奨です。
機能検出とは、「このブラウザはChromeか」ではなく「この機能(API)が使えるか」を直接確かめる方法です。たとえば if ('serviceWorker' in navigator) のように書けば、ブラウザ名を一切気にせず、能力に応じて分岐できます。UAは名前を聞く、機能検出は実力を確かめる ── この違いが、壊れにくい設計を分けます。
UA Client Hintsへの移行
UAスニッフィングの弊害と、UA文字列にOSやバージョンが細かく載ることによるプライバシー上の懸念(フィンガープリンティング)から、近年は UA Client Hints という新しい仕組みへの移行が進んでいます。
UA Client Hintsでは、巨大な1本のUA文字列を渡す代わりに、サーバーが必要な情報だけを明示的に要求し、ブラウザが小分けのヘッダ(Sec-CH-UA など)で返す 形になります。JavaScriptからは navigator.userAgentData で構造化された値を取得できます。
これにより、デフォルトで渡る情報は減らしつつ、本当に必要なとき(たとえば配信の最適化)だけ詳細を要求できます。従来の User-Agent ヘッダも当面は互換のため残りますが、細かいバージョン情報などは段階的に簡略化(凍結)が進んでいます。
UAは実務で何に使われるか
UAは「信頼しすぎない」前提のうえで、次のような場面で日常的に使われています。
- アクセス解析 ── どのブラウザ・OS・端末(PC/スマホ)からの訪問が多いかを把握する。Google Analyticsなどが内部でUAを解釈している。
- ボット・クローラの判別 ── 検索エンジンのクローラ(
Googlebotなど)やAIクローラ(GPTBotなど)はUAで名乗る。robots.txtのUser-agent:行はこの名乗りに対して方針を書く仕組み。 - SEO・サイト運用 ── クローラのアクセスをログで確認したり、特定ボットの挙動を見たりする。
- 配信・表示の最適化 ── スマホとPCで配信を変える、古い環境に注意喚起を出す、など(ただし機能検出やレスポンシブ設計が優先)。
- 不正・攻撃の検知 ── 不自然なUAや空のUA、既知の攻撃ツールのUAをログから拾う。
UAは自己申告であり、ブラウザ拡張やコマンド(curl -A など)で誰でも自由に書き換えられます。アクセス制御や課金・認証のようなセキュリティ上の判断を、UAだけに依存させてはいけません。あくまで「傾向を知る」「素直なクライアントを見分ける」程度の用途にとどめます。
たとえば「特定ブラウザだけブロックすればbot対策になる」と考えると、UAを書き換えるだけで簡単に回避されます。ボット対策は、UAに加えてアクセス頻度・挙動・IP評価などを組み合わせて判断するのが実務の定石です。robots.txt によるクローラ制御の考え方はrobots.txtとは何か・書き方とAIクローラ制御も参考になります。
User-Agentに関するよくある質問
Q. User-Agentとは何ですか?
A. ブラウザやアプリがサーバーにリクエストを送るとき、「自分が何のソフトウェアか」を名乗るために添えるHTTPヘッダです。ブラウザ名・バージョン・OS・アーキテクチャなどが1行の文字列に書かれています。サーバーやアクセスログ、JavaScriptの navigator.userAgent から読み取れます。
Q. なぜどのブラウザのUAもMozilla/5.0で始まるのですか?
A. 歴史的な互換性のためです。かつてサーバーが Mozilla を名乗る高機能ブラウザにだけリッチなページを返していたため、後発のブラウザが弾かれないよう「自分もMozilla互換だ」と名乗り続けました。その名残で、今ではほぼ全ブラウザが Mozilla/5.0 から始まる、実質的に意味のない接頭辞を付けています。
Q. UA文字列からブラウザを判定して処理を分けても大丈夫ですか?
A. 原則として避けるべきです。UAは詐称が容易で、新ブラウザや新バージョンが出るたびに判定が壊れます。代わりに「その機能(API)が使えるか」を直接調べる機能検出(feature detection)を使うと、ブラウザ名に依存せず将来も壊れにくい設計になります。
Q. UA Client Hintsとは何ですか?
A. 従来の巨大なUA文字列を、必要な情報だけサーバーが要求してブラウザが小分けのヘッダで返す、新しい仕組みです。Sec-CH-UA などのヘッダや navigator.userAgentData で構造化された値を扱えます。デフォルトで渡る情報を減らし、プライバシーへの配慮とパースの容易さを両立させる狙いがあります。
Q. User-Agentでボットを完全にブロックできますか?
A. できません。UAは自由に書き換えられるため、UAだけのブロックは簡単に回避されます。悪意のあるアクセスはUAを正規ブラウザに偽装してきます。ボット対策では、UAに加えてアクセス頻度・挙動パターン・IP評価などを組み合わせて総合的に判断するのが現実的です。
Q. 自分のブラウザのUAを確認するにはどうすればよいですか?
A. ブラウザの開発者ツールを開き、コンソールで navigator.userAgent と入力すると現在のUA文字列が表示されます。ネットワークタブでリクエストヘッダの User-Agent を見る方法もあります。サーバー側ならアクセスログや $_SERVER['HTTP_USER_AGENT'] で確認できます。
参考リンク
- MDN Web Docs: User-Agent ヘッダ
- MDN Web Docs: Browser detection using the user agent(機能検出の推奨)
- web.dev: User-Agent Client Hints