Параметр SameSite позволяет настроить, при каких условиях браузер прикрепляет cookie к межсайтовым запросам. Его используют, чтобы ограничить риск CSRF-атак.
У флага SameSite могут быть такие значения:
strictНе позволит браузеру отправлять куки на целевой ресурс во всех контекстах межсайтового просмотра, даже при переходе по обычной ссылке.
Флаг strict уместен, например, для банка, так как команда безопасности такой организации, скорее всего, не разрешит ссылаться на транзакционные страницы с внешних сайтов.
А вот для платформ вроде GitHub флаг Strict не подойдет. Если пользователь вошел в систему и перешел по ссылке на частный проект — например, с корпоративного форума или из письма — GitHub не получит cookie сессии. В результате пользователь не сможет открыть проект.
laxПозволяет сохранить сессию даже при переходе по внешней ссылке — например, из письма или мессенджера. Это вариант удобнее, чем Strict: сайт все еще получает cookie при переходе по внешней ссылке, но защита от типичных атак сохраняется.
В сценарии GitHub, который мы описали выше, сессионный куки будет разрешен при обычном переходе, но заблокирован при использовании методов запроса вроде POST.
noneNone не ограничивает отправку куки: браузер будет добавлять их во всех запросах, включая кросс-доменные. Такой режим не защищает от межсайтовых атак. Чтобы использовать SameSite=None, cookie обязательно должна быть помечена как Secure — иначе браузер ее заблокирует.
Значение атрибута SameSite по умолчанию отличается в каждом браузере, поэтому рекомендуем четко задавать значение атрибута. Значения none и lax поддерживаются не всеми браузерами.
Когда использоватьОсобенно важно указать SameSite=strict для всех куки, которые содержат чувствительную информацию:
- токенов приложений,
- данных об аккаунтах,
- сессий авторизации.
В некоторых сценариях, как в примере с GitHub и переходом по ссылке, лучше использовать менее строгий вариант — SameSite=lax.
Если куки содержит сведения о текущем языке приложения, можно обойтись SameSite=none.
Установка флага SameSite в программе на C# выполняется аналогично установке флага HttpOnly — с помощью вызова метода Append ():