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

Шпаргалка по Passkeys. Практические рекомендации, шаблоны внедрения и KPI для программ passkeys.
navigator.userAgentData, требуя от разработчиков возвращаться к классическому парсингу строки User-Agent в браузере Mozilla.getHighEntropyValues() получает доступ к данным устройства с высокой энтропией только в браузерах на базе Chromium. В Safari и Firefox этот API полностью отсутствует.Методы обнаружения и реагирования на различные пользовательские среды постоянно меняются. Традиционно строки User-Agent были способом идентификации информации о браузере и устройстве, позволяя веб-сайтам соответствующим образом адаптировать работу. Однако эти строки часто использовались для фингерпринтинга и идентификации пользователей без их согласия в маркетинговых целях, что вызывало опасения по поводу конфиденциальности.
В этом контексте Client Hints в качестве JavaScript API появились как инструмент, обеспечивающий более контролируемый и уважающий конфиденциальность способ обмена необходимой информацией об устройстве и предпочтениях пользователя. В этой статье основное внимание уделяется последствиям сокращения User-Agent и исследуется, как Client Hints помогают адаптироваться к этой новой ситуации.
Ключевые моменты, которые мы рассмотрим:
Поскольку браузеры и операционные системы имеют разные позиции и адаптируют свои подходы по-разному, разработчики программного обеспечения сталкиваются с проблемой обеспечения того, чтобы их приложения могли по-прежнему точно обнаруживать и реагировать на различные пользовательские среды в разных браузерах и операционных системах.
Эта статья призвана предоставить всеобъемлющий обзор этих изменений, предлагая идеи и практические рекомендации, которые помогут разработчикам в случае, если их вариант использования или программное обеспечение зависят от деталей устройства или операционных систем (например, детальное управление устройствами, обнаружение известных устройств, предотвращение мошенничества или другие обнаружения функций) или, как в нашем собственном случае, оптимизация работы с ключами доступа с помощью User-Agent и Client Hints.
Последние статьи
Прежде чем мы углубимся в технические детали Client Hints, мы кратко рассмотрим историю User-Agent и то, как работают различные усилия по сокращению 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, для смягчения рисков конфиденциальности и повышения безопасности.
Движение за сокращение User-Agent началось в ответ на растущие опасения по поводу конфиденциальности. Вот хронологический обзор ключевых вех в этой эволюции:
В 2017 году Apple инициировала движение по сокращению User-Agent знаменитым постом в Twitter, объявив, что Safari заморозит строку User-Agent в Safari Technology Preview 46 (STP 46) с целью борьбы с фингерпринтингом и повышения конфиденциальности.
Однако позже это решение было частично отменено в 2021 году из-за значительных проблем совместимости с веб-сайтами, полагающимися на актуальную информацию User-Agent.
В 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 на всех платформах.
В 2021 году Mozilla присоединилась к этим усилиям, постепенно снижая степень детализации строки User-Agent, но Mozilla решила не поддерживать Client Hints в Firefox.
Сокращение 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, в следующей главе.
Подпишитесь на наш Passkeys Substack, чтобы получать новости.
Когда говорят о сокращении User-Agent, подразумевается уменьшение информации внутри строки User-Agent. Давайте копнем глубже, чтобы узнать, что было встроено в 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
Исторически строки User-Agent часто использовались для обнаружения функций и платформ, позволяя веб-сайтам адаптировать свой контент и функциональность на основе обнаруженных характеристик браузера и устройства (например, определять, загрузку для какого конкретного бинарного файла предлагать). Это стало особенно важным с распространением мобильных телефонов и планшетов для макетов, которые не были созданы адаптивными, чтобы иметь возможность перенаправлять мобильные телефоны на их конкретную версию.
Однако этот подход в настоящее время считается неоптимальным, поскольку он основывается на предположениях о возможностях браузера, которые могут оказаться неверными или недостаточно конкретными. Современные методы веб-разработки пропагандируют использование обнаружения функций через API браузера, где это возможно, для прямой проверки определенных функций и возможностей браузера. Этот метод более надежен и гарантирует правильную работу веб-сайтов независимо от строки User-Agent или версии браузера. Обнаружение функций фокусируется на фактических возможностях браузера, обеспечивая более надежный и ориентированный на будущее способ обработки различий в поведении и функциональности браузеров.
На сегодняшний день это не совсем возможно, так как новые API браузеров для обнаружения функциональности внедряются в разное время и часто существует разный подход между крупными (например, браузеры на базе Chromium) и небольшими командами браузеров (например, Firefox).
Больше информации дает веб-сайту более широкие возможности для создания отпечатка с большей «энтропией». Энтропия в этом контексте — это количество вариаций, которые могут быть использованы для создания уникального отпечатка среди различных посетителей веб-сайта.
Отпечаток может быть использован в различных целях. Он может использоваться в защитных целях, таких как обнаружение мошенничества и предотвращение захвата учетных записей путем идентификации новых устройств, но он также может использоваться для идентификации посетителей без их согласия или для более точного таргетинга рекламы.
В контексте строк User-Agent энтропия относится к объему уникальной, идентифицируемой информации, которая может использоваться для отслеживания и различения отдельных пользователей.
Помимо User-Agent, существует множество другой информации, которая может быть использована как источник энтропии. Например, вы можете найти различные источники энтропии на https://coveryourtracks.eff.org.
Поэтому, когда браузеры говорят о сокращении User-Agent, они в первую очередь нацелены на уменьшение информации с высокой энтропией. Вот несколько примеров сокращения:
Ниже вы найдете пример сокращения 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 остался неизменным, чтобы не нарушать существующую логику парсинга библиотек. Были сокращены следующие значения:
На графике подробно показано, какие значения будут продолжать обновляться в зависимости от операционной системы, а зеленые значения показывают, какие значения будут постоянными на всех платформах. Для разных значений операционной системы будет доступен только вариант, который остается постоянным:
| Операционная система | Сокращенное/фиксированное название |
|---|---|
| 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+) |
Ниже вы найдете пример сокращения 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, версия операционной системы и минорная версия браузера были заморожены.
Ниже вы найдете пример сокращения 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.
До 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
В целом, очевидно, что 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):
Вот таблица сопоставления версий 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, в следующей главе.
Client Hints позволяют веб-сайтам получать доступ к информации с высокой энтропией, которая была удалена из строки User-Agent, соблюдая при этом конфиденциальность. Существует два основных метода доступа к Client Hints:
Client Hints также можно использовать для получения информации с низкой энтропией, которая уже включена в User-Agent. Это означает, что в Chrome, где поддерживаются Client Hints, User-Agent больше не нужны.
В зависимости от того, какой метод доступа используется, названия Client Hints немного отличаются. Мы привели список наиболее важных названий Client Hints:
| Токен 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 | Высокая |
В контексте первой стороны веб-сайты могут запрашивать определенную информацию о браузере и устройстве пользователя, используя HTTP-заголовки запроса. Этот подход включает в себя настройку правильного заголовка в HTTP-ответе сервера, указывающего, какие Client Hints интересуют сервер. Затем браузер включает эти подсказки в последующие запросы к тому же источнику.
Этот заголовок сигнализирует браузеру об отправке подробной информации о пользователе в будущих запросах, что позволяет серверу соответствующим образом адаптировать ответы. Этот метод гарантирует, что подробная информация о пользователе будет доступна только веб-сайту первой стороны, предотвращая получение данных с высокой энтропией сторонними ресурсами. Доступно два типа заголовков запроса, которые мы сейчас обсудим:
Обычные Client Hints — это заголовки, которые сервер может запросить у браузера для сбора информации о пользовательской среде в последующих запросах.
Пример: Chrome на macOS 14.5 с обычными Client Hints на 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" |
| Заголовок | Значение |
|---|---|
| Accept-CH | Sec-CH-UA-Platform-Version |
| Заголовок | Значение |
|---|---|
| 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.
Допустим, corbado.com потребуется platform-version при первом запросе для рендеринга соответствующей страницы загрузки, адаптированной к точной версии macOS. Он может использовать критические Client Hints, что приведет к немедленной повторной попытке запроса только для рендеринга страницы, включая заголовок:
Пример: Chrome на macOS 14.5 с критическими Client Hints на 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" |
| Заголовок | Значение |
|---|---|
| Accept-CH | Sec-CH-UA-Platform-Version |
| Заголовок | Значение |
|---|---|
| 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 есть другой интерфейс, который можно использовать и который будет объяснен в следующем разделе.
С помощью функции 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.
В зависимости от вашего варианта использования вы должны использовать другой подход, чтобы гарантировать, что ваше приложение получит наилучший возможный результат:
В следующей таблице кратко показано, где вы все еще можете определить версию операционной системы, если у вас есть доступ к 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 или 51degrees.com, которые выполнят тяжелую работу за вас. Обе библиотеки поддерживают интеграцию клиентских ссылок в обнаружение, а также имеют собственный проприетарный способ даже для обнаружения моделей iPhone.
В Corbado мы фокусируемся на разработке решений для ключей доступа, используя компоненты пользовательского интерфейса, в основном разработанные с помощью React. Наши компоненты встроены в различные веб-сайты, поэтому мы следуем нашим собственным рекомендациям и используем getHighEntropyValues() там, где это доступно, переходя на классический парсинг User-Agent во всех остальных случаях. Мы используем это в первую очередь для:
Более подробная информация на: https://learn.microsoft.com/en-us/microsoft-edge/web-platform/how-to-detect-win11
Когда мы начали собирать информацию для наших компонентов, мы обнаружили много фрагментированных данных, созданных во время или до начала сокращения User-Agent. Поэтому мы подумали, что резюме поможет разработчикам, которые хотят улучшить обнаружение, но не работают с User-Agent или Client Hints регулярно.
После того, как обнаружение на основе User-Agent было стандартом в течение десятилетий, строки User-Agent стали менее подробными для защиты конфиденциальности пользователей. В этой статье мы рассмотрели:
Client Hints продолжают развиваться, и их внедрение может увеличиться по мере того, как все больше браузеров и разработчиков осознают их преимущества. Однако еще предстоит увидеть, станет ли их поддержка повсеместной или же мнения в Интернете продолжат расходиться по этой теме.
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 →
Apple заморозила строку User-Agent для iOS/iPadOS в Safari 26, выпущенном в сентябре 2025 года, что означает, что версия ОС больше не раскрывается через User-Agent в любом браузере, работающем на iOS. В отличие от Chrome на Android или десктопах, в браузерах на iOS недоступен API Client Hints, поэтому фактическая версия iOS больше не доступна программно.
Обычные Client Hints, запрашиваемые через заголовок ответа Accept-CH, включаются только в последующие запросы и недоступны при начальной загрузке страницы. Критические Client Hints вызывают немедленную повторную попытку браузера перед рендерингом, гарантируя, что подсказка будет доступна при первом рендеринге, но это добавляет дополнительный цикл приема-передачи к циклу запроса.
Apple объявила о заморозке User-Agent в Safari Technology Preview 46 в 2017 году, но в 2021 году частично отменила это решение из-за значительных проблем с совместимостью с веб-сайтами, полагающимися на актуальную информацию User-Agent. Впоследствии Apple внедрила более постепенный подход к заморозке UA, а не немедленную полную заморозку в то время.
Safari не поддерживает Client Hints, но версию macOS можно вывести из номера версии Safari в строке User-Agent. Вычитание трех из основной версии Safari надежно сопоставляется с основной версией macOS для macOS 10.15 и выше, основываясь на последовательном согласовании релизов между версиями Safari и macOS.
Рекомендуемый подход заключается в вызове navigator.userAgentData.getHighEntropyValues(), когда функция определена, охватывая браузеры на базе Chromium, и переходе к библиотекам парсинга строк User-Agent для Firefox и Safari. Для случаев, требующих узкоспециализированной идентификации модели устройства, профессиональные библиотеки, такие как wurfl или 51degrees, предоставляют дополнительные возможности определения, выходящие за рамки того, что раскрывают строки User-Agent.
Похожие статьи
Содержание