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

Раньше для этого можно было использовать только строку User‑Agent, которую браузер отправляет автоматически, но её избыточность и сложность парсинга стали сдерживать развитие веба. Client Hints предлагает другой подход: вместо того чтобы сразу раскрывать всю информацию, браузер передаёт только те данные, которые действительно нужны сайту.

На связи Степан из команды Яндекс Браузера. Сегодня поговорим о том, как мы переходим от устаревшего User‑Agent к современной технологии Client Hints. В статье разберём, почему User‑Agent стал проблемой, как работают хинты под капотом и какие перспективы у перехода на новую технологию.


Как User-Agent превратился в проблему

User‑Agent — это строка, которую браузер отправляет сайтам, сообщая название, версию и ОС. Изначально User‑Agent был простым и понятным — первая версия Mosaic в начале 90-х отправляла всего лишь Mosaic/1.0. Но спустя несколько лет UA превратился в монстра:

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 OPR/38.0.2220.41

Каждый новый элемент в User‑Agent добавлялся как временное решение для совместимости. Сначала Netscape добавил Mozilla, затем Internet Explorer включил его, чтобы сайты принимали его за Netscape. Позже Chrome добавил упоминания WebKit и Safari, чтобы обходить проверки, а Opera сохранил все эти префиксы для работы со старыми сайтами. В результате браузеры десятилетиями таскали за собой этот исторический багаж.

Мы в Яндекс Браузере тоже следовали этой практике: добавляли в User‑Agent информацию о приложении (YaBrowser/, YaApp_Android/, BroPP/, YaSearchApp/) и полную версию с номером сборки, чтобы обеспечить совместимость с различными сайтами.

Теперь User‑Agent сложно парсить, он нарушает приватность, помогая трекерам, и часто приводит к ошибкам — например, при замене User Agent в Firefox на версию 100 на Netflix просто переставали воспроизводиться видео. Или, например, при замене в UA версии Chrome на 100 перестали работать все сайты, созданные при помощи конструкторов сайтов Duda и Yell Business. В какой‑то момент WhatsApp Web некорректно блокировал некоторые браузеры, требуя «Google Chrome 60 и новее» даже в последней версии.

Для решения описанных выше проблем команда Chromium предложила инициативу — User‑Agent Reduction. Это поэтапное сокращение объёма данных, которые браузер передаёт сайтам через User‑Agent. В рамках этого проекта разработчики решили зафиксировать версии операционных систем (например, все версии Windows теперь отображаются как 10.0), а также убрать детали вроде архитектуры процессора (x64/ARM) и точных номеров сборок. 

Яндекс Браузер соответствует этим изменениям: в User‑Agent наших пользователей передаётся только информация о платформе, версии браузера и ядра — без номеров сборок.

Но заморозка User‑Agent не решает другую проблему: сайтам по‑прежнему приходится гадать, какие возможности есть у браузера. 

Client Hints: в чём плюсы решения?

Client Hints — современная замена User‑Agent, в ней сайты запрашивают только нужные данные о браузере (например, версию или тип устройства).

Когда вы заходите на сайт, сервер сначала отправляет браузеру список необходимых ему параметров через HTTP‑заголовок Accept‑CH. Например, сайт может запросить только версию браузера и тип устройства — мобильное или десктопное. Браузер анализирует этот запрос и в последующих обращениях к серверу добавляет только запрошенные данные в виде структурированных заголовков. При этом для доступа к некоторым чувствительным данным, например точной модели устройства, требуется явное разрешение пользователя.

Пример взаимодействия с сервером

Сервер запрашивает нужные данные через HTTP‑заголовки:

Accept-CH: Sec-CH-UA, Sec-CH-UA-Mobile, Sec-CH-UA-Platform

Браузер отвечает в последующих запросах:

Sec-CH-UA: "Yandex Browser";v="24", "Chromium";v="120"
Sec-CH-UA-Mobile: ?1
Sec-CH-UA-Platform: "Android"

Полный цикл запроса:

Client -> Server: GET / (без CH)
  Server -> Client: 200 OK + Accept-CH
  Client -> Server: GET / (с CH)
  Server -> Client: 200 OK (оптимизированный контент)

Яндекс Браузер полностью поддерживает эту технологию, работая по тому же принципу, что и Chromium, но дополнительно сообщает информацию о версии — без номера сборки — в заголовке Sec‑CH‑UA.

