UserAgentの名称詳細

## はじめに
UserAgent (UA) は、httpリクエストがどのデバイス、どのブラウザからのものか判別する上で、あるいはデバイスやブラウザごとにwebサーバの挙動を設定する上で重要です。しかし、その名前は複雑で、firefoxでないのにmoizllaが入っていたり、Safariでないのにweblkitが入っていたり、難しい...
そのあたりを調査した記録として本記事を残します。
次節にて、webブラウザの元となるシステムについてまとめ、その後にUAとその値の由来について記載ます。

以下の記事がとてもまとまっているので、最終的にはこちらを参照するのがよいかと思いますが、必要最低限のメモとして本記事を書いています。

https://qiita.com/nightyknite/items/b2590a69f2e0135756dc


## レンダリングエンジン
ここでは、UserAgentを解釈するために必要なレンダリングエンジンについて超簡単に記します。

### KHTML / KJS
**KHTML**は、KDEプロジェクトで開発されている、htmlレンダリングエンジンです [1]。**KJS**はJavaScriptのエンジンです。現在では、これらを基に作られた、**Webkit** (次項) を利用することが一般的となっているようです。

### Webkit
**Webkit**は、MacやiOSなどで動くSafariなどで利用される、レンダリングエンジンです[2]。weblkitのページ[2]では、World Wide Web (WWW) のみならず、その他のアプリケーションでも使える包括的なengineにしたい、という意味を込めて**Web Content Engine**と呼んでいるようです。
**KHTML** (前項) を基に**Apple**などが中心となって開発を開始し、OSSとして発展を続けています。

### Chromium
**Chromium** は**Google**が中心となって開発をしている、OSSのブラウザプロジェクトです[3]。**Google Chrome**や**Microsoft Edge**はこれを利用しています。
当初、ChromiumはWebkitをベースとして開発されていましたが、現在では**Blink**がベースになっています[4]。

### Blink
**Blink**は、2022年現在、**Chromium**で利用されているレンダリングエンジンです[5]。Webkitから分岐して作成されています[6]。

### Gecko
Mozillaプロジェクトが開発したレンダリングエンジンです[6]。**Firefox**などで利用されています。

### Trident
InternetExplorerで利用されていたレンダリングエンジンです[7]。

## UserAgentの値の意味
以下のqiita記事から代表的なUAを抜粋しつつ、その値について見ていきたいと思います。
あくまでいくつかの例について説明しているので、これがすべてではないかとは思います。

https://qiita.com/kapiecii/items/093ffd6f0b09ad775250

なお、UserAgentは次の書式で書かれています[8]。
`User-Agent: Mozilla/5.0 (<system-information>) <platform> (<platform-details>) <extensions>`


### Mac

```
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:62.0) Gecko/20100101 Firefox/62.0
```
FirefoxでのUAは上記の通りです。`(Machintosh ...)` でMacからのアクセスであることがわかります。
FirefoxはGeckoベースなので、Geckoの文字列と、ブラウザであるFirefoxがあります。

```
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15
```
SafariでのUAは上記の通りです。SafariはWebkitベースなので、`AppleWebKit`の文字列があります。前述の通り、WebkitはKHTMLを継承している都合、`KHTML`が記載されています。
さて、続いてのlike Geckoについて。かつてGeckoが他と比べて高く評価されていた時代に、Geckoのようにふるまうように設定した、とのことらしいが、いまいち英文を読んでもぴんときませんでした (なんとなくはわかるが、これだ！とパシッといえない)。
以下に引用しておきます[9]。

> And Gecko was good, and IE was not, and sniffing was reborn, and Gecko was given good web code, and other browsers were not. And the followers of Linux were much sorrowed, because they had built Konqueror, whose engine was KHTML, which they thought was as good as Gecko, but it was not Gecko, and so was not given the good pages, and so Konquerer began to pretend to be “like Gecko” to get the good pages, and called itself Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko) and there was much confusion.


```
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
```
こちらはChrome。Chromeの基盤であるchromiumはWebkitベースだったため、同じくWebkitベースのSafariと同じように `AppleWebKit/xxx.xx (KHTML, like Gecko)` や`Safari/xxx.xx`  が残っています。

### Windows

```
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36
```
こちらはFirefoxとChrome。Macと同様のため説明は省略します。

```
Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
```
こちらはIEです。Tridentの文字が入っています。`like Gecko`は前述の通り。

```
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36 Edg/94.0.992.31
```
最後にEdgeです。EdgeはChromiumを利用しているので、Chromeからのアクセス時の書き方を継承しつつ、ブラウザを表す`Edge` が入っています。

## 最後に
UAは、プライバシーの観点から、削除される可能性が高まっています。
Google Chromeは、UAから、**User-Agent Client Hints** への移行を進めています[10]。各種ブラウザで同じことになれば、こうしたUAの煩わしさからは解放されるのかもしれませんね。




## 参考文献
qiita記事については本文中に埋め込んでいます。
[1] https://api.kde.org/frameworks/khtml/html/index.html
[2] https://webkit.org/
[3] https://www.chromium.org/chromium-projects/
[4] https://ascii.jp/elem/000/000/778/778554/
[5] https://www.chromium.org/blink/
[6] https://chromium.googlesource.com/playground/chromium-org-site/+/refs/heads/main/blink/index.md
[7] https://wa3.i-3-i.info/word1361.html
[8] https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/User-Agent
[9] https://webaim.org/blog/user-agent-string-history/
[10] https://www.datacurrent.co.jp/column/useragent-20211015/