[РЕДАКТИРОВАТЬ] 23.03.2020 - Блог и демоверсия были обновлены в соответствии с новыми изменениями, внесенными в Chrome Canary версии 83.0.4093.0.

Несколько недель назад Google объявил, что старая добрая строка пользовательского агента будет прекращена в браузере Chrome в конце этого года.

Для тех, кто не знаком с концепцией, User Agent (UA) - это строка, содержащая информацию и подробности о браузере клиента и платформе, на которой он работает. Эта информация содержит программное обеспечение браузера пользователя и его версию, операционную систему и даже архитектуру и модель платформы. UA включается в каждый запрос, который отправляется браузером и зависит от многих сайтов различными способами и для различных целей. Веб-приложения используют его, чтобы обслуживать клиентов в соответствующем формате сайта, оптимизированном для настольных или мобильных устройств, а также для настройки содержимого страницы в соответствии с браузером клиента и т. Д. Во многих случаях сторонние группы, такие как компании, занимающиеся рекламными технологиями или поставщики средств безопасности, также используют строку UA для снятия отпечатков пальцев и отслеживания конечных пользователей.

Что именно это за изменение?

Поэтапный отказ Google от использования агента пользователя является частью проекта Google Sandbox, целью которого является усиление конфиденциальности конечных пользователей при работе в Интернете. Здесь важно отметить, что поэтапный отказ от UA не остановит и не заблокирует возможность отслеживать и собирать информацию о браузере и платформе конечных пользователей, но сделает его более безопасным и легким для отслеживания.

Google планирует постепенно сокращать объем информации, которая будет храниться в строке UA, в течение следующего года. Сначала в Chrome версии 81 (март 2020 г.) Google начнет показывать предупреждения консоли для доступа к пользовательскому агенту JavaScript (например, navigator.userAgent). Через три месяца после этого в Chrome версии 83 Google заморозит строку User-Agent и двусмысленно укажет версию платформы ОС (конкретные версии ОС больше не будут упоминаться, поэтому, например, Windows 7 и Windows 10 будут отображаться только как Windows). Наконец, в Chrome версии 85 (сентябрь 2020 г.) Google дополнительно унифицирует UA, упоминая только программное обеспечение браузера и тип устройства (например, Chrome на рабочем столе, Chrome на мобильном устройстве).

Технически - как получить недостающие данные UA?

Два разных метода заменят доступ к строковой информации User-Agent - первый обеспечит замену заголовка User-Agent, а второй - к navigator.userAgent в JavaScript.

[!] На момент написания этой статьи эти изменения не реализованы по умолчанию в версиях Chrome Stable (v79) и Chrome Canary (v82). Чтобы включить изменения в браузере Chrome, перейдите к chrome: // flags / # enable-experimental-web-platform-features и включите флаг. В версии Canary вы также можете включить флаг chrome: // flags / # freeze-user-agent.

[Edit] 23/03/2020: В настоящее время изменения реализованы только в Canary версии Google Chrome.

Замена агента пользователя на основе заголовка

Google Chrome предоставит информацию UA с заголовками Client Hints.

Механизм клиентских подсказок позволяет веб-сайтам и веб-серверам запрашивать конкретную информацию о клиенте и конечном пользователе. Веб-сервер отвечает на запросы клиента заголовком «Accept-CH», содержащим необходимую информацию в качестве значения заголовка.

Клиент со своей стороны отвечает заголовком «sec-ch-something», который содержит запрошенную информацию в качестве значения заголовка. Каждый информационный элемент будет отправлен с другим заголовком, где «что-то» заменяется типом запрошенной информации (см. Примеры ниже).

В отличие от строки User-Agent, которая отправляется по умолчанию с каждым запросом и содержит всю информацию клиента, независимо от того, действительно ли она нужна серверу или нет, подсказки клиента требуют, чтобы сервер активно запрашивал эту информацию, что делает возможным для браузеров, чтобы контролировать серверы, запрашивающие его.

Важно отметить, что эти заголовки поддерживаются только по протоколу HTTPS, что делает его более безопасным и безопасным.

Кроме того, необходимо отметить, что сторонние поставщики должны будут получить разрешение от первого владельца домена для сбора информации. Это изменение имеет решающее значение для сторонних поставщиков, таких как компании, занимающиеся безопасностью или рекламой, которые используют User-Agent для снятия отпечатков пальцев конечного пользователя. Делегирование должно быть реализовано, как описано здесь.

Реализация клиентских подсказок

Чтобы реализовать заголовки Client Hints, сначала настройте свой веб-сервер для отправки клиенту заголовка «Accept-CH» с точной информацией, которую вы хотите собрать (см. Подробное описание ниже). Вы также можете установить «Accept-CH-Lifetime», который указывает постоянство значения заголовка Accept-CH в течение заданного количества секунд, чтобы клиент отправлял на сервер подсказки клиента для каждого запроса, сделанного к тому же самому. домен, даже если заголовок «Accept-CH» не отправляется для каждого запроса в течение этого периода времени.

