Get your free and exclusive +45-page Authentication Analytics Whitepaper
Вернуться к обзору

Client Hints и User-Agent в Chrome, Safari и Firefox

Узнайте о поддержке API User-Agent и Client Hints в Chrome, Safari и Firefox, а также о том, как мы используем их для ключей доступа и определения устройств в компонентах JavaScript.

Vincent Delitz
Vincent Delitz

Создано: 2 июля 2024 г.

Обновлено: 27 июля 2026 г.

Client Hints и User-Agent в Chrome, Safari и Firefox

Эта страница переведена автоматически. Прочитайте оригинальную версию на английском здесь.

PasskeysCheatsheet Icon

Шпаргалка по Passkeys. Практические рекомендации, шаблоны внедрения и KPI для программ passkeys.

Получить шпаргалку
Ключевые факты
  • Сокращение User-Agent завершено во всех основных браузерах: Chrome и Edge с 2023 года, Firefox частично и Safari заморожен с iOS 26, выпущенной в сентябре 2025 года.
  • Firefox не поддерживает Client Hints или navigator.userAgentData, требуя от разработчиков возвращаться к классическому парсингу строки User-Agent в браузере Mozilla.
  • JavaScript API getHighEntropyValues() получает доступ к данным устройства с высокой энтропией только в браузерах на базе Chromium. В Safari и Firefox этот API полностью отсутствует.
  • Различие между Windows 10 и Windows 11 невозможно только с помощью строк User-Agent. Только Client Hints в Chrome и Edge могут раскрыть фактическую версию платформы.
  • Corbado использует Client Hints для аналитики ключей доступа (passkey intelligence): обнаружение новых устройств и оценка пригодности кросс-устройственной аутентификации, в частности, для различия версий Windows.

1. Введение: Что такое Client Hints и сокращение User-Agent?#

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

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

Ключевые моменты, которые мы рассмотрим:

  • Что такое сокращение User-Agent: Понимание перехода к сокращенным строкам User-Agent и его последствий.
  • Как работают Client Hints: Изучение механизмов работы Client Hints и того, как они могут быть эффективно реализованы.

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

Эта статья призвана предоставить всеобъемлющий обзор этих изменений, предлагая идеи и практические рекомендации, которые помогут разработчикам в случае, если их вариант использования или программное обеспечение зависят от деталей устройства или операционных систем (например, детальное управление устройствами, обнаружение известных устройств, предотвращение мошенничества или другие обнаружения функций) или, как в нашем собственном случае, оптимизация работы с ключами доступа с помощью User-Agent и Client Hints.

Прежде чем мы углубимся в технические детали Client Hints, мы кратко рассмотрим историю User-Agent и то, как работают различные усилия по сокращению User-Agent.

1.1 Краткая история User-Agent#

Историю строк User-Agent можно проследить до создания ранних веб-браузеров. Тим Бернерс-Ли разработал первый веб-браузер, WorldWideWeb (позже переименованный в Nexus) в 1990 году. Вскоре за ним последовали другие новаторские браузеры, такие как Line Mode Browser в 1991 году, а затем появились такие браузеры, как MidasWWW, ViolaWWW, Erwise и Cello.

Считается, что в 1993 году выпуск NCSA Mosaic, который часто называют просто Mosaic, спровоцировал первоначальный всплеск популярности Интернета. Строка User-Agent Mosaic была довольно простой, обычно в формате NCSA_Mosaic/1.0, содержащей название продукта, за которым следовала необязательная косая черта и номер версии.

Изначально поле User-Agent было введено для аналитических целей и помощи в выявлении проблем. Было прямо рекомендовано, что это поле "должно быть включено" в HTTP-запросы, как отмечается в HTTP-архиве W3C 1992 года. Это простое поле обеспечивало простой, но эффективный способ передачи названия и версии продукта, помогая в понимании и устранении проблем, связанных с браузером.

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

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

1.2 Введение в сокращение User-Agent и Client Hints#

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

1.2.1 User-Agent в Safari#

В 2017 году Apple инициировала движение по сокращению User-Agent знаменитым постом в Twitter, объявив, что Safari заморозит строку User-Agent в Safari Technology Preview 46 (STP 46) с целью борьбы с фингерпринтингом и повышения конфиденциальности.

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

