User-Agent и Client Hints (UA-CH): полное руководство по управлению
Как строки User-Agent, заголовки Client Hints и navigator.userAgentData работают вместе, и как управлять ими согласованно на уровне движка.
Нужна поддерживаемая продуктовая документация?
У этой статьи есть соответствующая страница в центре документации. Используйте docs для каноничного сценария настройки, актуальных флагов и долгосрочной справки.
Введение
Строка User-Agent десятилетиями была краеугольным камнем идентификации браузера. Однако современная система идентичности браузера сложнее. Client Hints (UA-CH) предоставляют структурированные данные о браузере через HTTP-заголовки и JavaScript API. Заголовок Sec-CH-UA, navigator.userAgentData и getHighEntropyValues() раскрывают марку, платформу, версию и информацию об устройстве в стандартизированном формате. Когда эти значения не совпадают с традиционной строкой User-Agent, несогласованность создаёт характерный сигнал для отслеживания.
BotBrowser управляет всеми сигналами User-Agent и Client Hints через профили и CLI-переопределения. Профили задают базовую линию автоматически, а CLI-флаги обеспечивают контроль во время выполнения для пользовательских идентичностей. Эта статья объясняет, как UA и Client Hints работают вместе, какие сигналы важны и как их правильно настроить.
Влияние на конфиденциальность
User-Agent и Client Hints - одни из первых сигналов, которые получает сервер. Они приходят с начальным HTTP-запросом, до выполнения любого JavaScript. Это делает их основным вводом для серверного фингерпринтинга и отслеживания.
Риски конфиденциальности при несовпадении UA/Client Hints включают:
- Серверное обнаружение несогласованности: серверы сравнивают заголовок
User-Agentс заголовкамиSec-CH-UAв одном запросе. Несовпадение указывает на модификацию. - Сравнение JavaScript и заголовков: страницы могут сравнить
navigator.userAgentсnavigator.userAgentData.brandsи проверить согласованность. Любое расхождение отмечается. - Корреляция высокоэнтропийных значений:
getHighEntropyValues()возвращает подробную информацию о платформе, архитектуре и версии. Они должны соответствовать общей идентичности. - Согласованность между контекстами: значения UA должны быть одинаковы в основном потоке, web workers, service workers и HTTP-заголовках. Частичные подмены, затрагивающие только один контекст, создают обнаружимые пробелы.
BotBrowser обеспечивает согласованность по всем этим поверхностям, поскольку контролирует UA и Client Hints на уровне движка, до отправки любого запроса или выполнения любого JavaScript.
Техническая справка
Строка User-Agent
Традиционный заголовок User-Agent - длинная строка, идентифицирующая браузер, версию, ОС и движок рендеринга:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.7444.60 Safari/537.36
Эта строка отправляется с каждым HTTP-запросом и доступна через navigator.userAgent в JavaScript. Хотя браузеры постепенно сокращают информацию в строке UA (UA Reduction в Chrome), она остаётся значимым сигналом идентичности.
Client Hints (UA-CH)
Client Hints предоставляют ту же информацию в структурированном формате через HTTP-заголовки и JavaScript API:
Заголовки по умолчанию (отправляются с каждым запросом):
Sec-CH-UA: токены марки с основными версиями. Пример:"Chromium";v="142", "Google Chrome";v="142", "Not:A-Brand";v="99"Sec-CH-UA-Mobile: является ли устройство мобильным. Пример:?0Sec-CH-UA-Platform: операционная система. Пример:"Windows"
Высокоэнтропийные заголовки (отправляются только когда сервер запрашивает их через Accept-CH):
Sec-CH-UA-Full-Version-List: полные строки версий для всех марокSec-CH-UA-Platform-Version: версия ОС (например,"15.0.0"для Windows 11)Sec-CH-UA-Arch: архитектура CPU (например,"x86")Sec-CH-UA-Bitness: разрядность системы (например,"64")Sec-CH-UA-Model: модель устройства (преимущественно для мобильных)
JavaScript API (navigator.userAgentData):
// Low-entropy (always available, no permission needed)
navigator.userAgentData.brands // [{brand: "Chromium", version: "142"}, ...]
navigator.userAgentData.mobile // false
navigator.userAgentData.platform // "Windows"
// High-entropy (returns a Promise)
const data = await navigator.userAgentData.getHighEntropyValues([
'platformVersion', 'architecture', 'bitness',
'fullVersionList', 'model'
]);
Токены GREASE
Chromium добавляет рандомизированные токены «GREASE» (Generate Random Extensions And Sustain Extensibility) в Client Hints. Это намеренно невалидные имена марок, вставленные для предотвращения жёсткого кодирования серверами предположений о форматах токенов. Типичное значение Sec-CH-UA включает один токен GREASE:
"Not:A-Brand";v="99", "Chromium";v="142", "Google Chrome";v="142"
Формат, версия и позиция токена GREASE меняются между версиями браузера и марками. BotBrowser генерирует корректные токены GREASE для каждого профиля и конфигурации марки.
Требования к согласованности
Для правдоподобной браузерной идентичности необходимо согласование следующего:
- Заголовок
User-Agentсовпадает сnavigator.userAgent - Токены марки в
Sec-CH-UAсовпадают сnavigator.userAgentData.brands - Платформа в
Sec-CH-UA-Platformсовпадает сnavigator.userAgentData.platform - Основная версия в строке UA совпадает с версией в токенах марки
Sec-CH-UA - Полные версии в
Sec-CH-UA-Full-Version-Listсовпадают сgetHighEntropyValues().fullVersionList - Версия платформы реалистична для заявленной ОС (например, Windows 11 сообщает
"15.0.0"или выше) - Архитектура и разрядность соответствуют платформе (например,
x86/64для Windows,arm/64для Mac на M-серии) - Все значения одинаковы в основном потоке, workers и HTTP-заголовках
Распространённые подходы и их ограничения
Переопределение UA на уровне фреймворка
Playwright и Puppeteer предоставляют опции переопределения UA:
// Playwright
const context = await browser.newContext({
userAgent: 'Custom UA String'
});
// Puppeteer
await page.setUserAgent('Custom UA String');
Эти методы меняют navigator.userAgent и заголовок User-Agent, но не обновляют:
- Заголовки
Sec-CH-UA(всё ещё отражают реальную идентичность браузера) navigator.userAgentData.brands(без изменений)getHighEntropyValues()(возвращает реальные значения)- UA на уровне workers (может быть несогласованным)
Несовпадение между изменённой строкой UA и неизменёнными Client Hints легко обнаружимо.
CDP Network.setUserAgentOverride
CDP предоставляет Network.setUserAgentOverride с частичной поддержкой Client Hints:
await cdpSession.send('Network.setUserAgentOverride', {
userAgent: 'Custom UA',
userAgentMetadata: {
brands: [...],
platform: 'Windows',
// ...
}
});
Это более полный подход, чем переопределения на уровне фреймворка, но всё же имеет пробелы:
- Требует
Network.enable, что может влиять на фингерпринтинг - Должен быть настроен для каждой цели (страница, worker)
- Генерация токенов GREASE не автоматическая
- Согласование версий выполняется вручную и подвержено ошибкам
Ручная инъекция заголовков
Установка пользовательских заголовков через page.setExtraHTTPHeaders() может переопределить заголовки Sec-CH-UA, но JavaScript API (navigator.userAgentData) всё ещё возвращают исходные значения. Это создаёт несовпадение между HTTP-уровнем и JavaScript-уровнем идентичности.
Подход BotBrowser
Автоматическая конфигурация на основе профиля
Профили BotBrowser содержат полные конфигурации UA и Client Hints, захваченные из реальных браузерных сред. При загрузке профиля все сигналы согласуются автоматически:
chrome --bot-profile="/path/to/profile.enc"
Профиль задаёт:
- Строку User-Agent (заголовок и JavaScript)
- Все заголовки Client Hints по умолчанию
- Все высокоэнтропийные значения Client Hints
- navigator.userAgentData (brands, platform, mobile)
- Токены GREASE, соответствующие версии браузера
- Согласованные значения в основном потоке, workers и HTTP-заголовках
Никакие дополнительные флаги не нужны для стандартной настройки UA/Client Hints.
CLI-переопределения для пользовательских идентичностей
Когда вам нужно создать пользовательскую идентичность за пределами того, что предоставляет профиль, BotBrowser предлагает гранулярные CLI-флаги:
Основные флаги идентичности:
--bot-config-browser-brand=chrome|edge|brave|opera|webview(ENT Tier2): переключение марки браузера--bot-config-ua-full-version=142.0.7444.60(ENT Tier2): установка полной версии Chromium--bot-config-brand-full-version=142.0.3595.65(ENT Tier2): установка версии, специфичной для марки (для Edge, Opera и т.д.)
Флаги платформы и устройства (ENT Tier3):
--bot-config-platform=Windows|Android|macOS|Linux: название платформы--bot-config-platform-version=13: строка версии ОС--bot-config-model=SM-G991B: модель устройства (мобильные)--bot-config-architecture=x86|arm|arm64: архитектура CPU--bot-config-bitness=32|64: разрядность системы--bot-config-mobile=true|false: флаг мобильного устройства
Пользовательский User-Agent с заполнителями:
Флаг --user-agent поддерживает заполнители, которые заменяются во время выполнения:
chrome --bot-profile="/path/to/profile.enc" \
--user-agent="Mozilla/5.0 (Linux; Android {platform-version}; {model}) AppleWebKit/537.36 Chrome/{ua-full-version} Mobile Safari/537.36" \
--bot-config-platform=Android \
--bot-config-platform-version=13 \
--bot-config-model=SM-G991B \
--bot-config-ua-full-version=142.0.7444.60
BotBrowser заменяет {platform-version}, {model} и {ua-full-version} соответствующими значениями флагов, а затем автоматически генерирует согласованные navigator.userAgentData и все заголовки Client Hints.
Согласованность по всем поверхностям
BotBrowser обеспечивает согласованность UA/Client Hints по:
- HTTP-заголовкам: все заголовки
User-AgentиSec-CH-UA-*в каждом запросе - JavaScript основного потока:
navigator.userAgent,navigator.userAgentData - Web Workers:
navigator.userAgentиnavigator.userAgentDataв контекстах workers - Service Workers: те же значения доступны в области service worker
- Высокоэнтропийным значениям:
getHighEntropyValues()возвращает значения, согласованные со всеми другими сигналами
Настройка и использование
Стандартное использование профиля
Для большинства сценариев профиль обрабатывает всё:
chrome --bot-profile="/path/to/profile.enc"
Переопределение марки с согласованием версий
При смене марки согласуйте версии:
chrome --bot-profile="/path/to/profile.enc" \
--bot-config-browser-brand=edge \
--bot-config-brand-full-version=142.0.3595.65
Пример проверки с Playwright
const { chromium } = require('playwright-core');
(async () => {
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
],
headless: true,
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
// Verify UA string
const ua = await page.evaluate(() => navigator.userAgent);
console.log('User-Agent:', ua);
// Verify low-entropy Client Hints
const brands = await page.evaluate(() =>
navigator.userAgentData.brands.map(b => `${b.brand} v${b.version}`)
);
console.log('Brands:', brands);
// Verify high-entropy Client Hints
const highEntropy = await page.evaluate(async () => {
return await navigator.userAgentData.getHighEntropyValues([
'platformVersion', 'architecture', 'bitness',
'fullVersionList', 'model'
]);
});
console.log('Platform:', highEntropy.platform);
console.log('Platform Version:', highEntropy.platformVersion);
console.log('Architecture:', highEntropy.architecture);
console.log('Bitness:', highEntropy.bitness);
console.log('Full Version List:', highEntropy.fullVersionList);
await browser.close();
})();
Пример проверки с Puppeteer
const puppeteer = require('puppeteer-core');
(async () => {
const browser = await puppeteer.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--bot-config-browser-brand=edge',
],
headless: true,
defaultViewport: null,
});
const page = await browser.newPage();
await page.goto('https://example.com');
const ua = await page.evaluate(() => navigator.userAgent);
const brands = await page.evaluate(() =>
navigator.userAgentData.brands.map(b => b.brand)
);
console.log('User-Agent:', ua);
console.log('Brands:', brands);
await browser.close();
})();
Проверка
После настройки UA и Client Hints проверьте согласованность:
- Убедитесь, что
navigator.userAgentсодержит правильное имя и версию браузера - Проверьте, что
navigator.userAgentData.brandsсодержит правильные токены марки - Подтвердите, что заголовки
Sec-CH-UAсовпадают с марками, сообщаемыми через JavaScript - Протестируйте
getHighEntropyValues()на корректность платформы, архитектуры и версии - Проверьте согласованность в контексте Web Worker
Распространённые подводные камни:
- Windows 11 и Windows 10:
Sec-CH-UA-Platform-Version, начинающаяся с"15.0.0", указывает на Windows 11. Более низкие значения указывают на Windows 10. Значение должно совпадать со строкой версии Windows в User-Agent. - Порядок токенов марки: каждая марка имеет определённый порядок. Проверьте, что токен GREASE, токен Chromium и токен марки появляются в правильной последовательности.
- Согласование номеров версий: основная версия в строке UA должна совпадать с основной версией в токенах марки
Sec-CH-UA.
Лучшие практики
-
Предпочитайте профили ручной настройке. Профили захватывают полные, согласованные конфигурации UA/Client Hints из реальных браузеров. Ручная настройка требует тщательного согласования версий.
-
Не используйте переопределения UA в Playwright/Puppeteer. Эти переопределения на уровне фреймворка меняют только строку UA, а не Client Hints. С профилями BotBrowser они вам не нужны.
-
Используйте реалистичные версии. Используйте актуальные, текущие версии браузеров. Устаревшие версии необычны и привлекают внимание.
-
Согласуйте версии, специфичные для марки. При использовании
--bot-config-browser-brand=edgeустановите--bot-config-brand-full-versionна реальную версию Edge, соответствующую основной версии Chromium. -
Тестируйте с инструментами проверки отпечатков. Убедитесь, что все сигналы UA и Client Hints согласованы после каждого изменения конфигурации.
-
Регулярно обновляйте профили. Версии браузеров меняются часто. Используйте актуальные профили для соответствия версиям, которые используют большинство пользователей.
Часто задаваемые вопросы
Обрабатывает ли BotBrowser сокращение UA (уменьшённая строка User-Agent в Chrome)? Да. Профили BotBrowser отражают реальный формат строки UA версии браузера, которую они представляют, включая любые изменения UA Reduction.
Можно ли задать разные значения UA для разных контекстов браузера?
Настройка UA для конкретного контекста доступна через опцию userAgent в Playwright, но это меняет только строку UA. Для полной согласованности Client Hints используйте отдельные экземпляры браузера с разными профилями или настройками марки.
Что происходит, если задать --user-agent без флагов Client Hints?
BotBrowser будет использовать пользовательскую строку UA, но выводить Client Hints из профиля. Если пользовательская строка UA несогласована с Client Hints профиля, может возникнуть несовпадение. Лучше использовать синтаксис заполнителей с соответствующими флагами --bot-config-*.
Работает ли navigator.userAgentData в workers?
Да. BotBrowser гарантирует, что navigator.userAgentData возвращает согласованные значения в основном потоке, web workers и service workers.
Как BotBrowser обрабатывает токены GREASE? BotBrowser генерирует токены GREASE, соответствующие паттернам, наблюдаемым в реальных экземплярах браузера для каждой марки и версии. Формат, номер версии и позиция GREASE корректны.
Можно ли использовать пользовательские строки UA со специальными символами?
Да. Флаг --user-agent принимает произвольные строки. При использовании заполнителей, таких как {platform-version}, они заменяются значениями из соответствующих флагов.
Зависит ли getHighEntropyValues() от согласия пользователя?
В стандартном Chromium getHighEntropyValues() возвращает Promise, разрешающийся с запрошенными значениями. Профили BotBrowser включают все высокоэнтропийные значения из исходного браузера, поэтому Promise разрешается с согласованными данными, определёнными профилем.
А как насчёт заголовка Sec-CH-UA-WoW64? BotBrowser включает все стандартные заголовки Client Hints для платформы. Подсказки, связанные с WoW64, корректно задаются для профилей Windows, где это применимо.
Итоги
Строки User-Agent и Client Hints составляют сетевой фундамент идентичности браузера. BotBrowser управляет ими через профили, которые захватывают реальные конфигурации браузеров, и CLI-флаги для настройки во время выполнения. Все сигналы, от HTTP-заголовков до JavaScript API и контекстов workers, автоматически согласованы.
Для управления идентичностью марки смотрите Переключение марки браузера. Для географической идентичности смотрите Настройка часового пояса, локали и языка. Для полной изоляции идентичностей смотрите Изоляция нескольких аккаунтов.
Похожие статьи
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.