logo
GeekFormat

Анализатор Set-Cookie

Set-Cookie Parser

Вставьте многострочные заголовки ответа Set-Cookie для проверки атрибутов и выявления опасных комбинаций SameSite / Secure.

Карточки атрибутов Cookie

2 Set-Cookie
#1sessionabc123
path/
httponly(флаг)
secure(флаг)
samesiteLax
Явных проблем с атрибутами не обнаружено
#2preview1
max-age600 (10m 0s)

setCookieParser.attr.maxAgeHint

samesiteNone
secure(флаг)
setCookieParser.warn.missingHttpOnlysetCookieParser.warn.missingPath

Предпросмотр JSON

[
  {
    "index": 0,
    "raw": "session=abc123; Path=/; HttpOnly; Secure; SameSite=Lax",
    "name": "session",
    "value": "abc123",
    "decodedValue": "abc123",
    "attributes": [
      {
        "key": "path",
        "value": "/"
      },
      {
        "key": "httponly",
        "value": null
      },
      {
        "key": "secure",
        "value": null
      },
      {
        "key": "samesite",
        "value": "Lax"
      }
    ],
    "attributeMap": {
      "path": "/",
      "httponly": true,
      "secure": true,
      "samesite": "Lax"
    },
    "warnings": []
  },
  {
    "index": 1,
    "raw": "preview=1; Max-Age=600; SameSite=None; Secure",
    "name": "preview",
    "value": "1",
    "decodedValue": "1",
    "attributes": [
      {
        "key": "max-age",
        "value": "600"
      },
      {
        "key": "samesite",
        "value": "None"
      },
      {
        "key": "secure",
        "value": null
      }
    ],
    "attributeMap": {
      "max-age": "600",
      "samesite": "None",
      "secure": true
    },
    "warnings": [
      "warn.missingHttpOnly",
      "warn.missingPath"
    ]
  }
]

Вставьте заголовок Set-Cookie и сразу узнайте, почему браузер не принимает ваш Cookie.

Похожие

Варианты использования

  • Когда браузер отказывается записывать Cookie, быстро определите — проблема в политике SameSite, отсутствии флага Secure или несоответствии Path/Domain
  • В сценариях стороннего входа/SSO/встраивания в iframe, когда Cookie блокируются браузером, проверьте, правильно ли SameSite=None сопровождается Secure
  • При аудите безопасности пакетно проверяйте, все ли возвращаемые API Cookie имеют установленный HttpOnly для предотвращения кражи через XSS и установленный Secure для предотвращения передачи по HTTP в открытом виде
  • При использовании Cookie с префиксами __Host-/__Secure- проверяйте, соответствуют ли они обязательным требованиям RFC 6265bis, чтобы избежать их тихого отклонения браузером
  • При отладке решения разделения сторонних Cookie CHIPS (Partitioned Cookie) убедитесь, что Partitioned и Secure объявлены вместе
  • При настройке Max-Age/Expires на сервере подтвердите, что значения действительны, чтобы избежать немедленного истечения Cookie из-за смещения часов или Max-Age=0
  • Сравнивайте различия в заголовках Set-Cookie между окружениями (разработка/тестирование/продакшен) для диагностики странных проблем, когда Cookie работают в разработке, но пропадают в продакшене
  • Копируйте целые блоки заголовков ответа из DevTools или curl без необходимости вручную удалять префикс Set-Cookie: — инструмент автоматически определяет и удаляет его
  • При написании документации API или отладке багов, связанных с запросами WASM/WebWorker, вставляйте проанализированный результат JSON прямо в документацию для иллюстрации структуры Cookie