1.2.2 User-Agent в Chrome (+ Edge)#

В 2019/2020 годах Google объявила о планах снизить степень детализации строк User-Agent в Chrome, представив User-Agent Client Hints (UA-CH) как гибкий и контролируемый способ запроса конкретной информации о браузере и устройстве. Google начала тестирование сокращения User-Agent в версиях Chrome Canary и Beta, собирая отзывы для обеспечения совместимости и функциональности, и оно было завершено в 2023 году для Android и всех других платформ Chrome. В то же время Chrome представил Client Hints как новый способ доступа к этой информации. Поскольку Microsoft Edge основан на Chromium, Microsoft Edge ведет себя как Chrome на всех платформах.

1.2.3 User-Agent в Firefox#

В 2021 году Mozilla присоединилась к этим усилиям, постепенно снижая степень детализации строки User-Agent, но Mozilla решила не поддерживать Client Hints в Firefox.

1.2.4 User-Agent сегодня (обновлено в сентябре 2025 г.)#

  • Сокращение User-Agent зависит от браузера: Chromium (Chrome, Edge) внедрил полное сокращение UA с поддержкой Client Hints. Однако Safari использует собственный подход к замороженному UA без принятия UA-CH, а Firefox не внедрил navigator.userAgentData. Экосистема остается фрагментированной.

  • Client Hints развивались внутри Chromium: Все браузеры по-прежнему отправляют заголовок User-Agent, но в большинстве из них он заморожен на более старой версии (см. таблицу ниже). Для Chromium можно использовать Client Hints для получения дополнительной информации.

Давайте посмотрим, что браузеры в настоящее время отправляют в качестве User-Agent, в следующей главе.

Substack Icon

Подпишитесь на наш Passkeys Substack, чтобы получать новости.

Подписаться

2. Что такое сокращение User-Agent?#

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

2.1 Что такое классический User-Agent?#

Классическая строка User-Agent обычно включала следующие компоненты, которые можно было использовать для обнаружения функциональности:

Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.2.1.0 Mobile Safari/537.36

  • Операционная система: Название операционной системы (например, Windows, macOS, Linux).
  • Номер версии операционной системы: Конкретная версия операционной системы.
  • Название браузера: Название браузера (например, Chrome, Firefox, Safari).
  • Версия браузера: Конкретная версия браузера.
  • Архитектура: Архитектура системы (например, x86, ARM).
  • Тип/модель устройства: Информация о типе или модели устройства (например, iPhone, Pixel).
  • Дополнительная информация: Сюда могут входить дополнительные сведения, такие как платформа, номер сборки и т.д.

2.1.1 Зачем использовать User-Agent для обнаружения функций?#

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

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

На сегодняшний день это не совсем возможно, так как новые API браузеров для обнаружения функциональности внедряются в разное время и часто существует разный подход между крупными (например, браузеры на базе Chromium) и небольшими командами браузеров (например, Firefox).

2.1.2 Понимание энтропии в фингерпринтинге: Почему предоставление большого количества информации является проблемой?#

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

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

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

  • Информация с высокой энтропией: Такая как конкретные версии браузера и ОС, вносит значительный вклад в уникальность отпечатка пользователя, что облегчает его отслеживание на разных веб-сайтах.
  • Информация с низкой энтропией: Общие названия браузера или операционной системы, предоставляют менее подробные данные и вносят меньший вклад в отслеживание пользователей, поскольку эти комбинации несут больше пользователей.

Помимо User-Agent, существует множество другой информации, которая может быть использована как источник энтропии. Например, вы можете найти различные источники энтропии на https://coveryourtracks.eff.org.

2.2 Уменьшение энтропии User-Agent#

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

2.2.1 Пример 1: Сокращение User-Agent в Chrome#

Ниже вы найдете пример сокращения User-Agent в Google Chrome на телефоне Android:

До: Mozilla/5.0 (Linux; Android <span style={{color: '#016F01' }}>13; Pixel 7</span>) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.0.0 Mobile Safari/537.36

