Chrome , Firefox , Edge и другие меняют поведение по умолчанию в соответствии с предложением IETF «Incrementally Better Cookies» , чтобы:
- Файлы cookie без атрибута
SameSite
обрабатываются какSameSite=Lax
, что означает, что по умолчанию файлы cookie ограничиваются только собственными контекстами. - В файлах cookie для межсайтового использования должно быть указано
SameSite=None; Secure
, чтобы включить включение в сторонний контекст.
Если вы еще этого не сделали, вам следует обновить атрибуты сторонних файлов cookie, чтобы они не блокировались в будущем.
Варианты использования межсайтовых или сторонних файлов cookie
Существует ряд распространенных случаев и шаблонов использования, когда файлы cookie необходимо отправлять в стороннем контексте. Если вы предоставляете один из этих вариантов использования или зависите от него, убедитесь, что вы или поставщик обновляете свои файлы cookie, чтобы служба работала правильно.
Содержимое внутри <iframe>
Содержимое другого сайта, отображаемое в <iframe>
находится в стороннем контексте. Стандартные варианты использования включают в себя:
- Встроенный контент, опубликованный с других сайтов, например видео, карты, примеры кода и публикации в социальных сетях.
- Виджеты внешних сервисов, таких как платежи, календари, функции бронирования и бронирования.
- Виджеты, такие как кнопки социальных сетей или службы борьбы с мошенничеством, которые создают менее очевидные
<iframes>
.
Файлы cookie могут использоваться здесь, среди прочего, для поддержания состояния сеанса, хранения общих настроек, включения статистики или персонализации контента для пользователей с существующими учетными записями.
Поскольку Интернет по своей сути компонуемый, <iframes>
также используются для встраивания контента, просматриваемого в контексте верхнего уровня или в собственном контексте. Любые файлы cookie, которые сайт отображает в iframe, считаются сторонними файлами cookie. Если вы создаете сайты, которые хотите встроить на другие сайты, и вам нужны файлы cookie для их работы, вам также необходимо убедиться, что они помечены для межсайтового использования или что вы можете вернуться к ним без них.
«Небезопасные» запросы на разных сайтах
Слово «небезопасно» здесь может звучать тревожно, но оно относится к любому запросу, который может быть предназначен для изменения состояния. В Интернете это в основном POST-запросы. Файлы cookie, отмеченные как SameSite=Lax
отправляются при безопасной навигации верхнего уровня, например при нажатии на ссылку для перехода на другой сайт. Однако что-то вроде отправки <form>
на другой сайт с помощью POST не включает файлы cookie.
Этот шаблон используется для сайтов, которые могут перенаправить пользователя на удаленную службу для выполнения некоторой операции перед возвратом, например перенаправление к стороннему поставщику удостоверений. Прежде чем пользователь покинет сайт, устанавливается файл cookie, содержащий одноразовый токен использования, с ожиданием, что этот токен можно будет проверить в возвращающемся запросе, чтобы смягчить атаки подделки межсайтовых запросов (CSRF) . Если этот возвратный запрос поступает через POST, вам необходимо пометить файлы cookie как SameSite=None; Secure
.
Удаленные ресурсы
Любой удаленный ресурс на странице, например теги <img>
или теги <script>
, может полагаться на файлы cookie, отправляемые с запросом. Общие случаи использования включают отслеживание пикселей и персонализацию контента.
Это также относится к запросам, отправленным из вашего JavaScript с помощью fetch
или XMLHttpRequest
. Если fetch()
вызывается с опцией credentials: 'include'
, эти запросы, скорее всего, будут включать файлы cookie. Для XMLHttpRequest
ожидаемые файлы cookie обычно обозначаются значением true
для withCredentials
. Эти файлы cookie должны быть соответствующим образом помечены для включения в межсайтовые запросы.
Содержимое внутри 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, если не удается найти новый.
В следующем примере показано, как это сделать в Node.js с использованием платформы Express и ее промежуточного программного обеспечения для анализа файлов cookie :
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
.