UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Chrome】ユーザーエージェント文字列が固定化されるはなし

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

macChrome Canary で Freeze User-Agent request headerEnabled にした

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より)

参考

Chromeのユーザエージェント固定された時のUA文字列 - Qiita