После: Mozilla/5.0 (Linux; Android <span style={{color: '#016F01' }}>10; K</span>) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.0.0 Mobile Safari/537.36

Формат User-Agent остался неизменным, чтобы не нарушать существующую логику парсинга библиотек. Были сокращены следующие значения:

  • Версия операционной системы
  • Минорная версия браузера
  • Аппаратная модель

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

Операционная системаСокращенное/фиксированное название
MacMacintosh; Intel Mac OS X 10_15_7
WindowsWindows NT 10.0; Win64; x64
ChromeOSX11; CrOS x86_64 14541.0.0
LinuxX11; Linux x86_64
AndroidLinux; Android 10; K
iOSreduced (iOS 26+)

2.2.2 Пример 2: Сокращение User-Agent в Firefox#

Ниже вы найдете пример сокращения User-Agent в Mozilla Firefox, которое следует большинству позиций Google по сокращению User-Agent.

Вот пример User-Agent в Windows 11 с текущей версией Firefox:

Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0

В этом User-Agent архитектура CPU, версия операционной системы и минорная версия браузера были заморожены.

2.2.3 Пример 3: Сокращение User-Agent в Safari на macOS#

Ниже вы найдете пример сокращения User-Agent в Safari на macOS.

Сначала начнем с User-Agent Safari на macOS Sonoma версии 14.5 на Mac Silicon M2.

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15

Вы можете видеть, что версия macOS ограничена 10_15_07, а архитектура также зафиксирована на Intel, не сообщая архитектуру CPU Mac. Это также верно для Firefox и Chrome на macOS.

2.2.4 Пример 4: User-Agent в Safari на iOS (теперь сокращен в iOS 26+)#

До iOS 26 (выпущена в сентябре 2025 года) Safari на iOS раскрывал фактическую версию операционной системы. Однако теперь Apple заморозила User-Agent для iOS/iPadOS в Safari 26, аналогично macOS. В примере ниже показан User-Agent до iOS 26:

Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1

Примечание: Начиная с iOS 26 все браузеры на iOS (Chrome, Firefox, Safari) теперь имеют замороженные строки User-Agent, аналогично macOS. Примеры ниже показывают поведение до iOS 26:

Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/126.0.6478.153 Mobile/15E148 Safari/604.1

Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/127.1 Mobile/15E148 Safari/605.1.15

2.3 Ограничения обнаружения при сокращении User-Agent#

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

БраузерWindowsMacOSiOSAndroid
Chromereducedreducedreduced (iOS 26+)reduced
Edgereducedreducedreduced (iOS 26+)reduced
Firefoxreducedreducedreduced (iOS 26+)reduced
Safari-reduced*reduced (Safari 26+)**-
Samsung Internet---reduced
WebViews--reduced (iOS 26+)not reduced (≥ 16: reduced)

Поэтому наиболее важными проблемами обнаружения при сокращенном User-Agent являются (* = см. примечания ниже для версии macOS):

  • Windows 10 и Windows 11 невозможно различить: Вы больше не можете различить системы Windows 10 и Windows 11 на основе User-Agent.
  • Устройства Android и версию операционной системы невозможно различить: В отличие от Apple, Android раньше включал фактическую модель оборудования в User-Agent. Это больше не так. Поэтому различные модели оборудования больше нельзя различать только по User-Agent. В случае с Apple это никогда не было возможно.
  • Версию macOS и архитектуру невозможно различить: Невозможно дифференцировать версии macOS и архитектуры платформ на основе User-Agent.
  • (*) Версия macOS в Safari: Safari заморозил версию операционной системы, но продолжает показывать версию Safari. На момент написания статьи для версии 10.15 и выше безопасно вычесть три из версии Safari, чтобы определить основную версию MacOS.
  • (**) Версия iOS в Safari 26+: Начиная с iOS 26 (сентябрь 2025 г.) Apple заморозила User-Agent для iOS/iPadOS, аналогично macOS. Версия ОС больше не раскрывается.

Вот таблица сопоставления версий macOS и соответствующих им версий Safari:

Версия macOSВерсия SafariГод выпуска
macOS Sequoia (15)Safari 182024
macOS Sonoma (14)Safari 172023
macOS Ventura (13)Safari 162022
macOS Monterey (12)Safari 152021
macOS Big Sur (11)Safari 142020
macOS Catalina (10.15)Safari 132019

