Каждый файл cookie содержит пару ключ-значение, а также ряд атрибутов, которые контролируют, когда и где используется этот файл cookie.
Введение атрибута SameSite
(определенного в RFC6265bis ) позволяет вам объявить, ограничен ли ваш файл cookie контекстом основного сайта или контекстом того же сайта. Полезно понимать, что именно здесь означает «сайт». Сайт представляет собой комбинацию суффикса домена и части домена, расположенной непосредственно перед ним. Например, домен www.web.dev
является частью сайта web.dev
.
Ключевой термин: если пользователь находится на www.web.dev
и запрашивает изображение у static.web.dev
, это запрос на тот же сайт .
Список общедоступных суффиксов определяет, какие страницы считаются находящимися на одном сайте. Это зависит не только от доменов верхнего уровня, таких как .com
, но также может включать такие сервисы, как github.io
. Это позволяет your-project.github.io
и my-project.github.io
считаться отдельными сайтами.
Ключевой термин: если пользователь находится на your-project.github.io
и запрашивает изображение с my-project.github.io
, это межсайтовый запрос.
Используйте атрибут SameSite
чтобы объявить об использовании файлов cookie.
Атрибут SameSite
файла cookie предоставляет три различных способа управления этим поведением. Вы можете не указывать атрибут или использовать Strict
или Lax
чтобы ограничить использование файлов cookie запросами одного и того же сайта.
Если вы установите для SameSite
значение Strict
, ваш файл cookie можно будет отправлять только в собственном контексте; то есть, если сайт для файла cookie соответствует сайту, указанному в адресной строке браузера. Итак, если файл cookie promo_shown
установлен следующим образом:
Set-Cookie: promo_shown=1; SameSite=Strict
Когда пользователь находится на вашем сайте, файл cookie отправляется с запросом, как и ожидалось. Однако если пользователь переходит по ссылке на ваш сайт с другого сайта, файл cookie не отправляется по этому первоначальному запросу. Это хорошо для файлов cookie, относящихся к функциям, которые всегда находятся за начальной навигацией, например, смена пароля или совершение покупки, но это слишком ограничительно для таких файлов cookie, как promo_shown
. Если ваш читатель перейдет по ссылке на сайт, он захочет отправить файл cookie, чтобы можно было применить его предпочтения.
SameSite=Lax
позволяет браузеру отправлять файлы cookie с помощью навигации верхнего уровня. Например, если другой сайт ссылается на контент вашего сайта, в данном случае используя фотографию вашего кота и предоставляя ссылку на вашу статью следующим образом:
<p>Look at this amazing cat!</p>
<img src="https://blog.example/blog/img/amazing-cat.png" />
<p>Read the <a href="https://blog.example/blog/cat.html">article</a>.</p>
Если для файла cookie установлено значение Lax
следующим образом:
Set-Cookie: promo_shown=1; SameSite=Lax
Когда браузер запрашивает amazing-cat.png
для блога другого человека, ваш сайт не отправляет файл cookie. Однако когда читатель переходит по ссылке на cat.html
на вашем сайте, этот запрос включает файл cookie.
Мы рекомендуем использовать SameSite
таким образом, установив для файлов cookie, влияющих на отображение веб-сайта, значение Lax
, а для файлов cookie, связанных с действиями пользователя, — Strict
.
Вы также можете установить для SameSite
значение None
, чтобы указать, что вы хотите, чтобы файлы cookie отправлялись во всех контекстах. Если вы предоставляете услугу, которую используют другие сайты, например виджеты, встроенный контент, партнерские программы, рекламу или вход в систему на нескольких сайтах, используйте None
, чтобы убедиться, что ваши намерения ясны.
Изменения поведения по умолчанию без SameSite
Поддержка браузера
Атрибут SameSite
широко поддерживается, но не получил широкого распространения. Раньше установка файлов cookie без использования SameSite
по умолчанию отправляла их во всех контекстах, что делало пользователей уязвимыми для CSRF и непреднамеренной утечки информации. Чтобы побудить разработчиков заявить о своих намерениях и предоставить пользователям более безопасную работу, предложение IETF Incrementally Better Cookies содержит два ключевых изменения:
- Файлы cookie без атрибута
SameSite
обрабатываются какSameSite=Lax
. - Файлы cookie с
SameSite=None
также должны указыватьSecure
, то есть им требуется безопасный контекст.
Оба этих изменения обратно совместимы с браузерами, в которых правильно реализована предыдущая версия атрибута SameSite
, а также с браузерами, не поддерживающими более ранние версии SameSite
. Они предназначены для уменьшения зависимости разработчиков от поведения браузеров по умолчанию, делая поведение файлов cookie и их предполагаемое использование явными. Любые клиенты, которые не распознают SameSite=None
, должны игнорировать его.
SameSite=Lax
по умолчанию
Если вы отправляете файл cookie без указания атрибута SameSite
, браузер обрабатывает этот файл cookie так, как если бы для него было установлено значение SameSite=Lax
. Мы по-прежнему рекомендуем явно устанавливать SameSite=Lax
чтобы сделать взаимодействие с пользователем более единообразным в разных браузерах.
SameSite=None
должен быть безопасным
Когда вы создаете межсайтовые файлы cookie с помощью SameSite=None
, вы также должны установить для них значение Secure
, чтобы браузер мог их принимать:
Set-Cookie: widget_session=abc123; SameSite=None; Secure
Вы можете проверить это поведение начиная с Chrome 76, включив about://flags/#cookies-without-same-site-must-be-secure
, и с Firefox 69, установив network.cookie.sameSite.noneRequiresSecure
в about:config
.
Мы также рекомендуем как можно скорее обновить существующие файлы cookie до уровня Secure
. Если вы полагаетесь на службы, которые предоставляют сторонний контент на вашем сайте, убедитесь, что ваш поставщик услуг обновил свои файлы cookie, а также обновил все фрагменты или зависимости на вашем сайте, чтобы убедиться, что он использует новое поведение.
Рецепты печенья SameSite
Дополнительные сведения об обновлении файлов cookie для успешной обработки этих изменений на SameSite=None
и различиях в поведении браузера см. в следующей статье «Рецепты файлов cookie SameSite» .
Благодарим за вклад и отзывы Лили Чен, Мальте Убла, Майка Уэста, Роба Додсона, Тома Штайнера и Вивека Сехара.
Изображение героя печенья от Пилле-Риин Приске на Unsplash