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

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

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

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

  • Хром: 114.
  • Край: 114.
  • Предварительная версия технологии Firefox: поддерживается.
  • Сафари: не поддерживается.

Источник

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

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

При использовании разделенных файлов 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 для сохранения состояния.

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

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

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

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

Пример:

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: разделенного и неразделенного файла cookie. Сайт B отображает все файлы cookie, доступные из этого места, с помощью document.cookie .

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

Если сторонние файлы cookie разрешены, сайт Б также может установить и получить доступ к неразделенным файлам 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 с сайта Б на вкладке «Приложение DevTools».

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

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

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

  • unpartitioned-cookie имеет пустой ключ раздела.
  • __Файл cookie __Host-partitioned-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 с iframe сайта B, которые доступны, когда они встроены на сайт A.

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

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

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

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

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

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

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

Ресурсы