Существуют и другие способы определения операционных систем и браузеров на основе сложных методов фингерпринтинга, таких как TLS-фингерпринтинг. Поскольку существуют законные сценарии, в которых более глубокое обнаружение операционной системы имеет смысл, Google представила Client Hints, чтобы иметь возможность получать эту информацию программным путем. Мы увидим, как работают Client Hints, в следующей главе.

3. Как работают Client Hints?#

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

  • Заголовок HTTP: Использование HTTP-заголовков запроса, которое доступно только для контекстов первой стороны.
  • JavaScript API: Использование JavaScript API, которое может быть использовано встроенным скриптом.

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

3.1 Какие Client Hints существуют?#

В зависимости от того, какой метод доступа используется, названия Client Hints немного отличаются. Мы привели список наиболее важных названий Client Hints:

Токен HTTP UA-CHUA-CH JS APIЭнтропия
Sec-CH-UA-Platform-VersionUADataValues.platformVersionВысокая
Sec -CH-UA-MobileNavigatorUAData.mobileНизкая
Sec-CH-UA-ModelUADataValues.modelВысокая
Sec-CH-UANavigatorUAData.brandsНизкая
Sec-CH-UA-ArchUADataValues.architectureВысокая

3.2 Как получить доступ к Client Hints через заголовки HTTP-запроса#

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

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

  • Заголовки обычных Client Hints (Regular Client Hints)
  • Заголовки критических (Critical) Client Hints

3.2.1 Как использовать заголовки обычных Client Hints?#

Обычные Client Hints — это заголовки, которые сервер может запросить у браузера для сбора информации о пользовательской среде в последующих запросах.

Пример: Chrome на macOS 14.5 с обычными Client Hints на corbado.com

  1. При первом запросе к Corbado.com Chrome уже включит следующие заголовки с низкой энтропией, так как эта информация также включена в User-Agent.
ЗаголовокЗначение
Sec-Ch-Ua"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"
Sec-Ch-Ua-Mobile?0
Sec-Ch-Ua-Platform"macOS"
  1. Допустим, Corbado.com хотел бы получить версию операционной системы (версию платформы) при последующих запросах. Поэтому он установит соответствующий заголовок “Sec-CH-UA-Platform-Version” в ответе на первый запрос:
ЗаголовокЗначение
Accept-CHSec-CH-UA-Platform-Version
  1. При последующих запросах Corbado.com получит еще один заголовок с версией платформы:
ЗаголовокЗначение
Sec-Ch-Ua"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"
Sec-Ch-Ua-Mobile?0
Sec-Ch-Ua-Platform"macOS"
Sec-Ch-Ua-Platform"14.5.0"

В то же время User-Agent для этого запроса останется прежним (без версии платформы):

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36

Используя https://user-agent-client-hints.glitch.me/headers, вы можете поиграть с тем, как будут выглядеть различные макеты информации для обычных подсказок (помните, вы должны использовать Chrome). См. здесь для более подробной информации. В случае, если corbado.com нуждается в этой информации при самом первом запросе страницы, использование обычных Client Hints будет недостаточным, но есть способ ускорить этот процесс с помощью критических Client Hints.

3.2.2 Как использовать заголовки критических (Critical) Client Hints?#

Допустим, corbado.com потребуется platform-version при первом запросе для рендеринга соответствующей страницы загрузки, адаптированной к точной версии macOS. Он может использовать критические Client Hints, что приведет к немедленной повторной попытке запроса только для рендеринга страницы, включая заголовок:

Пример: Chrome на macOS 14.5 с критическими Client Hints на corbado.com

  1. При первом запросе к corbado.com Chrome уже включит следующие заголовки с низкой энтропией, так как эта информация также включена в User-Agent.
ЗаголовокЗначение
Sec-CH-UA"Google Chrome";v="125", "Chromium";v="125", "Not_A/Brand";v="24"
Sec-CH-UA-Mobile?0
Sec-CH-UA-Platform"macOS"
  1. Допустим, corbado.com хотел бы получить версию операционной системы (версию платформы) при первом рендеринге страницы. Затем он установит заголовок критической клиентской подсказки “Sec-CH-UA-Platform-Version” в ответе на первый запрос:
