SameSite
SameSite — атрибут кук, ограничивающий их отправку на cross-site запросы. Придуман для защиты от CSRF. Стандарт: RFC 6265bis.
Три значения
| Значение | Когда шлётся кука |
|---|---|
| Strict | только если запрос с того же site (не иначе как из закладки/ввода URL) |
| Lax | также при top-level navigation (клик по ссылке), но не image/iframe/form POST |
| None | всегда. Требует Secure флаг |
Default
Chrome с 2020, Firefox чуть позже: SameSite=Lax по умолчанию, если атрибут не указан. Плюс есть Lax+POST-переходник на 2 минуты после установки — для совместимости.
Что такое "same site"
По eTLD+1. a.example.com и b.example.com — тот же site. example.com и example.co.uk — разные (проверяется по Public Suffix List).
Пример
Set-Cookie: session=abc; HttpOnly; Secure; SameSite=Lax; Path=/
Set-Cookie: theme=dark; SameSite=None; Secure # для встроенного виджета
Схема-безопасность
С Chrome 89: HTTP и HTTPS того же хоста считаются разными site для SameSite (schemeful same-site).
SameSite=None (третьи стороны)
Куки для встроенных iframe, Sign-in-with-Google, ad networks. Обязательно Secure. С 2024-2025 сторонние куки постепенно отключаются (Chrome, Safari уже давно).
Атака Lax+POST
В окне 2 минут после setSession кука уходит на POST → CSRF возможен. Chrome оставил для совместимости с OAuth, но best practice — Strict + отдельная кука для CSRF-token.