Blinkの開発者用メーリングリストでユーザーエージェント文字列を固定化する計画がアナウンスされたらしい
Intent to Deprecate and Freeze: The User-Agent string
上の記事を読んで固定化とはどういうことか、なぜするのか、どうすればよいかをまとめてみた
どういうこと?
HTTPリクエストのユーザーエージェント文字列と navigator.userAgent
でとれるユーザーエージェント文字列を固定化する(削除はしない)
Chrome Canaryでは chrome://flags
より試すことができる
試してみた結果
■ macのChrome80
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
■ macのChrome Canary で Freeze User-Agent request header
を Enabled
にした
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3764.0 Safari/537.36
Chrome Canaryの方では確かにユーザーエージェント文字列が全然関係ない Windows Chrome75
とかで返されている
実際、固定化されているかどうかは実装をみてみたら書かれている文字列と同じなので本当に固定化されているっぽい
なぜ固定化するの?
ユーザーエージェント文字列がユーザーのブラウザとデバイスに関する多くの情報を持ち、フィンガープリントなどのプライバシーの問題になりえるため
また、サーバーが不正なユーザーエージェントのスニッフィングをするようになり、互換性の目的でブラウザ自身がユーザーエージェントを偽装していたりしていてもはや意味のある情報になりえていないため
これらの理由によりエージェント文字列を固定化し、より良いメカニズムに置き換えようとしている
ユーザーエージェント・スニッフィング
ユーザーエージェント・スニッフィングとは、Webサイトが、ユーザーエージェントによって異なる内容を表示したり、 特定のユーザーエージェントにのみ内容を表示することである。(wikipediaより)
代替手段
ユーザーエージェントクライアントヒント(UA-CH)が代替手段になりうる
主な利点
- 安全な接続を介してリクエストされた場合のみサーバが情報を提供する
- 少しずつ情報を提供するため、要求された必要最低限の情報のみがサーバーにさらされる
- ユーザーエージェント文字列に含まれる多くの負の遺産(「Mozilla / 5.0」、「Gecko」、「KHTML」など)を今後削除できるようになる
など
例
①ユーザーがhttps://example.com/
に初めて来訪したとすると、ユーザーエージェントはHTTPリクエストと共に次のヘッダーを送信する
Sec-CH-UA: "Examplary Browser"; v="73"
②サーバーはユーザーのOSなどの情報をもう少し得るために、Accept-CHヘッダー
を最初のレスポンスにつけて送信する
Accept-CH: UA, Platform
③ユーザーエージェントはより詳細なバージョン情報とOSに関する情報を送信する
Sec-CH-UA: "Examplary Browser"; v="73.3R8.2H.1" Sec-CH-UA-Platform: "Windows"
このような感じのやりとりになる
ちなみに、Sec-CH-UA
のようなSec-
がついているものはブラウザ側がつけるものなのでjsではつけられない(禁止ヘッダー名)
ユーザーエージェント凍結計画
Milestone | Stable date | Action |
---|---|---|
M81 | Mid March ‘20 | Deprecate access to navigator.userAgent |
M83 | Early June ‘20 | Freeze browser version and unify OS versions |
M85 | Mid September ‘20 | Unify desktop OS string as a common value for desktop browsers. Unify mobile OS/device strings as a similarly common value for those at M85 (*) |
(Intent to Deprecate and Freeze: The User-Agent stringより)