GoogleChromeで、UserAgentが使えなくなります
2020年1月14日、Googleは、GoogleChromeのUserAgentを非推奨とし、段階的にUserAgent文字列の提供をやめるという計画を発表しました。
https://gigazine.net/news/20200115-chrome-phase-out-user-agent-strings/
(gigazine参考)
今後、2021年を目処に、PCやSPなどのデバイスの種類・OSのバージョンを問わず、同じUserAgent文字列が返却されるようになるとのことです。(当初発表時は、2020年9月を目処にする予定でしたが、コロナウイルスの影響で延期になりました。)
UserAgentとは
UserAgentとは、ブラウザがWebサーバーにデータを取りに行く際にサーバーに対して自動的に通知している、ブラウザの種類やバージョンやOSの種類やバージョンなどの情報を組み合わせた識別子です。
例えば、
Macの場合、
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
iPhoneの場合、
Mozilla/5.0 (iPhone; CPU iPhone OS 13_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/77.0.3865.69 Mobile/15E148 Safari/605.1
このような識別子になります。この識別子があるおかげで、端末の種類、OSのバージョン、利用しているブラウザを把握することができています。
一体なぜ
・個人の特定ができないようにするため
近年、インターネット上のプライバシー保護が進んできており、例えば、AppleのITP(Intelligent Tracking Prevention)、IDFA(Identifier for Advertisers)、あとは、EU圏のGDPR(General Data Protection Regulation)、など、インターネットの世界における統制が進められてきています。
一方で、AppleやGoogleが本格的に、3rdPartyCookieの排除に乗り出し始め、Cookieによるユーザーの特定がどんどん難しくなっている中、Cookieを使わないでユーザーを特定する方法を模索する人たちが一定います。多くで言えば、DMPや広告で活躍するプレイヤーが当てはまるのではないでしょうか。こういったプレイヤーは、IDFA、1stPartyCookie、3rdPartyCookieをキーにしたユーザ推定技術を使っていたり、フィンガープリントと呼ばれるブラウザから取得できる情報のうち、単体では何気ない情報を複数組み合わせることにより個人を特定する手法を使って、ユーザを特定しています。
そういった場合に、UserAgentは個人を特定しようとする際に重要な判断材料になってしまう可能性があり、このため、PCやSPなどのデバイスの種類・OSのバージョンを問わず、同じUserAgent文字列を返すようにすることで個人を特定できないようにしたいようです。
いつ使えなくなるか
当初は、2020年9月を予定していました。
しかし、コロナウイルスの影響を踏まえて、2021年を目処にしておりますが、まだ確定していないようです。
https://groups.google.com/a/chromium.org/forum/m/#!msg/blink-dev/-2JIRNMWJ7s/u-YzXjZ8BAAJ
どう対応するべきか
User-Agent Client Hints が代替手段として提供されます
従来のUserAgentと同じようにHTTPリクエストヘッダーやJavascriptを使って情報を取得することが可能です。現在、GoogleChromeでは実験的な機能として試すことができますので、簡単に使い方を紹介したいと思います。
User-Agent Client Hintsを有効にする
chrome://flags/ から、Experimental Web Platform featuresを有効にすることで使用できます。Chrome79以降だと使えますので、設定してみてください。
Chromeを再起動したあと、Chrome デベロッパーツールを開きます。
Network>Doc>Headersタブを開いてRequest Headersの箇所を見ると、sec-ch-uaの項目が取得されているのが分かると思います。
javascriptで取得する
Javascriptだと Chromeにnavigator. userAgentData()が使えます。
const ua = navigator.userAgentData;
console.log(ua.mobile);
// true
console.log(ua.brands[0].brand);
// Google Chrome
console.log(ua.brands[0].version);
// 84
上記のように書くことで取得できるようです。
さらに詳細な情報を取得したい場合は、getHighEntropyValues関数を実行します。この関数はPromiseを返却するため、非同期での実行が必要となります。
const uaData = navigator.userAgentData;
const highEntropyValues = await uaData.getHighEntropyValues(
[
"platform",
"platformVersion",
"architecture",
"model",
"uaFullVersion"
]);
// OS情報
const platform = highEntropyValues.platform;
// OSバージョン情報
const platformVersion = highEntropyValues.platformVersion;
// CPUアーキテクチャ情報
const architecture = highEntropyValues.architecture;
// デバイスモデル
const model = highEntropyValues.model;
// ブラウザーのビルドバージョン
const uaFullVersion = highEntropyValues.uaFullVersion;
このように置き換わってくることが想定されます。