---
url: 'https://www.corbado.com/ru/blog/client-hints-user-agent-chrome-safari-firefox'
title: 'Client Hints и User-Agent в Chrome, Safari и Firefox'
description: 'Узнайте о поддержке API User-Agent и Client Hints в Chrome, Safari и Firefox, а также о том, как мы используем их для ключей доступа и определения устройств в компонентах JavaScript.'
lang: 'ru'
author: 'Vincent Delitz'
date: '2026-07-27T08:24:20.422Z'
lastModified: '2026-07-27T08:25:49.200Z'
keywords: 'user-agent, строка user-agent, сокращение user-agent, client hints, api client hints, поддержка client hints в браузерах, chrome, safari, firefox'
category: 'Engineering'
---

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

## Key Facts

- **Сокращение 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](https://en.wikipedia.org/wiki/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](https://x.com/rmondello/status/943545865204989953), объявив, что Safari заморозит строку User-Agent в Safari Technology Preview 46 (STP 46) с целью борьбы с фингерпринтингом и повышения конфиденциальности.

![twitter safari user agent reduction](https://www.corbado.com/website-assets/twitter_user_agent_d4776d2a35.png)

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

#### 1.2.2 User-Agent в Chrome (+ Edge)

В 2019/2020 годах
[Google объявила о планах](https://groups.google.com/a/chromium.org/g/blink-dev/c/-2JIRNMWJ7s/m/u-YzXjZ8BAAJ)
снизить степень детализации строк User-Agent в Chrome, представив
[User-Agent Client Hints (UA-CH)](https://chromestatus.com/feature/5704553745874944) как гибкий и контролируемый способ запроса конкретной информации о браузере и устройстве. Google начала тестирование сокращения User-Agent в версиях Chrome Canary и Beta, собирая отзывы для обеспечения совместимости и функциональности, и оно было
[завершено в 2023 году](https://www.chromium.org/updates/ua-reduction/) для 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, в следующей главе.

## 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](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 остался неизменным, чтобы не нарушать существующую логику парсинга библиотек. Были сокращены следующие значения:

- Версия операционной системы
- Минорная версия браузера
- Аппаратная модель ![user agent](https://www.corbado.com/website-assets/user_agent_0fe7987aff.png)

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

| **Операционная система** | **Сокращенное/фиксированное название** |
| -------------------- | --------------------------------- |
| Mac                  | Macintosh; Intel Mac OS X 10_15_7 |
| Windows              | Windows NT 10.0; Win64; x64       |
| ChromeOS             | X11; CrOS x86_64 14541.0.0        |
| Linux                | X11; Linux x86_64                 |
| Android              | Linux; Android 10; K              |
| iOS                  | reduced (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](https://issues.chromium.org/issues/40167872) на 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.

| **Браузер**      | **Windows** | **MacOS** | **iOS**                  | **Android**                 |
| ---------------- | ----------- | --------- | ------------------------ | --------------------------- |
| Chrome           | reduced     | reduced   | reduced (iOS 26+)        | reduced                     |
| Edge             | reduced     | reduced   | reduced (iOS 26+)        | reduced                     |
| Firefox          | reduced     | reduced   | reduced (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 18          | 2024             |
| macOS Sonoma (14)      | Safari 17          | 2023             |
| macOS Ventura (13)     | Safari 16          | 2022             |
| macOS Monterey (12)    | Safari 15          | 2021             |
| macOS Big Sur (11)     | Safari 14          | 2020             |
| macOS Catalina (10.15) | Safari 13          | 2019             |

Существуют и другие способы определения операционных систем и браузеров на основе сложных методов фингерпринтинга, таких как 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:
![client hints](https://s3.eu-central-1.amazonaws.com/corbado-cloud-staging-website-assets/client_hints_f186bae2e2.jpg)

| **Токен HTTP UA-CH**       | **UA-CH JS API**             | **Энтропия** |
| -------------------------- | ---------------------------- | ----------- |
| Sec-CH-UA-Platform-Version | UADataValues.platformVersion | Высокая        |
| Sec -CH-UA-Mobile          | NavigatorUAData.mobile       | Низкая         |
| Sec-CH-UA-Model            | UADataValues.model           | Высокая        |
| Sec-CH-UA                  | NavigatorUAData.brands       | Низкая         |
| Sec-CH-UA-Arch             | UADataValues.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"                                                           |

2. Допустим, Corbado.com хотел бы получить версию операционной системы (версию платформы) при **последующих запросах.** Поэтому он установит соответствующий заголовок “Sec-CH-UA-Platform-Version” в ответе на первый запрос:

| **Заголовок** | **Значение**                  |
| ---------- | -------------------------- |
| Accept-CH  | Sec-CH-UA-Platform-Version |

3. При **последующих запросах** 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](https://user-agent-client-hints.glitch.me/headers), вы можете поиграть с тем, как будут выглядеть различные макеты информации для обычных подсказок (помните, **вы должны использовать Chrome**). См. [здесь](https://github.com/WICG/ua-client-hints) для более подробной информации. В случае, если corbado.com нуждается в этой информации при самом первом запросе страницы, использование обычных Client Hints будет недостаточным, но есть способ ускорить этот процесс с помощью критических Client Hints.

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

Допустим, [corbado.com](https://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"                                                           |

2. Допустим, corbado.com хотел бы получить версию операционной системы (версию платформы) при **первом рендеринге страницы**. Затем он установит заголовок критической клиентской подсказки “Sec-CH-UA-Platform-Version” в ответе на первый запрос:

| **Заголовок** | **Значение**                  |
| ---------- | -------------------------- |
| Accept-CH  | Sec-CH-UA-Platform-Version |

3. 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. Как мы видим, клиент повторяет запрос, как в примере выше (левая схема последовательности).

![chromium user agent flow complete](https://www.corbado.com/website-assets/chromium_user_agent_flow_complete_cfbf688661.png)_Client hints с Chromium: [https://developers.google.com/privacy-sandbox/protections/User-Agent](https://developers.google.com/privacy-sandbox/protections/User-Agent)_

Таким образом, использование критических Client Hints добавляет задержку, поскольку браузер должен немедленно начать второй запрос, добавляя циклы приема-передачи. Существует способ оптимизировать передачу за счет **упрощения рукопожатия TLS (TLS handshake)** (зеленое поле в верхней части диаграммы), чтобы уже передать детали. Этот подход, упрощающий **[ALPN](https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation) (Application-Layer Protocol Negotiation)**, можно найти [здесь](https://docs.google.com/document/d/1HQd3vosjFls2jp6DwpkNMUN4CBdmmxZJJz0WhhcqOPw/edit) в деталях, но это выходит за рамки данной статьи.

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

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

С помощью функции [navigator.userAgentData.getHighEntropyValues()](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/getHighEntropyValues) доступ к Client Hints также можно получить через JavaScript API, предоставляя гибкий и динамичный способ запроса определенной информации о браузере и устройстве пользователя. Этот метод включает использование объекта `navigator.userAgentData` в скрипте веб-страницы для запроса Client Hints. **Этот метод не требует установки заголовков Client Hint, но он работает только в браузерах, поддерживающих `navigator.userAgentData` (браузеры на базе Chromium, такие как Chrome и Edge). Firefox и Safari не поддерживают этот API, поэтому разработчики должны обнаруживать эту функцию и предоставлять запасные варианты (fallbacks).**

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

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

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

![platform version](https://www.corbado.com/website-assets/platform_version_6111c471f1.png)

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

![get high entropy list](https://www.corbado.com/website-assets/get_high_entropy_list_75834fcb30.png)

Кроме того, 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):

| **Браузер**      | **Windows** | **MacOS**    | **iOS**         | **Android**      |
| ---------------- | ----------- | ------------ | --------------- | ---------------- |
| 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](https://web.wurfl.io/) или [51degrees.com](https://51degrees.com), которые выполнят тяжелую работу за вас. Обе библиотеки поддерживают интеграцию клиентских ссылок в обнаружение, а также имеют собственный проприетарный способ даже для обнаружения моделей iPhone.

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

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

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

![get high entropy value](https://www.corbado.com/website-assets/get_high_entropy_value_538459bd28.png)_Более подробная информация на: [https://learn.microsoft.com/en-us/microsoft-edge/web-platform/how-to-detect-win11](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 продолжают развиваться, и их внедрение может увеличиться по мере того, как все больше браузеров и разработчиков осознают их преимущества. Однако еще предстоит увидеть, станет ли их поддержка повсеместной или же мнения в Интернете продолжат расходиться по этой теме.

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

### Как получить фактическую версию 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.
