新しいユーザエージェント表現 User Agent Client Hints の提案仕様

20190218追記
Implement `Sec-CH-UA-*` replacements for `User-Agent`.
https://chromium.googlesource.com/chromium/src/+/2fddeeb74abcc3c9e3ba88df4cfb0c1c07e43fc6

Chromeでは実装が進められている


ユーザエージェントは歴史的背景により、複雑な文字列が使用されています。

iOSでは

     User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X)
                 AppleWebKit/605.1.15 (KHTML, like Gecko)
                 CriOS/69.0.3497.105 Mobile/15E148 Safari/605.1

Edgeでは

  User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
              AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.2704.79
              Safari/537.36 Edge/18.014

これには、不必要な情報や、歴史的な互換性を表現するための文字列などが含まれています。

ユーザエージェントを見て、適切なコンテンツを返すというのはこの複雑なユーザエージェントを正しく解釈する必要があります。

これを改善するためにClient Hintsの仕組みに則った新しい仕様である、「User Agent Client Hints」がGoogleのMike West氏から提案されています。

この提案では、ブランド名・プラットフォーム・アーキテクチャを個別に表現するヘッダを定義しています。

まずブラウザが https://example.comに最初にアクセスしたとき、Sec-CH-UAヘッダでブランド名とメジャーバージョンを含む情報を伝えます。

Sec-CH-UA: "Examplary Browser 73"

その後、サーバはさらなる情報が欲しい場合は、Client hintsの仕組みに乗っ取りAccept-CHレスポンスで欲しい情報を明示します。

Accept-CH: UA, Platform

サーバからのレスポンスを受け取ったブラウザは以後、次のヘッダを用いてユーザエージェント情報を伝えます。以下では、Sec-CH-Platformでプラットフォーム情報を送信しています。

     Sec-CH-UA: "Examplary Browser 73.3R8.2H.1"
     Sec-CH-Platform: "Windows 10"

新しく定義されるプロパティ

  • "brand" (for example: "cURL", "Edge", "The World's Best Web Browser")
  • "major version" (for example: "72", "3", or "28")
  • "full version" (for example: "72.0.3245.12", "3.14159", or "297.70E04154A")
  • "platform brand" (for example: "Windows NT", "iOS", or "AmazingOS")
  • "platform version" (for example: "10", "12", or "17G")
  • "platform architecture" (for example: "ARM64", or "ia32")
  • "model" (for example: "", or "Pixel 2 XL")

新しく定義されるヘッダ

各プロパティは下記のヘッダに含まれて送信されます。

  • Sec-CH-Arch
  • Sec-CH-Model
  • Sec-CH-Platform
  • Sec-CH-UA

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
            Chrome/71.1.2222.33 Safari/537.36
Sec-CH-UA: "Chrome 74.0.3424.124"
Sec-CH-UA-Platform: "macOS 12"
Sec-CH-UA-Arch: "ARM64"

ヘッダ先頭にSec-CH-が付く理由

W3C TAGのレビューに基づいています。
Sec-をつけることでJavaScriptからのアクセスを禁止し、CORSも不要となります。

github.com