Строки User-Agent и Client Hints: что они раскрывают и что было заморожено

Строка user agent — самый старый идентификационный сигнал в вебе и тот, что сильнее всего изменился за последние годы. Чтобы читать её правильно, нужно знать, что в ней осталось, что было намеренно заморожено и куда делись убранные подробности.
Что говорит строка
Актуальная строка Chromium в Windows выглядит так: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/154.0.0.0 Safari/537.36. Исторические токены (Mozilla/5.0, AppleWebKit, like Gecko, Safari) нужны для совместимости со скриптами, написанными десятилетия назад, и информации не несут. Полезны платформа (Windows NT 10.0, даже в Windows 11), архитектура и основная версия браузера.
То, что раньше там было, убрали намеренно. Вторичная и патч-версия теперь 0.0.0. Версия Windows зафиксирована на 10.0. Строки Android больше не содержат модель устройства. Это «сокращение user agent», которое Chromium внедрил в 2022–2023 годах именно потому, что строка превратилась в источник отпечатков.
Client Hints: те же данные по запросу
Убранные подробности не исчезли, они переехали в User-Agent Client Hints. Сервер может запросить конкретные поля заголовком Accept-CH, и тогда браузер будет отправлять заголовки вроде Sec-CH-UA-Platform-Version или Sec-CH-UA-Model в последующих запросах. Подсказки с низкой энтропией (бренд и основная версия, платформа, признак мобильного устройства) отправляются по умолчанию. Подсказки с высокой энтропией (полная версия, архитектура, разрядность, модель, версия платформы) отправляются только сайтам, которые их запрашивают, а скрипт может запросить тот же набор через navigator.userAgentData.getHighEntropyValues().
Цель такого дизайна в том, чтобы сайт должен был заявить, что ему нужно, а значит, сбор становится видимым и подлежащим аудиту. На практике сайт, которому нужен отпечаток, по-прежнему может запросить всё; разница в том, что запрос — это то, что браузер видит, может записать или отклонить.
Проблема согласованности
Поскольку одни и те же факты теперь доступны из двух источников, их можно сравнить. Браузер, который меняет строку user agent на macOS, но оставляет в navigator.userAgentData.platform значение Windows, создал противоречие, которое тривиально обнаружить. То же относится к свойству navigator.platform, шрифтам, специфичным для ОС и видимым странице, и строке рендерера WebGL, называющей графический драйвер, который существует только в одной операционной системе. Подмена одной лишь строки уже много лет проигрышная стратегия.
Чтение собственных данных
Диагностика показывает исходную строку, браузер и версию, которые из неё извлекаются, и движок (Blink, Gecko или WebKit). Учтите, что все браузеры в iOS сообщают WebKit, что бы ни говорил бренд, потому что этого требует Apple. Если определённое название браузера вас удивляет, строка изменена расширением или настройкой профиля; проблема это или нет, зависит от того, согласуется ли с этим изменением остальной браузер.


