Рецепты печенья SameSite

Chrome , Firefox , Edge и другие меняют поведение по умолчанию в соответствии с предложением IETF «Incrementally Better Cookies», чтобы:

  • Файлы cookie без атрибута SameSite обрабатываются как SameSite=Lax , что означает, что по умолчанию файлы cookie ограничиваются только собственными контекстами.
  • В файлах cookie для межсайтового использования должно быть указано SameSite=None; Secure , чтобы включить включение в сторонний контекст.

Если вы еще этого не сделали, вам следует обновить атрибуты сторонних файлов cookie, чтобы они не блокировались в будущем.

Поддержка браузера

  • 51
  • 16
  • 60
  • 13

Источник

Варианты использования межсайтовых или сторонних файлов cookie

Существует ряд распространенных случаев и шаблонов использования, когда файлы cookie необходимо отправлять в стороннем контексте. Если вы предоставляете один из этих вариантов использования или зависите от него, убедитесь, что вы или поставщик обновляете свои файлы cookie, чтобы служба работала правильно.

Содержимое внутри <iframe>

Содержимое другого сайта, отображаемое в <iframe> , находится в стороннем контексте. Стандартные варианты использования включают в себя:

  • Встроенный контент, опубликованный с других сайтов, например видео, карты, примеры кода и публикации в социальных сетях.
  • Виджеты внешних сервисов, таких как платежи, календари, функции бронирования и бронирования.
  • Виджеты, такие как кнопки социальных сетей или службы борьбы с мошенничеством, которые создают менее очевидные <iframes> .

Файлы cookie могут использоваться здесь, среди прочего, для поддержания состояния сеанса, хранения общих настроек, включения статистики или персонализации контента для пользователей с существующими учетными записями.

Схема окна браузера, в котором URL-адрес встроенного контента не соответствует URL-адресу страницы.
Если внедренный контент не принадлежит тому же сайту, что и контекст просмотра верхнего уровня, это сторонний контент.

Поскольку Интернет по своей сути компонуемый, <iframes> также используются для встраивания контента, просматриваемого в контексте верхнего уровня или в собственном контексте. Любые файлы cookie, которые сайт отображает в iframe, считаются сторонними файлами cookie. Если вы создаете сайты, которые хотите встроить на другие сайты, и вам нужны файлы cookie для их работы, вам также необходимо убедиться, что они помечены для межсайтового использования или что вы можете вернуться к ним без них.

«Небезопасные» запросы на разных сайтах

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

Схема перехода запроса с одной страницы на другую.
Если входящий запрос использует «безопасный» метод, страница отправляет файлы cookie.

Этот шаблон используется для сайтов, которые могут перенаправить пользователя на удаленную службу для выполнения некоторой операции перед возвратом, например перенаправление к стороннему поставщику удостоверений. Прежде чем пользователь покинет сайт, устанавливается файл cookie, содержащий одноразовый токен использования, с ожиданием, что этот токен можно будет проверить в возвращающемся запросе для смягчения атак подделки межсайтовых запросов (CSRF) . Если этот возвратный запрос поступает через POST, вам необходимо пометить файлы cookie как SameSite=None; Secure .

Удаленные ресурсы

Любой удаленный ресурс на странице, например, из тегов <img> или тегов <script> , может полагаться на файлы cookie, отправляемые с запросом. Общие случаи использования включают отслеживание пикселей и персонализацию контента.

Это также относится к запросам, отправленным из вашего JavaScript с помощью fetch или XMLHttpRequest . Если fetch() вызывается с опцией credentials: 'include' , эти запросы, скорее всего, будут включать файлы cookie. Для XMLHttpRequest ожидаемые файлы cookie обычно обозначаются значением withCredentials fo 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, если не удается найти новый.

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