ЗаголовокЗначение
Accept-CHSec-CH-UA-Platform-Version
  1. Chrome не начнет рендеринг и немедленно повторит запрос, так что заголовок будет доступен при первом рендеринге corbado.com. Затем он получит дополнительный заголовок с версией платформы:
ЗаголовокЗначение
Sec-CH-UA"Google Chrome";v="125", "Chromium";v="125", "Not_A/Brand";v="24"
Sec-CH-UA-Mobile?0
Sec-CH-UA-Platform"macOS"
Sec-CH-UA-Platform-Version"14.5.0"

На следующих схемах мы видим еще один пример, где веб-сайт запрашивает модель устройства как критическую часть с заголовком Critical-CH. Как мы видим, клиент повторяет запрос, как в примере выше (левая схема последовательности).

Client hints с Chromium: https://developers.google.com/privacy-sandbox/protections/User-Agent

Таким образом, использование критических Client Hints добавляет задержку, поскольку браузер должен немедленно начать второй запрос, добавляя циклы приема-передачи. Существует способ оптимизировать передачу за счет упрощения рукопожатия TLS (TLS handshake) (зеленое поле в верхней части диаграммы), чтобы уже передать детали. Этот подход, упрощающий ALPN (Application-Layer Protocol Negotiation), можно найти здесь в деталях, но это выходит за рамки данной статьи.

Чтобы получить дополнительную информацию с помощью заголовков, конфигурацию нужно добавить либо в бэкенд, либо на веб-сервер / балансировщики нагрузки. Это легко сделать в контексте первой стороны, когда вы полностью контролируете веб-сайт как компания. Например, нашим компонентам пользовательского интерфейса на corbado.com требуется версия платформы для повышения точности нашей аналитики ключей доступа (passkey intelligence). Разработчики интегрируют наши компоненты на различных страницах, и требование от них добавлять заголовки и затем передавать эту информацию в наши компоненты стало бы неприятной дополнительной нагрузкой. Для SPA и других встроенных приложений на JavaScript есть другой интерфейс, который можно использовать и который будет объяснен в следующем разделе.

3.3 Как получить доступ к Client Hints через JavaScript API (Встроенные скрипты)#

С помощью функции navigator.userAgentData.getHighEntropyValues() доступ к Client Hints также можно получить через JavaScript API, предоставляя гибкий и динамичный способ запроса определенной информации о браузере и устройстве пользователя. Этот метод включает использование объекта navigator.userAgentData в скрипте веб-страницы для запроса Client Hints. Этот метод не требует установки заголовков Client Hint, но он работает только в браузерах, поддерживающих navigator.userAgentData (браузеры на базе Chromium, такие как Chrome и Edge). Firefox и Safari не поддерживают этот API, поэтому разработчики должны обнаруживать эту функцию и предоставлять запасные варианты (fallbacks).

Например, при выполнении этого кода в консоли Chrome на macOS:

if (navigator.userAgentData) { navigator.userAgentData .getHighEntropyValues(["architecture", "model", "platformVersion"]) .then((ua) => { console.log(ua); }); }

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

Затем platformVersion возвращается в промисе, и к ней можно получить доступ непосредственно из встроенного кода JavaScript. Покрытие этой функцией намного ниже, чем фактическое снижение User-Agent:

Кроме того, Chrome не предлагает эту функциональность на iOS, поскольку он развертывает WebKit на iOS из-за ограничений Apple.

Теперь мы собрали наиболее важные факты о сокращении User-Agent и о том, как Client Hints предлагают способ обойти это в Chrome.

4. Рекомендации по подходу к User-Agent сегодня#

