Что такое файлы cookie SameSite

Browser Support

  • Chrome: 51.
  • Edge: 16.
  • Firefox: 60.
  • Safari: 13.

Каждый файл 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 с пометками None, Lax или Strict в зависимости от контекста
Явно укажите контекст файла cookie как None, Lax или Strict.

Изменения в режиме работы по умолчанию без SameSite

Browser Support

  • Chrome: 80.
  • Edge: 86.
  • Firefox: behind a flag.
  • Safari: not supported.

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

Благодарим за вклад и отзывы Лили Чен (Lily Chen), Мальте Убла (Malte Ubl), Майка Веста (Mike West), Роба Додсона (Rob Dodson), Тома Штайнера (Tom Steiner) и Вивека Секхара (Vivek Sekhar).