ふわっとテック日記

テック系のことをメインに書いていきます。go言語/typescript/javascriptが好きです。たまに趣味(筋トレ)の話や日常系の記事も書きたいな〜と思っています。

User-Agent Client Hints - ユーザーエージェント削減の代替策

本記事は、こちらのドキュメントを一部翻訳して執筆しています。

wicg.github.io



従来のユーザーエージェントはアクセス元のデバイスやOSバージョンなどの情報を持ちます。

多くのシステムではユーザーエージェント文字列を元に、特定デバイスやOSからのリクエストを制限するなどの実装が行われてきました。

しかし、近年のプライバシー問題に対する世界的な意識の高まりにしたがって、cookie制限などの例に漏れずユーザーエージェントの情報も不用意な公開を防ぐ潮流が生まれてきました。

(例えば近い将来では、2023年の2月のChrome110のリリースに伴い、Androidのユーザーエージェント文字列でバージョン名の固定、デバイス名の匿名化が適用される予定となっています。)

この、プライバシーの観点からユーザーエージェント情報の公開を制限する仕組みの1つが、User-Agent Client Hints (UA-CH) と呼ばれるものです。

これはGoogle Chromeが実装している機能であり、各種ブラウザの対応も進んでいます。

従来のユーザーエージェントが段階的に廃止される中、リクエスト元の情報を得るものとして将来的な対応が不可欠のものとなっています。

User-Agent Client Hints (UA-CH) 概要

ざっくり言うと、UA-CHは個人の特定が不可能なレベルでユーザーエージェント情報の部分的な受け渡しを行う機能です。

UA-CH対応ブラウザで 任意のURLにリクエストを送る際、例えば以下のようなヘッダがHTTPリクエストで送信されます。

Sec-CH-UA: "Examplary Browser"; v="73", ";Not?A.Brand"; v="27"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "Windows"

これらの情報は従来のユーザーエージェント情報の一部であり、個人特定を防ぐために断片的に渡されています。

部分的に情報を渡すことでプライバシー対策になるだけでなく、通信のパフォーマンス向上効果も得られます。

上記を受け取ったサーバは、以下のように Accept-CH ヘッダを付与してレスポンスを返すことにより、より詳細なユーザ情報をブラウザに求めることができます。

Accept-CH: Sec-CH-UA-Platform-Version

Accept-CHを受け取ったクライアントは、その値を踏まえ、今度は次のようなリクエストを送ります。

Sec-CH-UA: "Examplary Browser"; v="73", ";Not?A.Brand"; v="27"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "Windows"
Sec-CH-UA-Platform-Version: "14.0.0"

このように、CH-UAでは、初回のリクエストでユーザ情報の部分的な情報のみが渡され、より詳細な情報をサーバが求める場合はオプトイン形式でブラウザから取得するという形をとります。

サーバはブラウザが許可する場合に限り、ブラウザからこれらの情報を取得できます。

ヘッダのやりとりはHTTPS通信でなければできないようになっています。また、同一originでない場合、Accept-CHを使ったヘッダのやりとりは行うことができません。

Accept-CHの使用はRFC8942(HTTP Client Hints)で定義されています。

このドキュメントにも記載がありますが、ブラウザは場合によっては求められた情報に対し、プライバシー保護のために空文字、もしくは架空の値を返すことがあります。

ヘッダフィールド

Sec-CH-UA

ユーザーエージェントのブランドとそのバージョンをリスト形式で返します。バージョンはメジャーバージョンのみが返されます。

low entropy(Accept-CHヘッダでのやりとりなしで初回リクエストで渡せる、秘匿性の比較的低い情報)です。

Sec-CH-UA-Arch

CPUのアーキテクチャを返します。

Sec-CH-UA-Bitness

CPUアーキテクチャのビット数を返します。

Sec-CH-UA-Full-Version

ユーザーエージェントのフルバージョンを返します。

このヘッダは非推奨となっており、将来的に廃止される予定です。代わりに下記のSec-CH-UA-Full-Version-Listの利用が推奨されています。

Sec-CH-UA-Full-Version-List

ユーザーエージェントのブランドごとのフルバージョン情報を、リスト形式で返します。

Sec-CH-UA-Mobile

モバイルデバイスであるかどうかの真偽値を返します。

low entropyであり、デフォルトで渡されます。

Sec-CH-UA-Model

モバイルデバイス名を返します。

Sec-CH-UA-Platform

OS名を返します。

low entropyであり、デフォルトで渡されます。

Sec-CH-UA-Platform-Version

OSバージョンを返します。

Sec-CH-UA-WoW64

Windowsの64bitか32bitかの情報を真偽値で返します。64bitのwindowsなら真となります。

UA-CH API

JavaScriptでのUA-CH用のAPIが用意されています。

developer.mozilla.org

getHighEntropyValues(hints)メソッド

非同期的にhigh entropyなヘッダを取得するjsメソッドです。求めている情報が返されない場合はPromiseがrefectされ、NotAllowedErrorが返されます。

NavigatorUAData.getHighEntropyValues() - Web APIs | MDN