В зависимости от вашего варианта использования вы должны использовать другой подход, чтобы гарантировать, что ваше приложение получит наилучший возможный результат:

  • Обнаружение функций: По возможности используйте существующие JavaScript API браузера. Везде, где это возможно, полагайтесь на API браузера для непосредственного обнаружения функциональности, а не используйте User-Agent. Это более надежно и ориентировано на будущее.
  • Для подсказок с низкой энтропией, таких как тип устройства: User-Agent достаточно. Если вашему приложению нужно только определить тип устройства или другие детали с низкой энтропией, строка User-Agent будет достаточно подробной. Для этих целей также можно использовать существующие API.
  • Для информации с высокой энтропией и контроля домена: Используйте подход с заголовками. Если вам требуется подробная информация и у вас есть контроль над доменом, используйте подход с HTTP-заголовками для запроса информации с высокой энтропией там, где это поддерживается (Chrome, Edge). Во всех остальных браузерах (которые не отправляют заголовки Client Hints) используйте классический User-Agent. Решите, нужно ли вам использовать критические Client Hints в зависимости от того, нужна ли вам информация немедленно или вы можете позволить себе небольшую задержку.
  • Для библиотек JavaScript: Используйте getHighEntropyValues. Если вы разрабатываете библиотеку JavaScript, лучший вариант — использовать функцию navigator.userAgentData.getHighEntropyValues() для динамического запроса конкретной информации о браузере и устройстве пользователя всякий раз, когда эта функция определена, и переходить на библиотеки парсинга User-Agent в других случаях.

В следующей таблице кратко показано, где вы все еще можете определить версию операционной системы, если у вас есть доступ к User-Agent (UA) и Client Hints (CH):

БраузерWindowsMacOSiOSAndroid
Chrome✅ CH✅ CH❌ (iOS 26+)✅ CH
Edge✅ CH✅ CH❌ (iOS 26+)✅ CH
Firefox❌ (iOS 26+)
Safari-✅ UA-Safari❌ (Safari 26+)-
Samsung Internet---✅ CH
WebViews--❌ (iOS 26+)✅ UA (≥ 16: ❌)

Выбрав соответствующий метод с учетом ваших конкретных потребностей, вы сможете эффективно сбалансировать потребность в подробной информации о пользователях с соображениями конфиденциальности и производительности. Если вы сильно зависите от информации, которую трудно извлечь или которая действительно зависит от устройства, обратитесь к профессиональным библиотекам, таким как wurfl или 51degrees.com, которые выполнят тяжелую работу за вас. Обе библиотеки поддерживают интеграцию клиентских ссылок в обнаружение, а также имеют собственный проприетарный способ даже для обнаружения моделей iPhone.

5. Как использовать User-Agent и Client Hints для ключей доступа#

В Corbado мы фокусируемся на разработке решений для ключей доступа, используя компоненты пользовательского интерфейса, в основном разработанные с помощью React. Наши компоненты встроены в различные веб-сайты, поэтому мы следуем нашим собственным рекомендациям и используем getHighEntropyValues() там, где это доступно, переходя на классический парсинг User-Agent во всех остальных случаях. Мы используем это в первую очередь для:

  • Управление ключами доступа: На нашем сайте управления ключами доступа мы отображаем всю доступную информацию об устройстве, на котором был создан ключ доступа.
  • Кросс-устройственная аутентификация: Для кросс-устройственной аутентификации мы используем информацию об операционной системе, чтобы определить, насколько вероятно, что клиент поддерживает использование CDA. Это особенно важно при различении Windows 10 и 11, что возможно только с помощью Client Hints в Chrome и Edge:

Более подробная информация на: https://learn.microsoft.com/en-us/microsoft-edge/web-platform/how-to-detect-win11

  • Аналитика ключей доступа (passkey intelligence): Мы считаем, что платформа должна решать, следует ли инициировать вход с помощью ключа доступа. Поэтому мы интегрируем как можно больше логики в наши компоненты для обнаружения того, используется ли новое устройство. В таких сценариях новая или меньшая версия операционной системы является ценной подсказкой о том, что ситуация могла измениться.

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

