Программа Chrome по сокращению User-Agent заморозила минорную версию, версию ОС и модель устройства в строке UA. Что изменилось, почему и чем заменили.
Если строка User-Agent вашего Chrome сообщает Chrome/143.0.0.0, а на странице chrome://version реальная сборка выглядит как 143.0.7499.96, вы не ошиблись ни в том, ни в другом — Chrome действительно перестал сообщать свою точную версию. Это не баг. Это осознанный результат программы Chrome User-Agent Reduction (сокращение User-Agent) — многолетних усилий по урезанию пассивно транслируемой строки UA до малоинформативного стаба, с переносом конкретных деталей в API, требующий явного запроса. Разберём, что именно убрали, чем это заменили и что замороженные значения значат для обнаружения подмены.
Ключевые выводы
- Сокращение User-Agent в Chrome убрало из строки UA три вещи: минорную/сборочную/патч-версию, точную версию ОС и модель устройства.
- Всё, что идёт после мажорной версии, теперь всегда равно
0.0.0: любая сборка Chrome 143 сообщаетChrome/143.0.0.0, каким бы ни был реальный патч-релиз. Строки ОС для десктопа заморожены до фиксированных значений — например,Windows NT 10.0для всех версий Windows начиная с 10. - Модель устройства Android заменена на общий заполнитель
K, а сообщаемая версия Android заморожена на10, независимо от реального устройства и сборки ОС. - Убранные детали никуда не делись — они переехали в User-Agent Client Hints (UA-CH), которые раскрываются только по явному запросу сервера.
- Поскольку замороженный UA больше не меняется вместе с реальными обновлениями, расхождение между ним и реальной, определённой через feature-detection версией движка браузера становится более сильным сигналом подмены, а не более слабым.
Что именно убрали
Согласно справке MDN по сокращению User-Agent, сокращение в Chrome нацелено ровно на три поля:
- Точная версия платформы/ОС — больше не ваша реальная версия Windows, конкретный релиз macOS или версия Android.
- Модель устройства — строки с моделью телефона/планшета Android убраны.
- Минорная версия браузера — значение имеет только мажорная версия Chrome; всё после неё обнуляется.
Значения замены фиксированные, а не приблизительные — каждое устройство на данной платформе сообщает идентичную строку:
| Платформа | Замороженное значение |
|---|---|
| Windows | Windows NT 10.0; Win64; x64 (и для Windows 10, и для 11) |
| macOS | Macintosh; Intel Mac OS X 10_15_7 |
| Linux | X11; Linux x86_64 |
| ChromeOS | X11; CrOS x86_64 14541.0.0 |
| Android | Android 10; K (реальная модель устройства заменена буквой K) |
Эффект хорошо виден на реальном сравнении до и после. Раньше настоящий UA Chrome на Android мог выглядеть так:
Mozilla/5.0 (Linux; Android 16; Pixel 9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.7499.96 Mobile Safari/537.36
После сокращения то же устройство сообщает вот это:
Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Mobile Safari/537.36
Реальная версия Android 16 и название модели Pixel 9 исчезли, а всё, что шло после мажорной версии — 0.7499.96, — схлопнулось в 0.0.0. Мажорная версия (143) сохранена, потому что сайтам она действительно нужна для проверки совместимости: это единственная деталь версии, которая всё ещё передаётся пассивно, и она по-прежнему растёт с каждым обновлением Chrome.
Почему Google заморозил, а не просто удалил
Оригинальное объявление в Chromium Blog за 2021 год описало сразу два изъяна строки UA: она пассивно раскрывала массу идентифицирующей информации при каждом запросе, независимо от того, спрашивал ли об этом хоть один скрипт, а её неструктурированный, свободный формат делал её головной болью для поддержки — браузеры не могли безопасно менять её, потому что сайты полагались на сопоставление подстрок в ней. Простое удаление полей мгновенно сломало бы все скрипты, полагающиеся на UA-сниффинг. Заморозка их до фиксированных, общих для всех значений сохраняет формат строки нетронутым (старые парсеры не падают), но делает конкретные значения бесполезными как идентифицирующий сигнал, потому что теперь миллионы никак не связанных устройств выдают побайтово одинаковую строку.
Выкатку намеренно растянули на длинную череду релизов Chrome — сначала origin trial, затем поэтапный отказ от старого поведения, сперва на десктопе и только потом на Android, — именно для того, чтобы у сайтов, зависящих от детальных данных UA (модель устройства, точная сборка ОС, точная минорная версия), было достаточно времени мигрировать на явную альтернативу до того, как старое поведение исчезнет окончательно.
Куда переехали убранные детали
Ничего просто не выбросили — Chrome построил параллельный канал именно для этой информации: User-Agent Client Hints (UA-CH). Там, где старый UA транслирует всё по умолчанию, UA-CH переворачивает модель: небольшой набор низкоэнтропийных подсказок (бренд, флаг мобильности, имя платформы) по-прежнему уходит автоматически, но высокоэнтропийные данные, убранные сокращением, — полные номера версий, точная версия ОС, модель устройства — теперь раскрываются только когда сервер отправляет заголовок Accept-CH с явным запросом, а на клиенте читаются через navigator.userAgentData.getHighEntropyValues(). Информация никуда не делась — просто больше не отдаётся добровольно любому серверу, который ничего не спросил.
Почему ломаются сайты и скрипты
Любой код, который парсил строку UA ради деталей глубже уровня «какой браузер, примерно какая мажорная версия, мобильный или десктоп», теперь получает устаревшие или неверные ответы. Библиотеки определения устройств, ветвившиеся по строке модели Android, аналитика, логировавшая точный номер сборки ОС, или QA-инструменты, доверявшие navigator.userAgent для точной проверки версии — всё это тихо деградирует: они не выдают ошибок, а просто молча начинают возвращать всем пользователям 0.0.0 и K. В этом и заключается компромисс: реальный выигрыш в приватности (заметно уменьшенная пассивная поверхность фингерпринтинга при каждом запросе) оплачивается техдолгом на совместимость, который ложится на тех, кто не успел мигрировать на UA-CH.
Взгляд с точки зрения обнаружения: замороженный UA говорит меньше — в обе стороны
Для фингерпринтинга и обнаружения подмены у сокращения есть любопытный побочный эффект. Раньше патч-версия UA двигалась вперёд с каждым реальным обновлением, поэтому явно устаревшая заявленная версия была слабой, но всё же зацепкой. Теперь сокращённый UA должен выглядеть статичным: то, что хвост 0.0.0 не меняется от патча к патчу, совершенно нормально, а свежая установка и браузер, не обновлявшийся месяцами, по одной лишь строке неразличимы. Это убирает один слабый сигнал, но не убирает те, что действительно важны: страница по-прежнему может через feature-detection спросить у JavaScript-движка, какой рендеринг-движок и версию он реально запускает, совершенно независимо от того, что заявляет замороженная строка UA. Если UA браузера заявляет Chrome 143, а его реальная, определённая через feature-detection версия движка явно старше, новее или вовсе принадлежит другому семейству движков — это как раз то противоречие, которое разбирается в статье как обнаружить подмену user-agent. Инструмент проверки движка браузера от BrowserInsight запускает именно такую проверку через feature-detection и показывает её рядом с заявленным UA, чтобы вы сразу увидели, совпадают ли они.
Проверьте сами
Откройте DevTools и выполните navigator.userAgent. Если у вас свежий Chrome (или любой современный браузер на Chromium), всё после мажорной версии должно быть 0.0.0 — сравните это с четырёхчастным номером сборки на chrome://version, и вы увидите ровно то, что было скрыто. На Android проверьте, отображается ли токен устройства как K вместо реальной модели. Затем сравните это с реальной версией движка через проверку движка браузера от BrowserInsight — она определяет ваш настоящий движок рендеринга независимо от того, что заявляет (теперь уже замороженная) строка UA.
Часто задаваемые вопросы
Firefox и Safari тоже заморозили свои строки User-Agent?
Нет, сокращение — программа, специфичная для Chromium; Firefox и Safari по-прежнему отправляют традиционные, несокращённые строки UA. Замороженные значения, описанные здесь, применяют только браузеры на базе Chromium (Chrome, Edge, Brave, Opera и другие).
Применяется ли сокращение User-Agent к Chrome на iOS?
Нет. Chrome на iOS обязан использовать движок Apple WebKit, а не собственный движок Chromium Blink, и сокращение было ограничено Chrome на Blink — оно не распространяется ни на Chrome для iOS, ни на Android WebView: оба сохраняют традиционные строки UA.
Сломается ли мой сайт из-за этого?
Только если он читает детальные поля UA — точную сборку ОС, модель устройства или минорную версию браузера — напрямую из navigator.userAgent или HTTP-заголовка. В этом случае перейдите на User-Agent Client Hints, которые по-прежнему предоставляют эти детали по явному запросу. Код, проверяющий только семейство браузера и мажорную версию, не затронут.
Замороженная версия 0.0.0 сама по себе подозрительна?
Нет — это ожидаемое значение по умолчанию для каждого реального, актуального браузера на Chromium сегодня, само по себе оно не несёт сигнала. Подозрительно, когда замороженный UA расходится с другими независимо определёнными сигналами — например, реальной, определённой через feature-detection версией движка браузера или его данными client hints.
Заключение
Сокращение User-Agent — тихий, но осознанный компромисс: Chrome сохранил формат строки UA, чтобы ничего катастрофически не сломать, заменив при этом каждое конкретное, идентифицирующее значение внутри неё на несколько фиксированных строк, общих для миллионов устройств. Детали никуда не исчезли — они переехали в User-Agent Client Hints, API, раскрывающий информацию только по явному запросу. Для тех, кто занимается фингерпринтингом или анализом подмены, практический вывод таков: сама по себе строка UA теперь почти не заслуживает доверия; важно другое — согласуется ли она с сигналами, которые подделать куда сложнее.
Рекомендуем прочитать:


