← Назад к вопросам

Что такое SameSite?

2.0 Middle🔥 161 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

SameSite: Механизм безопасности для управления поведением куки

SameSite — это атрибут для HTTP-куки (Cookie), который позволяет веб-сайтам контролировать, отправляются ли куки вместе с межсайтовыми (cross-site) запросами. Он является важнейшим механизмом защиты от межсайтовой подделки запроса (CSRF) и некоторых атак, связанных с отслеживанием пользователей, таких как атаки с использованием межсайтовых сценариев (XSSI).

Как работает атрибут SameSite

Атрибут устанавливается при создании куки на стороне сервера и может принимать три основных значения:

  • Strict: Куки будут отправляться только в запросах в рамках того же сайта (same-site). Это означает, что если пользователь перешёл на ваш сайт по ссылке с другого сайта, куки с этим атрибутом отправлены не будут.

    Set-Cookie: sessionId=abc123; SameSite=Strict; Secure
    
  • Lax: Это более гибкий режим по умолчанию в современных браузерах. Куки отправляются при безопасных методах запроса (например, GET) во время навигации пользователя (переход по ссылке), но не отправляются при опасных межсайтовых запросах, таких как POST-запросы из форм или вызовы через fetch/XMLHttpRequest с других сайтов.

    Set-Cookie: user_pref=dark; SameSite=Lax; Secure
    
  • None: Куки будут отправляться со всеми запросами, как межсайтовыми, так и внутрисайтовыми. Критически важно: если установлено SameSite=None, кука обязательно должна иметь атрибут Secure (то есть передаваться только по HTTPS). В противном случае браузер проигнорирует её.

    Set-Cookie: analytics_id=xyz789; SameSite=None; Secure; Path=/
    

Контекст "сайта" (Site) vs "источника" (Origin)

Ключевое понимание: SameSite оперирует понятием "сайт" (eTLD+1), а не "источник" (origin, схема+хост+порт). Сайт — это регистрируемый домен верхнего уровня (eTLD) плюс одна метка перед ним. Например:

  • https://app.example.com:8080 и https://blog.example.com — это разные источники, но один и тот же сайт (example.com).
  • https://example.com и https://example.co.uk — это разные сайты.

Таким образом, куки с SameSite=Lax или Strict будут отправляться между поддоменами одного сайта.

Эволюция и значение по умолчанию

Поведение по умолчанию атрибута SameSite менялось:

  • Исторически, если атрибут не был указан, куки отправлялись со всеми запросами (эквивалент None). Это создавало уязвимости для CSRF-атак.
  • Начиная с 2020 года, браузеры (Chrome, Firefox, Safari и др.) стали постепенно внедрять новую политику по умолчанию: SameSite=Lax для кук, у которых явно не указан атрибут. Это стало огромным шагом в повышении безопасности веба по умолчанию.

Практическое применение для Frontend Developer

  1. Защита от CSRF: Использование SameSite=Strict или Lax для сессионных кук делает большинство классических CSRF-аток неэффективными, так как браузер перестаёт автоматически отправлять эти куки с межсайтовыми POST-запросами.

  2. Работа с внешними виджетами и iframe: Если ваш виджет внедряется на другие сайты (example-embed.com на client-site.com) и ему нужен доступ к кукам вашего домена, вам, вероятно, понадобится SameSite=None; Secure. Однако это требует тщательной оценки рисков.

  3. Проблемы с OAuth, платежными шлюзами и кросс-доменной аутентификацией: Эти сценарии часто предполагают "путешествие" пользователя между сайтами (например, перенаправление на oauth-provider.com и обратно). Для корректной работы кук сессии на провайдере может потребоваться SameSite=None; Secure. Многие провайдеры уже обновили свои SDK для поддержки этого.

  4. Тестирование: Всегда тестируйте поведение вашего приложения в современных браузерах с включёнными настройками безопасности по умолчанию. Особое внимание уделяйте потокам, включающим редиректы между доменами.

Пример кода на стороне клиента (JavaScript)

Хотя атрибут устанавливается сервером, frontend-разработчик должен понимать его влияние.

// Попытка отправить межсайтовый запрос с куками
fetch('https://another-site.com/api/data', {
    method: 'POST',
    credentials: 'include' // Указывает, что нужно отправить куки
})
.then(response => response.json())
.then(data => console.log(data));

// Если куки сайта another-site.com установлены как SameSite=Strict или Lax,
// они НЕ БУДУТ отправлены с этим межсайтовым POST-запросом.
// Запрос уйдёт без кук, что может привести к ошибке аутентификации (401).

Заключение: Атрибут SameSite — это не просто дополнительная настройка, а фундаментальный механизм безопасности современного веба. Понимание различий между Strict, Lax и None и их влияния на потоки данных вашего приложения обязательно для frontend-разработчика. Это позволяет создавать не только функциональные, но и безопасные по умолчанию приложения, защищённые от целого класса распространённых атак. Игнорирование этой настройки в 2024 году почти гарантированно приведёт к проблемам с кросс-доменной интеграцией и потенциальным уязвимостям.