Управление cookies в браузере для мультиидентификационных рабочих процессов
Как управлять cookies для сохранения сессий, межсессионной непрерывности и изоляции идентичностей в автоматизированных браузерных рабочих процессах.
Нужна поддерживаемая продуктовая документация?
У этой статьи есть соответствующая страница в центре документации. Используйте docs для каноничного сценария настройки, актуальных флагов и долгосрочной справки.
Введение
Cookies - краеугольный камень того, как веб-браузеры поддерживают состояние. Они несут токены сессий, пользовательские настройки, записи о согласии и учётные данные аутентификации между загрузками страниц и визитами. При создании браузерных профилей для исследования конфиденциальности, тестирования или управления несколькими аккаунтами контроль над уровнем cookies так же важен, как и контроль над уровнем отпечатка. Браузер с согласованным отпечатком, но пустыми cookies каждый раз выглядит как свежая установка, а это не то, как ведут себя реальные браузеры.
BotBrowser предоставляет флаг --bot-cookies (уровень PRO) для предварительной загрузки cookies при запуске. Это означает, что cookies присутствуют до первой навигации, до выполнения любого JavaScript и до того, как какие-либо скрипты отслеживания смогут проверить состояние браузера. В сочетании с профилями отпечатков и другими сигналами идентичности управление cookies завершает картину реалистичной, устойчивой браузерной идентичности.
Влияние на конфиденциальность: почему управление cookies важно
Веб-сайты и системы отслеживания не оценивают cookies изолированно. Они анализируют связь между cookies и другими сигналами браузера. Браузер, который предъявляет отпечаток вернувшегося пользователя, но не несёт cookies, вызывает вопросы. Аналогично, браузер с сессионными cookies, но абсолютно новым отпечатком выглядит несогласованно.
Для исследователей конфиденциальности, изучающих, как системы отслеживания коррелируют сигналы браузера, контроль cookies необходим. Он позволяет проверить, связывает ли система отслеживания сессии только на основе cookies, только на основе отпечатков или их комбинации. Для управления несколькими аккаунтами каждой идентичности нужно собственное хранилище cookies, сохраняющееся между сессиями, чтобы поддерживать состояние входа и избегать повторных процедур аутентификации.
Управление cookies также важно для тестирования баннеров согласия cookies, процедур соответствия GDPR и поведения сайтов для вернувшихся и новых посетителей. Без предварительной загрузки cookies каждая сессия начинается как «новый посетитель», что делает невозможным тестирование опыта вернувшегося пользователя.
Техническая справка
Как браузеры хранят cookies
Chromium хранит cookies в базе данных SQLite внутри директории пользовательских данных. При запуске браузер загружает cookies из этой базы в память. Каждая cookie имеет несколько атрибутов:
- Domain и Path: определяют, к каким запросам присоединяется cookie
- Name и Value: фактические данные, переносимые cookie
- Expiration: когда cookie должна быть удалена (сессионные cookies не имеют срока истечения)
- Флаг Secure: отправляется ли cookie только через HTTPS
- Флаг HttpOnly: может ли JavaScript получить доступ к cookie
- SameSite: управляет межсайтовым поведением cookies (Strict, Lax или None)
При загрузке страницы браузер присоединяет соответствующие cookies к каждому HTTP-запросу. JavaScript на странице также может читать и записывать cookies через document.cookie с учётом ограничений HttpOnly.
Проблема тайминга
Большинство фреймворков автоматизации предоставляют управление cookies через свои API. Playwright имеет context.addCookies(), а Puppeteer - page.setCookie(). Однако эти методы добавляют cookies после создания контекста браузера или страницы. Это означает, что самые первые сетевые запросы, включая начальную загрузку страницы и предварительные запросы, отправляются без этих cookies.
Этот временной разрыв важен, потому что некоторые системы отслеживания проверяют наличие cookies в первом запросе. Если первый запрос без cookies, а последующие их несут, несогласованность видна в серверных логах.
Флаг --bot-cookies в BotBrowser решает эту проблему, внедряя cookies до полной инициализации контекста браузера, делая их доступными с самого первого запроса.
Распространённые подходы и их ограничения
API cookies на уровне фреймворка
Playwright и Puppeteer оба предлагают управление cookies через свои API. Они хорошо работают для многих случаев, но имеют ограничения:
- Тайминг после инициализации: cookies, добавленные через API фреймворка, доступны только после создания контекста или страницы, пропуская начальную загрузку
- Привязка к контексту: cookies привязаны к контексту браузера, а не к экземпляру браузера. Несколько контекстов внутри одного экземпляра не разделяют cookies, если это не настроено явно
- Различия форматов: каждый фреймворк использует немного отличающиеся форматы объектов cookies, что затрудняет обмен данными cookies между инструментами
Ручное сохранение директории пользовательских данных
Другой подход - повторное использование одной и той же --user-data-dir между сессиями. Это автоматически сохраняет cookies, поскольку они хранятся в базе SQLite. Однако сохраняется и всё остальное состояние: кеш, локальное хранилище, IndexedDB, service workers и история просмотра. Этот подход не даёт гранулярного контроля над тем, какое состояние сохранять, а какое сбрасывать.
Расширения для управления cookies
Браузерные расширения могут управлять cookies, но они работают на неподходящем уровне привилегий для автоматизации. Они не могут внедрить cookies до загрузки первой страницы, а их наличие само по себе является обнаружимым сигналом.
Подход BotBrowser
BotBrowser реализует предварительную загрузку cookies на уровне движка через флаг --bot-cookies. Этот подход имеет несколько преимуществ перед описанными выше альтернативами.
Внедрение на уровне движка
Cookies, загруженные через --bot-cookies, вставляются в хранилище cookies браузера во время инициализации, до создания любого контекста браузера и до загрузки любой страницы. Это означает:
- Первый HTTP-запрос к любому домену уже несёт соответствующие cookies
- JavaScript, выполняющийся при загрузке страницы, может читать cookies через
document.cookie - Серверные системы отслеживания видят согласованное наличие cookies с самого первого запроса
Гибкие форматы ввода
Флаг --bot-cookies принимает данные cookies двумя способами:
Встроенный JSON для небольших наборов cookies или динамической генерации:
--bot-cookies='[{"name":"session","value":"abc123","domain":".example.com"}]'
Ссылка на файл с префиксом @ для больших наборов cookies:
--bot-cookies="@/path/to/cookies.json"
Файл должен содержать JSON-массив объектов cookies:
[
{
"name": "session_id",
"value": "abc123def456",
"domain": ".example.com",
"path": "/",
"expirationDate": 1774000000,
"secure": true,
"httpOnly": true,
"sameSite": "Lax"
},
{
"name": "user_pref",
"value": "dark_mode=1&lang=en",
"domain": ".example.com",
"path": "/",
"expirationDate": 1774000000,
"secure": false,
"httpOnly": false,
"sameSite": "None"
}
]
Изоляция идентичностей
Каждый экземпляр BotBrowser работает со своим собственным хранилищем cookies. Сопоставляя разные файлы cookies с разными профилями отпечатков, вы создаёте полностью изолированные браузерные идентичности, где и уровень отпечатка, и уровень cookies независимы.
Настройка и использование
Базовое использование через CLI
# Load cookies from a file
./chrome \
--bot-profile=/path/to/profile.enc \
--bot-cookies="@/path/to/cookies.json"
# Inline cookies
./chrome \
--bot-profile=/path/to/profile.enc \
--bot-cookies='[{"name":"consent","value":"granted","domain":".example.com"}]'
Интеграция с Playwright
const { chromium } = require('playwright-core');
(async () => {
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--bot-cookies=@/path/to/cookies.json',
],
headless: true,
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
// Cookies are already present from the first request
const cookies = await context.cookies();
console.log('Active cookies:', cookies.length);
await browser.close();
})();
Изоляция cookies по идентичностям
async function createIdentity(profilePath, cookiesPath) {
return chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
`--bot-profile=${profilePath}`,
`--bot-cookies=@${cookiesPath}`,
],
headless: true,
});
}
const userA = await createIdentity('/profiles/user-a.enc', '/cookies/user-a.json');
const userB = await createIdentity('/profiles/user-b.enc', '/cookies/user-b.json');
Экспорт cookies для сохранения сессии
Сохраняйте cookies в конце каждой сессии и загружайте их при следующем запуске:
// At the end of a session
const cookies = await context.cookies();
const fs = require('fs');
fs.writeFileSync('/cookies/user-a.json', JSON.stringify(cookies, null, 2));
// Next session: launch with --bot-cookies=@/cookies/user-a.json
Проверка
После запуска с --bot-cookies убедитесь, что cookies загружены правильно:
const page = await context.newPage();
// Check cookies are present before any navigation
const cookies = await context.cookies('https://example.com');
console.log('Pre-loaded cookies:', cookies.map(c => c.name));
// Navigate and verify cookies are sent with the request
await page.goto('https://example.com');
// Verify JavaScript-accessible cookies
const jsCookies = await page.evaluate(() => document.cookie);
console.log('JS-visible cookies:', jsCookies);
Вы также можете проверить заголовки начального запроса с помощью сетевого перехвата вашего фреймворка, чтобы убедиться, что cookies включены с самого первого запроса.
Лучшие практики
- Храните файлы cookies отдельно для каждой идентичности. Никогда не используйте один файл cookies для разных профилей отпечатков.
- Устанавливайте реалистичные сроки истечения. Cookies с далёкими датами истечения соответствуют нормальному поведению браузера. Избегайте дат в прошлом.
- Включайте стандартные cookies согласия. Токены согласия GDPR или cookies предотвращают появление баннеров согласия при каждом визите, соответствуя поведению вернувшегося пользователя.
- Ротируйте cookies вместе с профилями. При ротации профилей отпечатков обновляйте набор cookies для соответствия новой идентичности.
- Правильно используйте флаги HttpOnly и Secure. Установите флаги в соответствии с тем, что целевой сайт реально выставляет в заголовках
Set-Cookie. - Используйте префикс
@для путей к файлам. Это поддерживает чистоту команды запуска, особенно при работе с большим количеством cookies.
Часто задаваемые вопросы
Какой формат cookies принимает --bot-cookies?
Флаг принимает JSON-массив объектов cookies. Каждый объект должен содержать как минимум name, value и domain. Необязательные поля включают path, expirationDate, secure, httpOnly и sameSite. JSON можно передать встроенным или сослаться на файл с префиксом @.
Когда cookies становятся доступны относительно загрузки страницы?
Cookies, загруженные через --bot-cookies, доступны до первой навигации по странице. Они присутствуют в хранилище cookies во время инициализации браузера, поэтому даже самый первый HTTP-запрос их несёт.
Можно ли использовать --bot-cookies совместно с addCookies() в Playwright?
Да. Cookies из --bot-cookies загружаются первыми во время инициализации. Вы можете добавить дополнительные cookies позже с помощью context.addCookies() при необходимости. Оба метода дополняют друг друга.
Как экспортировать cookies для повторного использования в следующей сессии?
Используйте ваш фреймворк автоматизации для чтения cookies в конце сессии. В Playwright используйте context.cookies(). Сохраните результат в формате JSON, затем передайте его в --bot-cookies при следующем запуске.
Работает ли --bot-cookies с несколькими контекстами браузера?
Cookies, загруженные через --bot-cookies, доступны всем контекстам внутри экземпляра браузера. Если вам нужны разные cookies для разных контекстов, используйте API cookies фреймворка для конкретных контекстов для дополнительных cookies.
Какой уровень подписки требуется для --bot-cookies?
Флаг --bot-cookies доступен на уровне PRO.
Можно ли сочетать --bot-cookies с другими флагами идентичности?
Да. Сочетание --bot-cookies с --bot-bookmarks, --bot-inject-random-history и флагами локали/часового пояса создаёт полную браузерную идентичность с согласованным состоянием на всех уровнях.
Итоги
Управление cookies через --bot-cookies завершает уровень идентичности в BotBrowser, обеспечивая наличие cookies с самого первого запроса. В сочетании с профилями отпечатков и другими флагами идентичности это создаёт браузерные сессии, которые поддерживают согласованное состояние на всех уровнях.
По связанным темам смотрите Изоляция нескольких аккаунтов для запуска нескольких идентичностей, Настройка прокси для согласования сетевой идентичности с cookies и Управление профилями для совместной организации профилей и наборов cookies.
Похожие статьи
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.