Функции

  • Независимый анализ нескольких Cookie: каждая строка Set-Cookie превращается в отдельную карточку с нумерацией, отображающую имя, значение и декодированное URL-значение, позволяя сразу определить проблемный Cookie
  • 14 проверок безопасности атрибутов: автоматически определяет распространённые ошибки, такие как SameSite=None без Secure, недопустимое значение SameSite, Partitioned без Secure, отсутствие HttpOnly, отсутствие Path, отсутствие SameSite, нарушение префикса __Host-, __Secure- без Secure, недействительный/нулевой Max-Age, Domain начинающийся с точки, Expires без Max-Age и др.
  • Полная детализация всех атрибутов: SameSite, Secure, HttpOnly, Path, Domain, Expires, Max-Age, Partitioned перечислены по пунктам, флаговые атрибуты и атрибуты со значением чётко различаются
  • Автоматический пересчёт Max-Age: преобразует секунды в удобочитаемое время (дни/часы/минуты/секунды), например Max-Age=2592000 отображается как 30d
  • Автоматическое отображение декодированного URL-значения: если значение Cookie содержит кодировку %XX, автоматически отображает декодированный исходный текст (например sessionID%3Dabc → sessionID=abc) с зелёной стрелкой
  • Проверка префиксов RFC 6265bis: строго проверяет требования соответствия для Cookie с префиксами __Host- и __Secure-, включая Path=/, запрет Domain и обязательность Secure
  • Копирование исходных заголовков в один клик: копирует все проанализированные исходные строки Cookie сразу для удобной вставки в письма, задачи (issues) или документы для команды
  • Структурированный предпросмотр JSON: результаты анализа поддерживают вывод в формате JSON с полными полями name/value/decodedValue/attributes/attributeMap/warnings, пригодными для непосредственного использования в скриптах и тест-кейсах
  • Полностью локальная обработка: содержимое Set-Cookie анализируется локально в браузере, не загружается ни на какие серверы, что предотвращает утечку чувствительных Session, Token и другой информации
  • Интеллектуальные бейджи предупреждений: каждая проблема помечается оранжевым бейджем предупреждения с указанием конкретной причины, не требуя сверки с документацией RFC по пунктам
  • Пакетный ввод из нескольких строк: вставляйте сразу весь блок заголовков ответа (например, скопированный из панели Network Chrome DevTools), автоматически удаляет префикс Set-Cookie: и анализирует построчно
  • Поддержка значений в кавычках и с точкой с запятой: корректно обрабатывает значения Cookie в двойных кавычках и точки с запятой в датах Expires согласно спецификации RFC, без ошибочного разделения

Как использовать

  1. Откройте панель Network в DevTools браузера, найдите целевой запрос, скопируйте содержимое Set-Cookie в области Response Headers (поддерживается несколько строк, копируйте все Cookie сразу)
  2. Вставьте скопированные заголовки ответа Set-Cookie в область ввода, по одному Cookie на строку (не нужно вручную удалять префикс Set-Cookie:, инструмент удалит его автоматически)
  3. Инструмент анализирует в реальном времени: вверху отображается количество распознанных Set-Cookie, внизу каждый Cookie представлен отдельной карточкой атрибутов
  4. В шапке карточки отображаются номер, имя Cookie и исходное значение; если значение содержит URL-кодировку, после зелёной стрелки отображается декодированное значение
  5. В основной части карточки по пунктам отображаются атрибуты SameSite, Secure, HttpOnly, Path, Domain, Max-Age, Expires, Partitioned и др. Max-Age автоматически дополняется пересчётом в удобочитаемое время в скобках
  6. В нижней части карточки отображается результат проверки: оранжевые бейджи предупреждений отмечают конкретные проблемы (каждая проблема имеет чёткое описание на русском языке), зелёные бейджи означают, что явных проблем не обнаружено
  7. При необходимости сверки с конфигурацией сервера нажмите «Копировать исходные заголовки», чтобы скопировать все исходные строки Set-Cookie; для программной обработки обратитесь к «Предпросмотру JSON»

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

Почему заголовок Set-Cookie успешно установлен, но браузер не сохранил мой Cookie?

Это самая распространённая проблема: браузер не выдаёт ошибку активно, а просто тихо отклоняет не соответствующие требованиям Cookie. Частые причины: SameSite=None без Secure, Secure Cookie устанавливается с HTTP-страницы (кроме localhost), префиксы __Host-/__Secure- не удовлетворяют ограничениям, несоответствие Domain/Path, превышен лимит 4КБ, Max-Age равен 0 или отрицательный. Рекомендуется сначала вставить Set-Cookie в этот инструмент, чтобы определить конкретную причину по бейджам предупреждений, затем открыть Chrome DevTools → Application → Cookies, проверить под соответствующим доменом наличие жёлтого треугольника предупреждения — при наведении курсора вы увидите конкретную причину отклонения.

В чём разница между Strict, Lax и None для SameSite? Когда какое использовать?

