Файлы cookie с независимым разделенным состоянием (CHIPS)

Разрешить разработчикам выбирать «разделенное» хранилище cookie-файлов, с отдельным хранилищем cookie-файлов для каждого сайта верхнего уровня.

Статус реализации

Browser Support

  • Хром: 114.
  • Край: 114.
  • Firefox: 141.
  • Safari: не поддерживается.

Source

Что такое ЧИПСЫ?

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

Без разделения сторонние файлы cookie позволяют сервисам отслеживать пользователей и объединять их информацию с множества несвязанных сайтов верхнего уровня. Это называется межсайтовым отслеживанием.

CHIPS, API доступа к хранилищу и наборы связанных веб-сайтов — это единственный способ читать и записывать файлы cookie из межсайтовых контекстов, таких как iframes, когда сторонние файлы cookie заблокированы.

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

CHIPS представляет новый атрибут cookie-файлов Partitioned для поддержки межсайтовых cookie-файлов, которые разделены по контексту верхнего уровня.

Заголовок Set-Cookie:

Set-Cookie: __Host-name=value; Secure; Path=/; SameSite=None; Partitioned;

Javascript:

document.cookie="__Host-name=value; Secure; Path=/; SameSite=None; Partitioned;"

Разделённый сторонний cookie-файл привязан к сайту верхнего уровня, где он изначально установлен, и недоступен извне. Таким образом, cookie-файлы, установленные сторонним сервисом, можно прочитать только в том же встроенном контексте сайта верхнего уровня, где они были изначально установлены.

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

При использовании секционированных файлов cookie, когда пользователь посещает сайт A и встроенный контент с сайта C устанавливает файл cookie с атрибутом Partitioned, файл cookie сохраняется в секционированном JAR-файле, предназначенном только для файлов cookie, которые устанавливает сайт C при его внедрении на сайт A. Браузер отправит этот файл cookie только в том случае, если сайт верхнего уровня — A.

Когда пользователь посещает новый сайт, например, сайт B, встроенный фрейм C не получит cookie-файл, который был установлен при встраивании C на сайт A.

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

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

Варианты использования

Например, сайт retail.example может захотеть воспользоваться услугами стороннего сервиса support.chat.example для встраивания чата поддержки на свой сайт. Многие современные встраиваемые чат-сервисы используют файлы cookie для сохранения состояния.

Диаграмма, показывающая веб-сайт со встроенным виджетом чата
Сайт верхнего уровня retail.example со встроенным сторонним сервисом support.chat.example .

Без возможности установки межсайтового cookie-файла support.chat.example пришлось бы искать альтернативные, зачастую более сложные, методы хранения состояния. В противном случае, его пришлось бы встроить в страницу верхнего уровня, что создаёт риски, поскольку позволяет скрипту support.chat.example иметь повышенные привилегии на retail.example, например, доступ к cookie-файлам аутентификации.

CHIPS предоставляет более простой вариант продолжения использования межсайтовых cookie-файлов без рисков, связанных с неразделенными cookie-файлами.

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

  • Встроенные чаты сторонних разработчиков
  • Встраивание сторонних карт
  • Встроенные сторонние платежи
  • Балансировка нагрузки CDN подресурсов
  • Поставщики Headless CMS
  • Домены-песочницы для обслуживания ненадежного пользовательского контента (например, googleusercontent.com и githubusercontent.com)
  • Сторонние CDN, которые используют файлы cookie для обслуживания контента, доступ к которому контролируется статусом аутентификации на основном сайте (например, фотографии профилей на сайтах социальных сетей, размещенных на сторонних CDN)
  • Фронтенд-фреймворки, которые полагаются на удаленные API, использующие файлы cookie в своих запросах
  • Встроенные рекламные объявления, для которых необходимо настроить область действия для каждого издателя (например, сбор данных о предпочтениях пользователей в отношении рекламы на данном веб-сайте)