На стороне клиента браузер будет включать заголовки «Sec-CH-something», в которых хранится информация, запрошенная сервером.

Допустимые значения Accept-CH

Заголовок Accept-CH принимает следующие значения: UA, UA-Platform, UA-Arch, UA-Model, UA-Mobile, UA-Full-Version.

Accept-CH: UA- Основной, запрашивающий программное обеспечение браузера и его версию. Ответ будет отправлен в заголовке «sec-ch-ua».

Accept-CH: UA   // Response header
sec-ch-ua: "Google Chrome"; v="83" // Request Header

Accept-CH: UA-Platform- Предоставляет серверу информацию о платформе, на которой работает браузер. Ответ будет отправлен в заголовке «sec-ch-ua-platform».

Accept-CH: UA-Platform   // Response header
sec-ch-ua-platform: "Windows"; v="10.0; " // Request header

Accept-CH: UA-Arch- Предоставляет серверу информацию об архитектуре платформы, на которой работает браузер. Ответ будет отправлен в заголовке «sec-ch-ua-arch».

Accept-CH: UA-Arch   // Response header
sec-ch-ua-arch: Win64; x64   // Request header

Accept-CH: UA-Model- Предоставляет серверу информацию о конкретной модели устройства, на котором работает браузер. Этот больше подходит для мобильных устройств. Этот заголовок в настоящее время поддерживается, но может быть удален в окончательной версии этой функции, поскольку Google еще не решил, действительно ли предоставление точной модели устройства действительно необходимо и не рассматривается как конфиденциальная информация. Ответ будет отправлен в заголовке «sec-ch-ua-model».

Accept-CH: UA-Model   // Response header
sec-ch-ua-model: Pixel 3   // Request header

Accept-CH: UA-Mobile- Указывает, запущен ли браузер на мобильном устройстве или нет. Ответ будет отправлен в заголовке «sec-ch-ua-mobile» и вернет два значения: 1, если устройство является мобильным, и «? 0», если нет.

Accept-CH: UA-Mobile   // Response header
sec-ch-ua-mobile: ?0   // Request header

Accept-CH: UA-Full-Version- Возвращает полную версию браузера. Ответ будет отправлен в заголовке «sec-ch-ua-full-version».

Accept-CH: UA-Full-Version // Response header
sec-ch-ua-full-version: "83.0.4092.0"   // Request header

Интерфейс JavaScript

В дополнение к интерфейсу Client Hints, Google Chrome также предоставит интерфейс JavaScript, который будет предоставлять информацию пользовательского агента клиентскому JavaScript. Новый API будет доступен под объектом navigator и будет предоставлять ту же информацию, что и заголовки Client Hints.

Новый API можно разделить на две части: первая предназначена для низких значений энтропии, а вторая - для высоких значений энтропии.

Низкие значения энтропии показывают, использует ли клиент мобильное устройство или нет, а также бренд браузера и его основную версию. Ко всей остальной информации можно получить доступ с помощью новой специальной асинхронной функции с именем navigator.userAgentData.getHighEntropyValues ​​(), которая возвращает обещание. После успешного выполнения обещания будет возвращен объект, содержащий всю необходимую информацию.

Обратите внимание, что интерфейс JavaScript будет доступен только на страницах HTTPS, как и заголовки Client Hints.

Пример:

// Low entropy values
navigator.userAgentData.mobile; // false
navigator.userAgentData.uaList; // [{ "brand": "Google Chrome", "version": "83" }]
// High entropy values
navigator.userAgentData.getHighEntropyValues([
 "platform",
 "platformVersion",
 "architecture",
 "model",
 "uaFullVersion"
]).then(res => console.log(res)); 
// Output
 { "architecture":"Win64; x64",
   "model":"",
   "platform":"Windows",
   "platformVersion":"10.0; ",
   "uaFullVersion":"83.0.4096.0"
 }

Заключение, примечания и демонстрация

Предстоящий отказ от UA состоится позже в этом году. С моей точки зрения, строка пользовательского агента - это старое решение, которое по умолчанию предоставляет слишком много информации о конечных пользователях, но также является краеугольным камнем современного Интернета, где на нее полагается почти каждое веб-приложение. Это изменение обеспечит улучшенные возможности мониторинга, позволит нам узнать, кто использует эту информацию, и, в конечном итоге, улучшит конфиденциальность конечных пользователей.

Кроме того, с точки зрения безопасности - спуфинг пользовательского агента в настоящее время является очень простым и простым методом, позволяющим мошенникам и ботам подделывать свой браузер и платформу устройства, чтобы легко имитировать своих жертв или реальных пользователей. Новая реализация, конечно же, не будет защищенной от обхода, но потребует от мошенников и разработчиков ботов усерднее работать, чтобы спрятаться и выдать себя за других.

Как упоминалось выше, важно отметить, что эта функция в настоящее время считается экспериментальной, и ее реализация может быть изменена в следующих версиях Chrome.

Наконец, я написал очень простое веб-приложение, реализующее эти изменения, вы можете найти его здесь: https://ua-phaseout.herokuapp.com/ (не забудьте включить Chrome заранее флаги!).