Объяснение файлов cookie SameSite

Поддержка браузера

  • Хром: 51.
  • Край: 16.
  • Фаерфокс: 60.
  • Сафари: 13.

Источник

Каждый файл 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 , чтобы убедиться, что ваши намерения ясны.

Три файла cookie с пометкой «Нет», «Слабый» или «Строгий» в зависимости от их контекста.
Явно обозначьте контекст файла cookie как None , Lax или Strict .

Изменения поведения по умолчанию без SameSite

Поддержка браузера

  • Хром: 80.
  • Край: 86.
  • Firefox: за флагом.
  • Сафари: не поддерживается.

Атрибут 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, а также обновил все фрагменты или зависимости на вашем сайте, чтобы убедиться, что он использует новое поведение.

Дополнительные сведения об обновлении файлов cookie для успешной обработки этих изменений на SameSite=None и различиях в поведении браузера см. в следующей статье «Рецепты файлов cookie SameSite» .

Благодарим за вклад и отзывы Лили Чен, Мальте Убла, Майка Уэста, Роба Додсона, Тома Штайнера и Вивека Сехара.

Изображение героя печенья от Пилле-Риин Приске на Unsplash