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

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

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

Browser Support

  • Chrome: 114.
  • Край: 114.
  • Firefox: 141.
  • Safari: 26.2.

Source

Что такое CHIPS?

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

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

CHIPS, API доступа к хранилищу и связанные наборы веб-сайтов — это единственный способ читать и записывать файлы cookie из межсайтовых контекстов, таких как iframe, когда сторонние файлы 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 сохраняется в секционированном хранилище, предназначенном только для файлов 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 подресурсов
  • Поставщики безголовых CMS
  • Песочницы для показа ненадежного пользовательского контента (например, googleusercontent.com и githubusercontent.com)
  • Сторонние CDN-сети, использующие файлы cookie для предоставления контента, доступ к которому контролируется статусом аутентификации на сайте первого уровня (например, фотографии профилей в социальных сетях, размещенных на сторонних CDN-сетях).
  • Фронтенд-фреймворки, использующие удалённые API и применяющие файлы cookie к своим запросам, — это фреймворки, работающие с различными API.
  • Встроенная реклама, для которой необходимо задать параметры состояния для каждого издателя (например, для учета предпочтений пользователей в отношении рекламы на данном веб-сайте).

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

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

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

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

Отличительной особенностью CHIPS от существующих реализаций разделенных файлов 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 .
  • Рекомендуется использовать префикс __Host- при настройке секционированных файлов cookie, чтобы привязать их к имени хоста (а не к регистрируемому домену).

Пример:

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

Альтернативы чипсам

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

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

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

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

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

Демо

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

Сайт 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), чтобы открыть инструменты разработчика.
  3. Нажмите вкладку «Приложение» .
  4. Перейдите в раздел Приложения > Хранилище > Файлы cookie .
  5. Перейдите по ссылке https://chips-site-b.glitch.me .

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

Файлы cookie с сайта B на вкладке «Инструменты разработчика».

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

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

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

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

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

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

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

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

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

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

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

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

Очистить файлы cookie

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

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

Ресурсы