Почему CHIPS использует модель добровольного разбиения

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

Firefox объявил, что по умолчанию разделяет все сторонние файлы cookie в режиме ETP Strict и режиме приватного просмотра, поэтому все межсайтовые файлы cookie разделяются по сайту верхнего уровня. Однако разделение файлов cookie без согласия сторонних сервисов может привести к непредвиденным ошибкам, поскольку некоторые сторонние сервисы используют серверы, которые ожидают неразделённые сторонние файлы cookie.

Ранее Safari пытался разбивать файлы cookie на части на основе эвристики , но в итоге решил полностью их заблокировать, сославшись на путаницу среди разработчиков в качестве одной из причин. Недавно Safari выразил интерес к модели, основанной на добровольном участии .

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

Хотя сторонние файлы cookie всё ещё существуют, атрибут Partitioned позволяет выбрать более строгий и безопасный тип поведения файлов cookie. CHIPS — важный шаг, который поможет сервисам плавно перейти к будущему без сторонних файлов cookie.

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

Например, для файлов cookie с https://support.chat.example ключ хоста — ("support.chat.example") .

В рамках CHIPS файлы cookie, в которых выбрано разделение, будут иметь двойной ключ — ключ хоста и ключ раздела .

Ключ раздела cookie-файла — это сайт ( схема и регистрируемый домен ) URL-адреса верхнего уровня, который браузер посещал в начале запроса к конечной точке, установившей cookie-файл.

В приведенном выше примере, где https://support.chat.example встроен в https://retail.example , URL-адрес верхнего уровня — https://retail.example .

Ключом раздела в этом случае будет ("https", "retail.example") .

Аналогично, ключ раздела запроса — это адрес URL верхнего уровня, который браузер посещает в начале запроса. Браузеры должны отправлять cookie-файл с атрибутом Partitioned только в запросах с тем же ключом раздела, что и у этого cookie-файла.

Вот как выглядит ключ cookie в предыдущем примере до и после CHIPS.

Сайт A и встроенный сайт C совместно используют разделённый файл cookie. Если сайт C не встроен, он не может получить доступ к разделённому файлу cookie.
Сайт A и встроенный сайт C совместно используют разделённый файл cookie. Если сайт C не встроен, он не может получить доступ к разделённому файлу cookie.

До появления ЧИПСОВ

key=("support.chat.example")

После ЧИПСОВ

key={("support.chat.example"),("https", "retail.example")}

Проектирование безопасности

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

  • Разделенные файлы cookie должны быть установлены с помощью Secure .
  • При настройке разделенных cookie-файлов рекомендуется использовать префикс __Host- , чтобы привязать их к имени хоста (а не к регистрируемому домену).

Пример:

Set-Cookie: __Host-example=34d8g; SameSite=None; Secure; Path=/; Partitioned;

Альтернативы ЧИПСАМ

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

Это альтернативы разделению CHIPS, где требуется доступ к межсайтовым неразделенным файлам cookie.

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

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

Дизайн связанных наборов веб-сайтов основан на API доступа к хранилищу и не интегрируется с разделением CHIPS. Если у вас есть вариант использования, требующий общего раздела cookie для разных сайтов в рамках RWS, вы можете предоставить примеры и отзывы в GitHub .

Демо

В этой демонстрации вы узнаете, как работают разделенные файлы cookie и как их можно проверить в DevTools.

Сайт A встраивает iframe с сайта B, который использует JavaScript для установки двух файлов cookie: секционированного и несекционированного. Сайт B отображает все файлы cookie, доступные из этого местоположения, с помощью document.cookie .

Если сторонние файлы cookie заблокированы, сайт B сможет устанавливать и получать доступ к файлам cookie только с атрибутом Partitioned в межсайтовом контексте.

Если сторонние файлы cookie разрешены, сайт B также может устанавливать и получать доступ к неразделенным файлам cookie.