Critical-CH

Иногда данные о браузере критически важны для первоначальной отрисовки страницы, для таких случаев существует заголовок Critical‑CH. Когда серверу нужны определённые Client Hints прямо с первого обращения, он добавляет в ответ:

Accept-CH: Sec-CH-UA-Platform, Sec-CH-UA-Mobile
Critical-CH: Sec-CH-UA-Mobile

При получении ответа с заголовком Critical‑CH браузер прерывает текущую загрузку, повторно отправляет запрос с указанными Client Hints и только затем получает окончательную, оптимизированную, версию страницы.

ACCEPT_CH ALPS TLS extension

Можно заметить, что в каждой из вышеописанных схем сервер получает необходимые ему Сlient Hints только после первого HTTP‑запроса, что создаёт задержку. Решение — ALPS TLS extension для ACCEPT_CH.

Браузер подключается к серверу, во время TLS‑рукопожатия сервер отправляет ACCEPT_CH со списком нужных хинтов:

TLS Handshake:
  ServerHello
  ACCEPT_CH: Sec-CH-UA-Platform, Sec-CH-UA-Mobile

Браузер запоминает эти требования и сразу добавляет указанные хинты в первый же HTTP‑запрос:

Sec-CH-UA-Platform: "Windows"
Sec-CH-UA-Mobile: ?0

GREASE и «шум» в Sec-CH-UA

Из‑за строгих или неправильно написанных скриптов для распознавания браузеров на сайтах, браузеры часто вынуждены подменять строку User‑Agent. Чтобы такого не случилось с Client Hints, в заголовке Sec-CH-UA используется GREASE (Generate Random Extensions And Sustain Extensibility) — браузер всегда добавляет в список брендов случайно выбранные несуществующие значения и периодически меняет порядок всех элементов в списке.

Например:

Sec-CH-UA: "Not?A_Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"

Здесь "Not?A_Brand";v="8" — это «шум», который нельзя использовать в логике сайта.

А через некоторое время браузер отправит уже такую строку:

Sec-CH-UA: "Chromium";v="120", "Not?A_Brand";v="8", "Google Chrome";v="120"

Такой подход с «шумом» и переменным порядком брендов сделан для того, чтобы сайты корректно разбирали список брендов как набор значений, благодаря чему добавление новой информации в список не повлияло бы на доступность ресурса.

Использование Client Hints для защиты от ботов

Антибот‑системы, в том числе Cloudflare, используют расхождения между User‑Agent и Client Hints для выявления поддельных браузеров — программ, которые маскируются под обычный браузер и нередко используются для сбора данных или накрутки. Антибот‑системы анализируют множество параметров — от регистра заголовков до соответствия данных в разных заголовках. Например, если в User‑Agent указана Windows, а в Client Hints лежит Linux — это явный признак бота.

Ограничения Client Hints

Client Hints не идеальны. Firefox до сих пор поддерживает их лишь частично, некоторые старые сайты не поддерживают новые заголовки. Разработчикам приходится переписывать логику детекции: принимать новые заголовки вроде Sec-CH-UA, проверять их отдельно и параллельно сохранять обработку User‑Agent для совместимости со старыми браузерами.

Кроме того, несмотря на теоретическую возможность ускорить загрузку, отправляя ACCEPT_CH при TLS‑рукопожатии, на практике большинство сайтов этим не пользуются. Из‑за этого для отображения сайта требуется два HTTP‑запроса вместо одного, что увеличивает задержку.

Поэтому полный отказ от User‑Agent может откладываться ещё долго.


Client Hints постепенно приходит на смену устаревшему User‑Agent, предлагая более удобный и гибкий способ обмена данными. Теперь сайты могут запрашивать только ту информацию о браузере, которая им действительно необходима, а не получать всё сразу в одной громоздкой строке. Такой подход гораздо лучше защищает приватность пользователей.

В Яндекс Браузере мы уже поддерживаем этот стандарт. Хотя некоторые сайты ещё не перешли на новую технологию, вектор развития очевиден: интернет становится удобнее и безопаснее для всех.

Если вы развиваете собственные сайты или сервисы, рекомендуем ориентироваться именно на Client Hints, а не на User‑Agent.

Полезные ссылки

Комментарии (1)


  1. gigimon
    16.12.2025 13:01

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

    Это новый подход накидывает +2 запроса и еще возможную полную перерисовку сайта, кому это надо?