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

Browser Support

  • Хром: 51.
  • Край: 16.
  • Firefox: 60.
  • Сафари: 13.

Source

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

<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 для блога другого человека, ваш сайт не отправляет куки. Однако, когда читатель переходит по ссылке на cat.html на вашем сайте, этот запрос включает куки.

Мы рекомендуем использовать SameSite именно таким образом, установив для файлов cookie, влияющих на отображение веб-сайта, значение Lax , а для файлов cookie, связанных с действиями пользователя, — значение Strict .

Вы также можете установить SameSite на None , чтобы указать, что вы хотите, чтобы cookie отправлялся во всех контекстах. Если вы предоставляете услугу, которую используют другие сайты, например, виджеты, встроенный контент, партнерские программы, рекламу или вход на нескольких сайтах, используйте None , чтобы убедиться, что ваши намерения ясны.

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

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

Browser Support

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

Атрибут 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