Chrome , Firefox , Edge и другие браузеры меняют свое поведение по умолчанию в соответствии с предложением IETF « Постепенно улучшающиеся файлы cookie» , чтобы:
- Файлы cookie без атрибута
SameSiteобрабатываются какSameSite=Lax, что означает, что по умолчанию файлы cookie используются только в контексте первого лица. - Для обеспечения возможности включения в контекст третьих сторон, файлы cookie, предназначенные для использования на разных сайтах, должны иметь параметр
SameSite=None; Secure.
Если вы еще этого не сделали, вам следует обновить атрибуты сторонних файлов cookie, чтобы они не блокировались в будущем.
Browser Support
Примеры использования межсайтовых или сторонних файлов cookie
Существует ряд распространенных сценариев и моделей использования, в которых файлы cookie необходимо отправлять в контексте взаимодействия с третьими лицами. Если вы предоставляете услуги в одном из таких сценариев или зависите от них, убедитесь, что вы или поставщик обновляете свои файлы cookie для обеспечения корректной работы сервиса.
Содержимое внутри <iframe>
Контент с другого сайта, отображаемый в <iframe> , находится в контексте стороннего ресурса. Стандартные сценарии использования включают:
- Встроенный контент, скопированный с других сайтов, например, видео, карты, примеры кода и публикации в социальных сетях.
- Виджеты из сторонних сервисов, таких как платежные системы, календари, функции бронирования и резервирования.
- Виджеты, такие как кнопки социальных сетей или сервисы защиты от мошенничества, которые создают менее заметные
<iframes>.
Здесь файлы cookie могут использоваться, помимо прочего, для поддержания состояния сессии, хранения общих предпочтений, сбора статистики или персонализации контента для пользователей с существующими учетными записями.

Поскольку веб-пространство по своей природе является компонуемым, <iframes> также используются для встраивания контента, просматриваемого в контексте верхнего уровня или первого уровня. Любые файлы cookie, используемые сайтом, отображаемым во фрейме, считаются файлами cookie третьих сторон. Если вы создаете сайты, которые хотите встраивать на другие сайты, и вам нужны файлы cookie для их работы, вам также необходимо убедиться, что они помечены для межсайтового использования или что вы можете корректно работать без них.
«Небезопасные» запросы на разных сайтах
Слово «небезопасный» здесь может звучать тревожно, но оно относится к любому запросу, который может быть направлен на изменение состояния. В интернете это в основном POST-запросы. Файлы cookie, помеченные как SameSite=Lax отправляются при безопасной навигации верхнего уровня, например, при переходе по ссылке на другой сайт. Однако отправка <form> на другой сайт с использованием POST-запроса не включает файлы cookie.

