はじめに
ブラウザとそうでないもの(ブラウザのふりをしないボットなど)を見分けるためには、HTTPリクエストで使われているUser Agentヘッダーを使用することが多いです。
例えば、みなさんもこの怪しいUser Agentを見たことがあると思います。ChromeのUser Agentです。
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36
ChromeがWebKitを使っているのは分かるのですが、Mozilla、Geckoとかとは全く関係ないはずですがw... むしろ敵同士です。しかも何故かSafariのバージョンまで入ってます。
少し古いですがUser Agent一覧を見ると、ほとんど全てのブラウザがMozilla/
で始まってます。
理由を探るべく、少し面白い記事に出会ったので翻訳します。
由来
当初は、1993年にNCSA (米国立スーパーコンピューター応用研究所)がリリースしたブラウザ、Mosaicが画期的なブラウザとして広く使われていました。MosaicのUser Agentはとてもシンプルだったそうです。(^^)
NCSA_Mosaic/2.0 (Windows 3.1)
ところが、Mosaicと競争するNetscapeのブラウザが登場し、"Mosaic Killer"を短縮してMozillaと名付られました。現代のFirefoxの前任者です。MozillaのUser Agentも簡潔でした。
Mozilla/1.0 (Win3.1)
Mozillaは独自にコンテンツを読み込むフレームという機能に対応していたので、当時のウェブエンジニアはUser AgentヘッダーでMozillaとMosaicを区別していました。問題解決!
Internet Explorer
その後Microsoftがフレームに対応したInternet Explorerを開発しました。ところが、MozillaのUser Agentヘッダーを使っていなかったため、Mosaic用のページが返ってくるという問題があります。ブラウザ市場を独占するまで待てなかったMicrosoftは、Mozillaとの互換性があるとして、ヘッダーにMozilla
と入れてしまいました。Mozillaに成りすましたということですね...
Mozilla/1.22 (compatible; MSIE 2.0; Widnows 95)
Gecko
Internet Explorerは勝ち残ったのですが、MozillaはGeckoというエンジンを開発しFirefoxとなって対抗します。
Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0
GeckoエンジンはInternet Explorerなど他のエンジンより優れていたため、Geckoを使うブラウザが急増しました。このため、再びUser Agentでブラウザを区別するサイトが増えました。
また、当時KHTMLというエンジンを使ったKonquerorというブラウザが開発されていたのですが、Internet Explorerと同じような理由でUser AgentにMozilla
やGecko
というキーワードを入れました。User Agent がわけ分からなくなってくるのはここらへんからです。
Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)
WebKit
結構長いので少し省略しますが、AppleがSafariを開発したときに、KHTMLをフォークしてWebKitという別のエンジンを作りました。Safariも同じようにGecko用のウェブページを読みたかったたため、User Agentを成りすましました。
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5
おなじみのChromeはSafariと同じようなウェブページを読み込みたかったため、Safariの真似をしました...
現代幅広く使われているブラウザ、ChromeのUser Agentは、当時のMozillaに成りすましたGeckoエンジンに偽装したKHTMLを使っているふりをしたSafariの真似をするためのものだということです.....
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36
結論
おかげさまで、User Agentヘッダーは滅茶苦茶になり、実際にブラウザを当てることが難しくなった気がします。結局最初のMozilla/
はほとんど何も意味がないものとなってしまい、実際に何が何に対応しているのかをUser Agentだけで見分けることは不可能に近く、User Agentの信憑性は疑わしく、ブラウザーの特定に必要以上な手間がかかる世界が作られたということです。
個人的には、この悲しい歴史を知って少し悲しくなりました。プログラマーとしてもいちいちこれに対応するのも大変です。その一方で、プログラマーの視点をなくせば面白い話だと思います。
最近はブラウザ開発者の間で色々なウェブテクノロジーの標準化が進められているようなので、過去を教訓にこのようなことが起こらないようにしてほしいです。
Chrome/73.0.3683.86 (AppleWebKit/537.36)
みたいなシンプルなUser Agentを取り戻すのは、今からでも遅くないと思います。でもそうしたら、今度はMozillaがChrome
の真似をするかもしれませんね。