6. Заключение#

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

  • Что такое сокращение User-Agent? Сокращение User-Agent — это процесс минимизации объема информации, передаваемой через строки User-Agent для защиты конфиденциальности пользователей. Этот переход снижает степень детализации данных, таких как версия операционной системы и модель оборудования, которые ранее использовались для фингерпринтинга и отслеживания пользователей на разных веб-сайтах. Мы изучили, как это сокращение влияет на разработчиков и как они могут адаптироваться к этим изменениям.
  • Как работают Client Hints? Client Hints предоставляют механизм для запроса конкретной информации с высокой энтропией об устройстве пользователя более осознанным в отношении конфиденциальности способом. Используя HTTP-заголовки и JavaScript API, разработчики могут получать доступ к подробным данным о пользовательской среде при необходимости. Мы обсудили, как реализованы Client Hints, доступные типы подсказок и методы доступа к ним через заголовки HTTP-запросов и JavaScript.

Client Hints продолжают развиваться, и их внедрение может увеличиться по мере того, как все больше браузеров и разработчиков осознают их преимущества. Однако еще предстоит увидеть, станет ли их поддержка повсеместной или же мнения в Интернете продолжат расходиться по этой теме.

Corbado

О Corbado

Corbado — это Authentication Intelligence Platform для CIAM-команд, обеспечивающих аутентификацию пользователей в крупных масштабах. Мы показываем то, что не видят логи IDP и общие инструменты аналитики: какие устройства, версии ОС, браузеры и менеджеры учётных данных поддерживают passkey, почему регистрации не превращаются в логины, где сбоит WebAuthn-поток и когда обновление ОС или браузера тихо ломает вход — всё это без замены Okta, Auth0, Ping, Cognito или вашего собственного IDP. Два продукта: Corbado Observe добавляет наблюдаемость для passkey и любых других способов входа. Corbado Connect даёт managed passkey со встроенной аналитикой (рядом с вашим IDP). VicRoads использует passkey для более чем 5 млн пользователей с Corbado (+80 % активации passkey). Поговорить с экспертом по passkey

Часто задаваемые вопросы#

Как получить фактическую версию iOS в моем веб-приложении после iOS 26?#

Apple заморозила строку User-Agent для iOS/iPadOS в Safari 26, выпущенном в сентябре 2025 года, что означает, что версия ОС больше не раскрывается через User-Agent в любом браузере, работающем на iOS. В отличие от Chrome на Android или десктопах, в браузерах на iOS недоступен API Client Hints, поэтому фактическая версия iOS больше не доступна программно.

В чем разница между обычными Client Hints и критическими (Critical) Client Hints?#

Обычные Client Hints, запрашиваемые через заголовок ответа Accept-CH, включаются только в последующие запросы и недоступны при начальной загрузке страницы. Критические Client Hints вызывают немедленную повторную попытку браузера перед рендерингом, гарантируя, что подсказка будет доступна при первом рендеринге, но это добавляет дополнительный цикл приема-передачи к циклу запроса.

Почему Apple отменила свое первоначальное решение 2017 года заморозить User-Agent в Safari?#

Apple объявила о заморозке User-Agent в Safari Technology Preview 46 в 2017 году, но в 2021 году частично отменила это решение из-за значительных проблем с совместимостью с веб-сайтами, полагающимися на актуальную информацию User-Agent. Впоследствии Apple внедрила более постепенный подход к заморозке UA, а не немедленную полную заморозку в то время.

Как определить версию macOS в Safari, если Client Hints не поддерживаются?#

Safari не поддерживает Client Hints, но версию macOS можно вывести из номера версии Safari в строке User-Agent. Вычитание трех из основной версии Safari надежно сопоставляется с основной версией macOS для macOS 10.15 и выше, основываясь на последовательном согласовании релизов между версиями Safari и macOS.

Какой подход следует использовать разработчикам библиотек JavaScript для кроссбраузерного определения устройств?#

Рекомендуемый подход заключается в вызове navigator.userAgentData.getHighEntropyValues(), когда функция определена, охватывая браузеры на базе Chromium, и переходе к библиотекам парсинга строк User-Agent для Firefox и Safari. Для случаев, требующих узкоспециализированной идентификации модели устройства, профессиональные библиотеки, такие как wurfl или 51degrees, предоставляют дополнительные возможности определения, выходящие за рамки того, что раскрывают строки User-Agent.

Узнайте, что на самом деле происходит при внедрении passkeys.

Открыть Console

Поделиться статьей


LinkedInTwitterFacebook