Strict полностью запрещает межсайтовую отправку, самый безопасный вариант, но пользователь будет выглядеть неавторизованным при переходе по внешним ссылкам, подходит для Cookie чувствительных операций (платежи, смена пароля). Lax — значение по умолчанию в Chrome 80+, разрешает отправку при навигации GET верхнего уровня (переход по внешней ссылке на ваш сайт), но не отправляется в подресурсах iframe/img/script/XHR/POST-формах, является рекомендуемым значением для большинства сценариев. None разрешает отправку во всех межсайтовых сценариях (используется для единого входа SSO, сторонних встраиваний в iframe, межсайтовых вызовов API), но требует обязательной установки Secure, иначе браузер отклоняет напрямую.

Почему SameSite=None обязательно должен сопровождаться Secure?

Это правило, введённое Chrome начиная с версии 80 (февраль 2020), за которым последовали Firefox, Edge и Safari. Поскольку SameSite=None явно разрешает межсайтовую отправку Cookie, злоумышленникам проще проводить CSRF или подслушивание в межсайтовых сценариях, поэтому необходимо сопровождать Secure (зашифрованная передача по HTTPS) для снижения рисков. Если ваш SameSite=None Cookie устанавливается по HTTP, браузер отбросит его без сохранения. Этот инструмент обнаруживает комбинацию SameSite=None без Secure и помечает красным предупреждением.

Что использовать: Max-Age или Expires? В чём разница?

Предпочитайте Max-Age. Max-Age — относительное время (истекает через N секунд), не зависит от часов клиента, браузер начинает обратный отсчёт сразу после получения; Expires — абсолютный момент времени, зависит от локального времени компьютера пользователя (если пользователь переведёт часы на 1970 год, Cookie немедленно истечёт). При наличии обоих Max-Age имеет более высокий приоритет (чётко определено в RFC 6265). Если ни один не установлен, Cookie становится «сессионным Cookie», который истекает при закрытии браузера. Этот инструмент даёт подсказку, если Expires установлен, а Max-Age нет, рекомендуя добавить Max-Age. Обратите внимание, что единица измерения Max-Age — секунды, а не миллисекунды.

В чём разница между Path=/ и отсутствием настройки Path?

Path определяет, в каких URL-путях браузер будет отправлять этот Cookie в запросах. Если Path не установлен, браузер по умолчанию использует «путь URL ответа без последнего сегмента». Например, при установке Cookie из /api/user/login Path по умолчанию — /api/user/, поэтому в запросах путей / и /order/ этот Cookie отправляться не будет. Явная установка Path=/ делает Cookie действующим для всего сайта. Обратите внимание, что сопоставление Path — это сопоставление префикса: Path=/api также будет соответствовать /api/, /api/user, /api/v2/abc и т.д. Cookie с префиксом __Host- в обязательном порядке требуют Path=/.

В чём разница между Domain с точкой в начале (например .example.com) и без точки?

В современных браузерах (актуальные версии Chrome, Firefox, Edge, Safari) оба варианта уже эквивалентны: оба заставляют Cookie действовать для example.com и всех его поддоменов (a.example.com, b.c.example.com). Точка в начале — устаревший синтаксис времён RFC 2109, RFC 6265 чётко указывает, что начальная точка игнорируется. Тем не менее, для читаемости рекомендуется писать без точки. Этот инструмент даёт подсказку, если Domain начинается с точки (не ошибка, но устаревший синтаксис). Обратите внимание: без установленного Domain Cookie действует только для текущего хоста (поддомены не получают его), при установленном Domain начинает действовать для поддоменов.

Что такое префиксы __Host- и __Secure-? Можно ли работать без префиксов?

Это префиксы безопасности имён Cookie, введённые в RFC 6265bis для задания жёстких ограничений высокобезопасным Cookie: когда браузер видит, что имя Cookie начинается с __Host-, он в обязательном порядке требует установки Secure, Path=/ и отсутствия атрибута Domain — при невыполнении любого условия отклоняет сохранение напрямую; префикс __Secure- требует обязательной установки Secure, остальные атрибуты могут быть настроены. Работа без префиксов также возможна (большинство Cookie не используют префиксы), но для высокобезопасных Cookie, таких как идентификаторы сессии, токены авторизации, настоятельно рекомендуется использовать префикс __Host-, поскольку он предотвращает атаки внедрения Cookie на уровне поддоменов/путей. Этот инструмент автоматически проверяет соответствие обоих префиксов.

Действительно ли Cookie с HttpOnly безопасен? Защищает ли от XSS и CSRF?

