← Назад к блогу

Миграция на 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 / ?1
  • Sec-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, версии платформ заморозятся, а определение мобильных устройств по поиску подстроки станет ненадёжным. Путь миграции прямолинеен:

  1. Предпочитайте структурированные подсказки с низкой энтропией разбору строки UA.
  2. Считайте сокращённую строку UA запасным вариантом только для старых клиентов.
  3. Не поддавайтесь соблазну запросить подсказки с высокой энтропией «на всякий случай»: каждая дополнительная подсказка расширяет вашу поверхность фингерпринтинга и ваши комплаенс-риски.

Более широкий вывод согласуется со всем, что мы строим. Производители браузеров последовательно убирают пассивную энтропию с веб-платформы. Правильный ответ — не гнаться за ней через новые API, а проектировать измерение, которому она никогда и не была нужна.

Sources

Comments

Loading comments…