[翻訳] Blink-Dev: Intent to Deprecate and Freeze: The User-Agent string

原文: https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/-2JIRNMWJ7s/yHe4tQNLCgAJ

※ ただの翻訳メモ。

## Summary

HTTP リクエスト、及び `navigator.userAgent` における User-Agent 文字列をフリーズし統一させたい (ヘッダの削除は行わない)。

## Motivation

User-Agent 文字列は、我々のユーザーに関するパッシブフィンガープリンティングの豊富な情報源です。多くのサーバーが不正な User-Agent 文字列によるスニッフィングに依存するようになったため、今ではユーザーのブラウザやデバイス情報に加え、互換性を目的とした虚偽の情報が数多く含まれています ("Mozilla/5.0", 誰か使っていますか？)。

こうしたプライバシーの問題に加えて、User-Agent スニッフィングはしばしば互換性の問題を引き起こします。特にマイノリティーであるブラウザにとっては、自身の User-Agent を偽る状況を招いており (全ての、もしくは一部のサイトに対して)、一部のブラウザでは正当な理由なくサイトが[正しく表示されません](https://www.onmsft.com/news/google-has-apparently-blocked-its-stadia-cloud-gaming-service-on-the-chromium-based-microsoft-edge) (Google の保有するサービスを含め)。

上記のような乱用から、User-Agent 文字列をフリーズし、より優れたメカニズムでそれを置き換えることが望まれています。過去に Safari チームが User-Agent 文字列をフリーズしようと試みたことがありましたが、User-Agent ベースの content-negotiation に代わる方法がなく、当時は断念せざるを得ませんでした。

User-Agent Client Hints (UA-CH) は、リクエストヘッダーおよび JS API の両方において User-Agent 文字列が提供してきた情報の代わりとなるソースを提供する機能です。
主なアドバンテージは下記の通りです:

- UA-CH は、セキュアなコネクション上においてサーバーが情報をリクエストした場合にのみ、必要な情報を提供します。これにより全てのフィンガープリンティングはアクティブフィンガープリンティングとなり、その利用状況を監査したり、ブラウザによる処理が可能になります (例: [Privacy Budget](https://github.com/bslassey/privacy-budget) の将来の実装)。

- UA-CH は情報を小さな増分によって提供します。これによりサーバーは、例えば単にブラウザについての1つの詳細を求めているような状況下において (例: ブランドおよびメジャーバージョン)、従来のようにありとあらゆる User-Agent 文字列を受け取るのではなく、自身が必要とし要求を行った情報のみを受け取ることができるようになります。

- UA-CH では情報は専用のフィールドを介して提供されるため、サーバーにとってはより良い使い勝手となり、情報の誤りによる互換性の問題が起きる可能性を減らします。

- 最後に、新しく始めるということは、我々が今後 User-Agent 文字列がこれまで運んできた大量のレガシーな荷物を処分出来ることを意味します (例: “Mozilla/5.0”, “like Gecko”, “like KHTML” などなど)。

我々は UA-CH がブラウザ固有のコンテントアダプションの代替手段として[実装され次第](https://groups.google.com/a/chromium.org/d/msg/blink-dev/A4wxFpvqUfA/g7iccl9ICgAJ)、User-Agent 文字列をフリーズさせたいと考えています。
M81 で非推奨とし (JS で User-Agent 文字列を読み取るページにはコンソールで警告を表示)、M83 でバージョン情報をフリーズ、M85 でデバイスごとの異なる文字列情報を統一することを提案します。詳細は下記のフリーズ計画を確認してください。
このタイムラインでは、ブラウザ・OS バージョンの情報取得を新しいメカニズムへ移行するために3ヶ月間を、より詳細な OS 情報やデバイス固有のターゲティング情報の取得の移行に6ヶ月間を開発者へ提供します。

### Freezing plan

User-Agent 文字列を構成する各パーツは、それぞれが異なる互換性への影響を持っています。
その一部であるブラウザバージョンや OS バージョンなどは、後方互換性へ影響を及ぼすことなくフリーズすることが可能です。
OS プラットフォームやモデル名 (モバイル端末) などの他のパーツは、UI を基盤となる OS によって合わせたり、レイアウトを特定のモデルによって細かく合わせているようなサイトに影響を与えます。このようなサイトは UA-CH への移行が必要になります。

そのため、我々はフリーズが容易なものについてはすぐにフリーズを行い、残りは徐々に統一していく計画です。

| Milestone | Stable date | Action |
|---|---|---|
| M81 | 2020年3月中旬 | `navigator.userAgent` へのアクセスを非推奨に |
| M83 | 2020年6月初旬 | ブラウザバージョンをフリーズし、OS バージョンを統一 |
| M85 | 2020年9月中旬 | デスクトップブラウザにおいて、デスクトップ OS 文字列を共通の値として統一。M85 で、モバイル OS・デバイス文字列をそれらの同様の共通の値として統一。 (*) |

(*) モバイルの値については、統一互換性のリスクを減らすために、1度限りの予行として、デバイスの大きさに応じた分割を行う可能性があります。

## Interoperability and Compatibility Risk

互換性のリスクは様々なステージによって異なってきます。
M83 で計画されているフリーズでは、互換性のリスクは低いです。現在使っている User-Agent スニッフィングのコードは引き続き期待通りに動作します。UA-CH を代わりに使う必要があるのは、将来の User-Agent スニッフィングコードのみです。

M85 で計画されている統一では、互換性のリスクは中程度です。いくつかのサイトは OS およびデバイスモデルに応じてレスポンスを変更することができ、そのためには User-Agent スニッフィングコードを UA-CH を使うように変更する必要があります。我々はそのようなサイトが非常によくメンテナンスされていることを想定しています (そうでなければ、彼らはどのように OS UI の変更や新しいデバイスモデルの変更に追従しているのでしょう。)。このため、彼らのコードを変更するのには合計でも4つのリリースが必要十分に思われます。

UA-CH ベースの User-Agent スニッフィングの方が現在の状況よりも信頼性が高いため、長期的にはこの変更が互換性の問題を改善していくと我々は考えています。

相互運用性について、User-Agent のフリーズは我々以外にも他のベンダでも行われます。しかし、これは必ずしも User-Agent 文字列を置き換える UA-CH メカニズムも実装されるという意味ではありません。これは開発者にとって、あるブラウザでは User-Agent 文字列を、またあるブラウザでは UA-CH を使わないといけない、といったトリッキーな状況を生み出す可能性があります。

Edge: [支持しています](https://twitter.com/_scottlow/status/1206831008261132289)

Firefox: User-Agent 文字列のフリーズに関しては[支持しています](https://github.com/mozilla/standards-positions/issues/202#issuecomment-558294095) - "_UA-CH 無しで User-Agent 文字列のフリーズを行うのは、やる価値のあるプロトタイピングだと思います_"

Safari: 一部に対して適用しました。Safari は過去に代替手段を提供することなく User-Agent 文字列を完全にフリーズしようと[試みました](https://twitter.com/rmondello/status/943545865204989953)。その試みは多くの反対を受け、結果的に変更を元に戻すことになりました。今日では、彼らの User-Agent 文字列は OS バージョンとブラウザのメジャーバージョン以外はフリーズされているようです。

## Alternative implementation suggestion for web developers

今日における多くの (またはほとんど全ての？) User-Agent スニッフィングの用途にって、より良い選択肢は feature detection を使うことでしょう。Feature detection が開発者にとって最善ではない場合、[UA-CH](https://wicg.github.io/ua-client-hints/) が正しい選択です。

現状と比較した場合の潜在的な展開のハードル:

- User-Agent 文字列に依存するサードパーティのサービスは、そのサービスを使っているサイトに対して User-Agent の情報を Feature Policy を使ってデリゲートしてもらう必要があります。

- UA-CH の opt-in ベースのメカニズムは、ユーザーの1番最初の訪問の際にはブラウザがまだ opt-in を受け取ることができていない、という事実に現在悩まされています。これはつまり、特定の User-Agent 情報 (例: デバイスモデル、プラットフォーム) を最初の訪問の際に取得しようとすると、遅延が発生する可能性があります。これを避けるため、opt-in をさらに下のスタックで有効にするオプションを検討しています。

## Usage information from [UseCounter](https://cs.chromium.org/chromium/src/third_party/WebKit/Source/core/page/UseCounter.h?sq=package:chromium&type=cs&q=file:UseCounter.h+Feature&l=39)

もし我々が User-Agent 文字列を完全に削除する予定だったとしたら、それに対する回答は散々だったでしょう。

今回我々は User-Agent 文字列をフリーズすることを計画しているので、いずれ "削除" が必要になった時に特定の OS やデバイスへの適応といったケースを除き、おおよそ後方互換性が取れるようになると考えています。

[クライアントサイドでの User-Agent スニッフィング利用率計測](https://www.chromestatus.com/metrics/feature/timeline/popularity/2663)は、およそ ~90% のサイトでそれが使われていることを示しています。ただし、重ねてになりますが、我々は User-Agent のフリーズに関してのみ話しており、これはほとんどの用途を壊すものではありません。

Entry on the feature dashboard
https://www.chromestatus.com/feature/5704553745874944