Этот шаблон используется для сайтов, которые могут перенаправлять пользователя на удаленный сервис для выполнения какой-либо операции перед возвратом, например, перенаправлять к стороннему поставщику идентификационных данных. Перед тем, как пользователь покинет сайт, устанавливается cookie, содержащий одноразовый токен, предполагающий, что этот токен может быть проверен в ответном запросе для предотвращения атак типа Cross Site Request Forgery (CSRF) . Если этот ответный запрос поступает через POST, необходимо пометить cookie как SameSite=None; Secure .
Удаленные ресурсы
Любой удалённый ресурс на странице, например, из тегов <img> или <script> , может зависеть от файлов cookie, отправляемых вместе с запросом. Распространённые примеры использования включают пиксели отслеживания и персонализацию контента.
Это также относится к запросам, отправляемым из вашего JavaScript с помощью fetch или XMLHttpRequest . Если fetch() вызывается с опцией credentials: 'include' , эти запросы, вероятно, будут включать cookie-файлы. Для XMLHttpRequest ожидаемые cookie-файлы обычно указываются значением withCredentials равным true . Эти cookie-файлы должны быть соответствующим образом помечены, чтобы быть включенными в межсайтовые запросы.
Содержимое внутри WebView
В приложениях, ориентированных на конкретную платформу, WebView работает через браузер. Разработчикам необходимо проверить, распространяются ли ограничения или проблемы, влияющие на их приложения, также и на WebView этих приложений.
Android также позволяет приложениям, специфичным для платформы, устанавливать файлы cookie напрямую с помощью API CookieManager . Как и в случае с файлами cookie, установленными с помощью заголовков или JavaScript, рекомендуется указывать SameSite=None; Secure если они предназначены для использования на разных сайтах.
Как внедрить SameSite сегодня
Пометьте все файлы cookie, необходимые только в контексте первого уровня, как SameSite=Lax или SameSite=Strict в зависимости от ваших потребностей. Если вы не пометите эти файлы cookie и будете полагаться на стандартное поведение браузера, они могут вести себя непоследовательно в разных браузерах и потенциально вызывать предупреждения в консоли для каждого файла cookie.
Set-Cookie: first_party_var=value; SameSite=Lax
Убедитесь, что все файлы cookie, необходимые в контексте сторонних сервисов, помечены как SameSite=None; Secure . Оба атрибута обязательны. Если вы укажете только None без Secure , файл cookie будет отклонен. Для учета различий в реализациях браузеров может потребоваться использование некоторых стратегий, описанных в разделе «Обработка несовместимых клиентов» .
Set-Cookie: third_party_var=value; SameSite=None; Secure
Обработка несовместимых клиентов
Поскольку эти изменения, включающие None и обновление поведения по умолчанию, относительно новые, разные браузеры обрабатывают их по-разному. Список известных проблем можно найти на странице обновлений на chromium.org , но этот список может быть неполным.
Один из возможных способов решения проблемы — установить для каждого cookie-файла как новый, так и старый стиль:
Set-cookie: 3pcookie=value; SameSite=None; Secure
Set-cookie: 3pcookie-legacy=value; Secure
Браузеры, поддерживающие новое поведение, устанавливают cookie со значением SameSite . Браузеры, не поддерживающие новое поведение, игнорируют это значение и устанавливают cookie 3pcookie-legacy . При обработке включенных cookie ваш сайт должен сначала проверить наличие cookie нового типа, а затем, если новый cookie не найден, вернуться к устаревшему cookie.
Следующий пример демонстрирует, как это сделать в Node.js, используя фреймворк Express и его промежуточное ПО cookie-parser :
const express = require('express');
const cp = require('cookie-parser');
const app = express();
app.use(cp());
app.get('/set', (req, res) => {
// Set the new style cookie
res.cookie('3pcookie', 'value', { sameSite: 'none', secure: true });
// And set the same value in the legacy cookie
res.cookie('3pcookie-legacy', 'value', { secure: true });
res.end();
});
app.get('/', (req, res) => {
let cookieVal = null;
if (req.cookies['3pcookie']) {
// check the new style cookie first
cookieVal = req.cookies['3pcookie'];
} else if (req.cookies['3pcookie-legacy']) {
// otherwise fall back to the legacy cookie
cookieVal = req.cookies['3pcookie-legacy'];
}
res.end();
});
app.listen(process.env.PORT);
Этот подход требует дополнительных усилий по установке избыточных файлов cookie и внесению изменений как в момент установки, так и в момент чтения файла cookie. Однако он должен охватывать все браузеры независимо от их поведения и обеспечивать функционирование сторонних файлов cookie.
В качестве альтернативы вы можете определить клиента по строке пользовательского агента, отправляемой в заголовке Set-Cookie . Обратитесь к списку несовместимых клиентов и используйте подходящую библиотеку для определения пользовательского агента для вашей платформы, например, библиотеку ua-parser-js для Node.js. Этот подход требует внесения всего одного изменения, но определение пользовательского агента может не выявить всех затронутых пользователей.
Поддержка параметра SameSite=None в языках программирования, библиотеках и фреймворках.
Большинство языков программирования и библиотек поддерживают атрибут SameSite для файлов cookie. Однако, поскольку добавление SameSite=None произошло сравнительно недавно, вам, возможно, придётся временно обойти некоторые стандартные ограничения. Эти ограничения описаны в репозитории примеров SameSite на GitHub .
Получение помощи
Файлы cookie используются повсюду в интернете, и редко какая команда разработчиков имеет полное представление о том, где их сайт устанавливает и использует их, особенно в случаях межсайтового взаимодействия. Если вы столкнулись с проблемой, возможно, это первый подобный случай, поэтому не стесняйтесь обращаться за помощью:
- Создайте заявку в репозитории примеров
SameSiteна GitHub . - Задайте вопрос с тегом "samesite" на StackOverflow .
- Если у вас возникли проблемы с работой Chromium, сообщите о них в систему отслеживания ошибок Chromium .
- Следите за обновлениями Chrome на странице обновлений
SameSite.