Миграция на User-Agent Client Hints: измеряем устройства без полной строки UA
Chrome сокращает строку User-Agent до замороженной оболочки. Вот как аналитика, ставящая приватность на первое место, считывает сигналы устройства через Client Hints — без фингерпринтинга.
Медленная смерть строки User-Agent
Десятилетиями заголовок запроса User-Agent был рабочей лошадкой аналитики для базовых вопросов: какой браузер, какая ОС, мобильное устройство или десктоп? Он же был и риском с точки зрения фингерпринтинга. Полная строка UA вида Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/xxx.0.0.0 Safari/537.36 выдаёт точные номера версий и подробности о платформе, которые в сочетании с другими сигналами помогают выделить конкретного посетителя.
Инициатива Google по сокращению User-Agent подрезает эту строку уже несколько лет. Сегодня Chrome отправляет сокращённую UA, где версия платформы заморожена, а сегменты младших версий обнулены. Замысел, согласно документации Chrome, — убрать пассивно доступную энтропию, сохранив структурированную замену, работающую по явному запросу: User-Agent Client Hints (UA-CH).
Для всех, кто строит аналитику в 2026 году, практическое следствие очевидно. Разбор устаревшей строки UA ради чего-то большего, чем грубое определение семейства браузера, становится всё менее надёжным — и всё более неверным подходом.
Как на самом деле работают Client Hints
UA-CH разбивает информацию об устройстве на отдельные запрашиваемые подсказки вместо одной плотной строки. Подсказки с низкой энтропией отправляются по умолчанию с каждым запросом:
Sec-CH-UA— список брендов и значимых версийSec-CH-UA-Mobile— булево значение?0/?1Sec-CH-UA-Platform— например,"macOS"
Подсказки с высокой энтропией — полная версия платформы, архитектура, модель, разрядность — не отправляются, пока сервер явно их не запросит. Сервер запрашивает их заголовком ответа Accept-CH, после чего браузер может включать их в последующие запросы. Префикс Sec- означает, что эти заголовки контролируются браузером и не могут быть установлены скриптами, — существенное свойство целостности.
Такая инверсия важна для приватности. Позиция по умолчанию — минимальное раскрытие. Дополнительная энтропия становится осознанным действием, зафиксированным в ваших же заголовках ответа, а не чем-то, что тихо собирается с каждого посетителя.
Как эту перемену читает privacy-first подход
Monoid сознательно остаётся на стороне низкой энтропии. Мы никогда не отправляем Accept-CH, чтобы вытянуть архитектуру, модель или полную версию платформы, и никогда не сводим доступные нам подсказки в устойчивую подпись устройства. Это и был бы фингерпринтинг — восстановление идентификатора из характеристик устройства, — то самое, что сокращение UA призвано предотвратить и что статья 5(3) Директивы ePrivacy и антифингерпринтинговые политики браузеров трактуют как доступ к информации в оконечном оборудовании.
Подсказок с низкой энтропией, приходящих по умолчанию, достаточно для тех вопросов, которые аналитике и следует задавать:
- Семейство и мажорная версия браузера из
Sec-CH-UA— для планирования совместимости и поддержки. - Мобильное или немобильное устройство из
Sec-CH-UA-Mobile— для сегментации вёрстки и Core Web Vitals. - Платформа из
Sec-CH-UA-Platform— для разбивки на уровне ОС.
Принципиально важно: это агрегированные измерения, а не ключи отдельных посетителей. Булево значение и название платформы, общие для миллионов посетителей, сами по себе не несут сколько-нибудь значимой идентифицирующей силы.
Чтение подсказок на edge
Поскольку Client Hints — это обычные заголовки запроса, edge-воркер может прочитать их без единого клиентского скрипта. В Cloudflare подсказки с низкой энтропией приходят во входящем объекте Request:
export default {
async fetch(request) {
const brands = request.headers.get('Sec-CH-UA') || '';
const isMobile = request.headers.get('Sec-CH-UA-Mobile') === '?1';
const platform = request.headers.get('Sec-CH-UA-Platform') || '';
// Выводите только грубые измерения; никогда не сохраняйте составной ключ.
return new Response('ok');
}
};
Обратите внимание на то, чего здесь нет: ни эха Accept-CH, ни запроса подсказок с высокой энтропией, ни хеширования объединённых значений. Значение Sec-CH-UA — структурированный список, так что разбирайте его аккуратно: он содержит намеренные записи брендов «GREASE», призванные отучить от хрупкого разбора по точному совпадению, — приём, позаимствованный спецификацией у TLS.
Что изменить в вашем конвейере
Если ваша аналитика всё ещё гоняет регулярные выражения по полной строке UA, со временем сломаются три вещи. Номера версий сдвинутся к .0.0.0, версии платформ заморозятся, а определение мобильных устройств по поиску подстроки станет ненадёжным. Путь миграции прямолинеен:
- Предпочитайте структурированные подсказки с низкой энтропией разбору строки UA.
- Считайте сокращённую строку UA запасным вариантом только для старых клиентов.
- Не поддавайтесь соблазну запросить подсказки с высокой энтропией «на всякий случай»: каждая дополнительная подсказка расширяет вашу поверхность фингерпринтинга и ваши комплаенс-риски.
Более широкий вывод согласуется со всем, что мы строим. Производители браузеров последовательно убирают пассивную энтропию с веб-платформы. Правильный ответ — не гнаться за ней через новые API, а проектировать измерение, которому она никогда и не была нужна.
Comments
Loading comments…