Миграция от User-Agent Reduction к Client Hints
Миграция от хрупкого разбора User-Agent к User-Agent Client Hints на основе стандартов, с границами приватности и совместимости.
BotBrowser Team
Нужна структурированная документация по теме Платформа?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
Сокращение User-Agent - это изменение совместимости, а не повод создавать новый отпечаток. Сайт должен читать минимальный открытый сигнал, запрашивать дополнительные подсказки только для ясной цели и сохранять проверенный запасной путь.
BotBrowser может запустить разрешенные версию и профиль, чтобы наблюдать эти сигналы в контролируемом контексте; он не может заставить сайт принять Client Hints, выдать разрешения или гарантировать результат между браузерами.
TL;DR
Chrome замораживает или обобщает части строки User-Agent. UA-CH переносит отдельные сведения в структурированные заголовки и navigator.userAgentData; значения высокой энтропии по-прежнему зависят от разрешений и политик. Проведите инвентаризацию парсеров, отдайте приоритет проверке возможностей, отправляйте Accept-CH только для заявленной необходимости и тестируйте оба пути. BotBrowser может предоставить контролируемые авторизованные контексты, но не гарантирует трактовку сайта или универсальный результат.
Содержание
- Что изменилось
- Последовательность миграции
- Границы приватности и совместимости
- Граница возможностей BotBrowser
- Практический итог
Что изменилось
Старая строка находится в заголовке User-Agent и navigator.userAgent. Сокращение намеренно удаляет или фиксирует детали, уменьшая пассивную идентификацию. UA-CH дает структурированные подсказки низкой энтропии: Sec-CH-UA, Sec-CH-UA-Mobile, Sec-CH-UA-Platform, которым соответствуют brands, mobile, platform в navigator.userAgentData.
platformVersion, architecture, bitness, model и fullVersionList относятся к высокой энтропии. Сервер запрашивает выбранные поля через Accept-CH, а страница - через getHighEntropyValues(). Безопасный транспорт, политики, разрешения и настройки пользователя могут изменить результат.
const lowEntropy = {
brands: navigator.userAgentData?.brands ?? [],
mobile: navigator.userAgentData?.mobile ?? null,
platform: navigator.userAgentData?.platform ?? 'unknown',
};
const detailed = navigator.userAgentData
? await navigator.userAgentData.getHighEntropyValues(['platformVersion', 'architecture'])
: null;
Отсутствие API не доказывает конкретную модель или автоматизированный запрос; это лишь отсутствие сигнала.
Последовательность миграции
- Составьте инвентаризацию. Найдите серверные парсеры, аналитические поля, правила CDN, проверки фреймворков и тесты, ожидающие полную ОС или младшую версию в
User-Agent. - Определите решение. Для возможностей используйте feature detection или стандартный API. Если серверу нужна семья платформы, применяйте подсказку низкой энтропии и опишите цель.
- Оставьте запасной путь. Старые браузеры, настройки приватности и не-Chromium клиенты могут не отправить подсказку. Используйте консервативное значение и не выводите точное устройство из отсутствия.
- Запрашивайте минимум. Отправляйте
Accept-CHтолько для названных полей, проверьте хранение и не сохраняйте сырые значения, если хватает категории. - Проверяйте обе поверхности. Сверьте заголовки и
navigator.userAgentData, затем проверьте запасной путь синтетической страницей. Отдельно проверьте редиректы и ключи кэша.
| Решение | Предпочтительное свидетельство | Безопасный запасной путь |
|---|---|---|
| Показать функцию | Проверка во время выполнения | Доступный альтернативный элемент |
| Выбрать общий макет | Подсказка mobile низкой энтропии и viewport | Адаптивный CSS |
| Выбрать загрузку | Явный выбор или возможность | Общий совместимый пакет |
| Диагностировать регрессию | Заявленная версия и результат теста | Воспроизводимые шаги |
Границы приватности и совместимости
Client Hints не разрешает собирать инвентарь личности. Запросы высокой энтропии могут повысить связываемость; связывайте поле с видимой целью, ограничивайте хранение и исключайте аккаунты, местоположение и лишние данные устройства. Записи GREASE намеренно меняются, поэтому принимайте неизвестные бренды и порядок.
Считайте UA-CH прогрессивным улучшением. Прокси, кэш, встроенный документ, политика или не-Chromium реализация меняют доступные подсказки. navigator.userAgentData есть не везде, а успешный Promise не доказывает завершение операции приложения. Разделяйте наблюдение браузера, разрешение, подтверждение приложения и результат сервиса.
См. согласованность пользовательского User-Agent и качество функций браузера.
Граница возможностей BotBrowser
BotBrowser может предоставить контролируемые профили и повторяемые авторизованные сценарии для сравнения User-Agent и UA-CH в заявленных версиях. Фиксируйте заголовки, значения страницы и Worker, предположения контекста, версию фикстуры и видимый результат на собственной тестовой странице.
BotBrowser не заставляет сайт принять подсказку, выдать разрешение или убрать политику источника и не подтверждает успех производственного аккаунта или транзакции. Контролируемый контекст не оправдывает полный отпечаток. Сопоставляйте наблюдение с семантикой W3C/MDN и проверками приложения, указывая версию, источник, политику и запасной путь.
Терпимый парсер и разделение ответственности. Марки GREASE расширяемы: принимайте неизвестные марки и любой порядок, игнорируйте будущие поля. Отсутствие API не означает mobile: false; храните явное состояние «сигнал недоступен». Сервер принимает решение по заголовкам до JavaScript, страница проверяет возможности. Если ответ зависит от подсказки, укажите Vary и проверьте холодный и прогретый кэш.
Синтетическая фикстура, редиректы и кэш. Создайте собственную страницу, показывающую только проверяемые поля и видимый статус для доступного, отсутствующего, отклонённого и задержанного состояния. Проверьте первую, перенаправленную и повторную навигацию с прогретым кэшем; сверяйте Accept-CH, ключи и Vary, чтобы представление одного контекста не попало в другой. Используйте синтетический текст без аккаунта и production endpoint и проверяйте сохранение ввода в запасном пути.
Worker, iframe и доступность. Добавьте проверки Worker и iframe, если продукт их использует: подмена на странице не доказывает паритет контекстов. Запасной элемент должен иметь подпись, работать с клавиатурой и сообщать статус; после отсутствия или отказа переместите фокус и игнорируйте поздний результат после выбора пользователя.
Наблюдаемость и хранение. Храните нормализованные состояния (hint-present, hint-denied, api-missing, fallback-used), заявленную версию, класс источника, ревизию фикстуры и следующую дату проверки. Для каждого поля высокой энтропии назначьте владельца и срок удаления; не сохраняйте дампы navigator, шрифты, renderer, аккаунты, геолокацию или сырой ввод.
Выпуск, откат и запись миграции. Выпускайте парсер за обратимо изменяемой настройкой, сравнивайте старое и новое решение на синтетических запросах и возвращайтесь к запасному пути при отсутствующей или неверной подсказке. Запись должна назвать решение, минимальный сигнал, использованные спецификацию и MDN, версии, контексты, владельца запасного пути и различие между заголовком, страницей, Worker и подтверждением приложения. Назначьте пересмотр после крупного релиза, изменения CDN или новой встроенной интеграции.
Не-Chromium и старые клиенты. Firefox, Safari, встроенные WebView, средства приватности и старые версии могут отправлять только сокращённую строку или не отправлять сигнал. Запасной путь - решение продукта, а не догадка по названию браузера: общий пакет, адаптивный CSS или явный выбор безопаснее таблицы моделей. Пишите «подсказка недоступна», а не «устройство не поддерживается».
Коммуникация и границы обёрток. Сообщите поддержке, какое наблюдение допустимо запросить: например, отсутствует Sec-CH-UA-Platform, показан адаптивный запасной вариант. Не просите полный дамп, инвентарь или снимок аккаунта. Опция фреймворка может изменить строку страницы, скрыть исключение или отложить вызов, но не меняет автоматически заголовки, область Worker или политику источника. Держите браузерную фикстуру и пользовательский сценарий раздельно.
Что миграция не решает и примеры. Она не идентифицирует каждый браузер, не заставляет сервер принять заголовок, не гарантирует разрешение и не доказывает конкретную ОС. Используйте синтетические значения и грубые метки версии, а не реальные заголовки; пересматривайте примеры при изменении сокращённой строки или появлении подсказки.
Владельцы и проверка. Назначьте владельцев серверного парсера, запасного пути страницы и проверки приватности. Запишите ожидаемый переход и дату следующей проверки; сообщайте границу («заголовок отсутствует, показан адаптивный запасной вариант»), а не обвиняйте браузер. Пусть заметку проверят инженеры и специалисты по приватности с указанием цели, минимального сигнала, владельца хранения и условия нового пересмотра.
Практический итог
Начинайте с решения пользователя, а не с нового парсера. Используйте проверку возможностей, UA-CH низкой энтропии для общего серверного решения и высокую энтропию только при конкретном обосновании. Тестируйте отсутствие, отказ, задержку и запасной путь, сохраняйте ввод и отделяйте браузерное свидетельство от успеха приложения. Это уменьшает хрупкие предположения в пределах доказуемого контекстом.
Источники
Похожие статьи
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.