HttpOnly запрещает JavaScript считывать значения Cookie через document.cookie, являясь важной линией обороны для <strong>снижения риска кражи сессии через XSS</strong>, но не является панацеей: XSS-злоумышленники всё равно могут выполнять запросы в браузере пользователя (запросы автоматически несут Cookie) для совершения действий (это сфера CSRF); HttpOnly также не защищает от CSRF-атак (требуется SameSite или CSRF Token). Только одновременное использование триады HttpOnly+Secure+SameSite=Lax/Strict обеспечивает базовый уровень безопасности. Чувствительные Cookie (session, JWT, access_token) обязательно должны быть HttpOnly, не давайте доступ к ним из фронтенд JS без необходимости. Этот инструмент помечает предупреждением Cookie без HttpOnly.

Что такое Partitioned (CHIPS) Cookie? Когда нужно использовать?

Partitioned — это новый атрибут, представленный Chrome в связи с отключением сторонних Cookie, полное название Cookies Having Independent Partitioned State (CHIPS). Традиционные сторонние Cookie (например, рекламы/встраиваемых сервисов, устанавливаемые на нескольких сайтах) являются глобально общими и могут использоваться для межсайтового отслеживания пользователей. С Partitioned браузер хранит сторонний Cookie отдельно для каждого сайта верхнего уровня: сторонний Cookie, который пользователь видит на Сайте А, полностью независим от того, что видит на Сайте Б, и не может разделять идентичность между сайтами. Сценарии использования: встроенные компоненты видео/карт/оплаты, сторонние плагины поддержки, межсайтовый SSO, встроенный в iframe. Использование Partitioned требует обязательной установки Secure, рекомендуется с префиксом __Host-.

Какой максимальный объём может хранить один Cookie? Сколько Cookie может быть на один домен?

Согласно RFC 6265, браузеры должны поддерживать как минимум 4096 байт на Cookie (включая имя, значение и атрибуты), основные браузеры (Chrome/Firefox/Safari/Edge) придерживаются этого лимита — содержимое сверх лимита усекается или отбрасывается тихо. Ограничения по количеству различаются в зависимости от браузера: Chrome — около 180 на домен, Firefox — около 150, Safari — около 600 (и подвержен влиянию политики семидневной очистки ITP); при превышении браузер удаляет самые старые Cookie по политике LRU. Рекомендуется хранить в Cookie только идентификаторы сессии, не помещайте в Cookie большие объёмы бизнес-данных (бизнес-данные размещайте в localStorage или серверной сессии).

Поддерживает ли инструмент копирование Set-Cookie напрямую из Chrome DevTools для анализа? Нужно ли вручную удалять префикс?

Полностью поддерживает, без необходимости ручной обработки. Вы можете нажать на целевой запрос в панели Network Chrome DevTools, кликнуть правой кнопкой мыши по значению Set-Cookie в области Response Headers, чтобы напрямую скопировать (для нескольких строк Ctrl/⌘+клик для множественного выбора или скопируйте весь блок) и вставить в область ввода этого инструмента. Инструмент автоматически удаляет префикс Set-Cookie: из начала каждой строки (без учёта регистра), автоматически обрабатывает пробельные символы в начале/конце строк, корректно обрабатывает специальные символы вроде запятых и точек с запятой в датах Expires, а также корректно обрабатывает значения Cookie в двойных кавычках.

Почему китайские или специальные символы в значениях Cookie становятся вида %XX?

RFC 6265 требует, чтобы значения Cookie использовали только безопасное подмножество набора символов ASCII, и не могут напрямую содержать не-ASCII символы, пробелы, запятые, точки с запятой и т.д. Многие серверные фреймворки при установке Cookie автоматически выполняют URL-кодировку (encodeURIComponent/Percent-encoding) для не-ASCII символов. Браузеры при отправке обратно также сохраняют закодированную форму. Когда этот инструмент обнаруживает, что значение содержит кодировку %XX, он автоматически отображает исходный текст, декодированный через decodeURIComponent рядом с исходным значением зелёной стрелкой, для удобства просмотра реального содержимого.

В чём разница между Set-Cookie и заголовком запроса Cookie?

Это заголовки совершенно разных направлений: Set-Cookie — заголовок ответа (сервер→браузер), появляется только в ответах, может встречаться несколько раз, каждый раз устанавливая один Cookie с полными атрибутами (Secure/HttpOnly/Path/Domain и т.д.); Cookie — заголовок запроса (браузер→сервер), появляется в запросе только один раз, содержит плоский список пар name=value всех Cookie, соответствующих текущей области действия (name1=v1; name2=v2), полностью без информации об атрибутах. То есть сервер не может знать из запроса, установлен ли у конкретного Cookie HttpOnly или Secure — информация об атрибутах сохраняется браузером только при локальном хранении. Для анализа заголовка Cookie в запросах используйте сопутствующий <a href='/network/http-cookie-parser/'>Анализатор заголовка запроса Cookie</a>.