Участок А и участок Б
Слева: сторонние файлы cookie заблокированы. Справа: сторонние файлы cookie разрешены.

Предпосылки

  1. Chrome 118 или выше.
  2. Перейдите на chrome://flags/#test-third-party-cookie-phaseout и включите этот параметр.

Используйте DevTools для проверки разделенных файлов cookie

  1. Посетите https://chips-site-a.glitch.me .
  2. Нажмите Control+Shift+J (или Command+Option+J на Mac), чтобы открыть DevTools.
  3. Откройте вкладку «Приложение» .
  4. Перейдите в Приложение > Хранилище > Файлы cookie .
  5. Нажмите https://chips-site-b.glitch.me .

DevTools отобразит все файлы cookie из выбранного источника.

Файлы cookie с сайта B на вкладке приложения DevTools.

Сайт B может устанавливать только секционированный cookie-файл в межсайтовом контексте, несекционированный cookie-файл будет заблокирован:

  • Вы должны увидеть __Host-partitioned-cookie с ключом раздела сайта верхнего уровня https://chips-site-a.glitch.me .
Ключ раздела для __Host-partitioned-cookie.
  1. Нажмите « Перейти на сайт B» .
  2. В DevTools перейдите в Application > Storage > Cookies .
  3. Нажмите https://chips-site-b.glitch.me .
Участок Б
На верхнем уровне сайт B может видеть все файлы cookie — как секционированные, так и не секционированные.

В этом сценарии, поскольку вы находитесь на сайте B в контексте верхнего уровня, он может установить и получить доступ к обоим файлам cookie:

  • unpartitioned-cookie имеет пустой ключ раздела.
  • __Host-partitioned-cookie cookie имеет ключ раздела https://chips-site-b.glitch.me .
Файлы cookie с сайта B на вкладке приложения DevTools при посещении B как сайта верхнего уровня. __Host-partitioned-cookie имеет ключ раздела https://chips-site-b.glitch.me.

Если вы вернетесь на сайт А, unpartitioned-cookie теперь будет сохранен в браузере, но он не будет доступен с сайта А.

  1. Нажмите « Перейти на сайт А» .
  2. Откройте вкладку Сеть .
  3. Нажмите https://chips-site-b.glitch.me .
  4. Откройте вкладку «Файлы cookie» .

Находясь на сайте A, вы должны увидеть __Host-partitioned-cookie с ключом раздела сайта верхнего уровня https://chips-site-a.glitch.me .

Вкладка «Сеть» с файлами cookie с сайта B iframe, доступными при его внедрении на сайт A.

Если вы установите флажок «Показывать отфильтрованные запросы cookie», DevTools покажет, что неразделенный cookie-файл заблокирован, выделив его желтым цветом, и сообщит: «Этот cookie-файл был заблокирован из-за настроек пользователя» .

Вкладка «Сеть» с заблокированными файлами cookie с сайта B iframe.

В разделе Приложение > Хранилище > Файлы cookie при нажатии на https://chips-site-b.glitch.me отобразится следующее:

  • unpartitioned-cookie с пустым ключом раздела.
  • __Host-partitioned-cookie cookie с ключом раздела https://chips-site-a.glitch.me .
Файлы cookie с сайта B на вкладке «Приложение» в DevTools. Файл __Host-partitioned-cookie имеет ключ раздела https://chips-site-a.glitch.me . unpartitioned-cookie отображается, но он недоступен для iframe сайта B, если он встроен на сайт A.

Очистить куки

Чтобы сбросить демоверсию, очистите все файлы cookie для сайта:

  • Нажмите Control+Shift+J (или Command+Option+J на Mac), чтобы открыть DevTools.
  • Откройте вкладку «Приложение» .
  • Перейдите в Приложение > Хранилище > Файлы cookie .
  • Щелкните правой кнопкой мыши по https://chips-site-b.glitch.me .
  • Нажмите «Очистить» .

Ресурсы