Почему в Safari мои Cookie исчезают через несколько дней?

Это работает механизм интеллектуальной защиты от отслеживания Safari (ITP: Intelligent Tracking Prevention). Начиная с ITP 2.1, если пользователь не взаимодействует напрямую с доменом в течение 7 дней (то есть не посещал напрямую сайт этого домена), Safari очищает все Cookie и данные сайтов под этим доменом, независимо от того, насколько большой Max-Age/Expires установлены. Это в наибольшей степени затрагивает встроенные сторонние сервисы, в то время как Cookie основного сайта не затрагиваются, пока пользователь продолжает его посещать. Кроме того, ограничения Safari на сторонние Cookie строже чем у Chrome. Решения включают: использование атрибута Partitioned, запрос разрешения через Storage Access API или обновление Cookie при посещении пользователем основного сайта. Раздел устранения неполадок этого инструмента содержит более подробные указания по отладке в Safari.

Поддерживает ли инструмент пакетный анализ нескольких Set-Cookie? Отправляется ли содержимое Cookie на серверы?

Поддерживает пакетный анализ. Область ввода поддерживает вставку любого количества строк Set-Cookie (например, вставку сразу всего блока заголовков ответа), каждый Set-Cookie анализируется с независимой нумерацией, несколькими карточками атрибутов, отдельно отображающими атрибуты и предупреждения. Весь процесс анализа выполняется полностью локально в вашем браузере (чистая фронтенд-обработка JavaScript), содержимое Cookie не отправляется ни на какие серверы, не выполняется никаких сетевых запросов — чувствительная информация вроде Session/Token, которую вы вставляете, не покидает ваш компьютер, можно использовать спокойно.

术语表

Set-Cookie
Заголовок ответа HTTP, через который сервер предписывает браузеру сохранить Cookie, может встречаться в ответе несколько раз.
Cookie (заголовок запроса)
Заголовок запроса HTTP, список пар имя-значение Cookie, соответствующих требованиям области действия, автоматически добавляемый браузером, без атрибутов.
HttpOnly
Флаг атрибута Cookie. При установке JavaScript не может считывать этот Cookie через document.cookie, основная защита от кражи сессии через XSS.
Secure
Флаг атрибута Cookie. При установке браузер отправляет этот Cookie только по зашифрованным соединениям HTTPS (или localhost).
SameSite
Атрибут Cookie, контролирующий отправку Cookie в межсайтовых запросах, значения Strict/Lax/None. Chrome 80+ по умолчанию Lax.
Max-Age
Атрибут Cookie, указывает время жизни в секундах, приоритет выше чем у Expires, рекомендуется. =0 означает немедленное удаление.
Expires
Атрибут Cookie, указывает конкретный момент истечения (HTTP-date), зависит от часов клиента.
Path
Атрибут Cookie, ограничивает префикс URL-пути, в котором действует Cookie, по умолчанию берёт каталог из URL ответа.
Domain
Атрибут Cookie, ограничивает домен, в котором действует Cookie. Если не установлен — только текущий хост, если установлен — включая поддомены.
Partitioned (CHIPS)
Флаг атрибута Cookie, включает разделённое хранение сторонних Cookie, решение-замена после отключения сторонних Cookie в Chrome, должен сопровождаться Secure.
Префикс __Host-
Ограничение безопасности по префиксу имени Cookie. Требует Secure, Path=/ и отсутствие Domain; при нарушении браузер отказывает в сохранении.
Префикс __Secure-
Ограничение безопасности по префиксу имени Cookie. Требует обязательной установки Secure; при нарушении браузер отказывает в сохранении.
Сессионный Cookie (Session Cookie)
Cookie без установленных Max-Age и Expires, автоматически удаляется при закрытии браузера.
Сторонний Cookie (Third-party Cookie)
Cookie, установленный доменом, отличным от домена текущей посещаемой страницы, обычно устанавливается сторонними сервисами (реклама, трекинг, встраивания iframe), постепенно ограничивается браузерами.

Шпаргалка: сравнение трёх стратегий SameSite

Полная таблица атрибутов Set-Cookie (RFC 6265bis)

Ограничения на размер и количество Set-Cookie в распространённых браузерах

Troubleshooting