Новое в Symfony 6.4: CHIPS Cookie
Браузеры с поддержкой CHIPS cookie позволяют использовать новый атрибут Partitioned
при создании cookie с помощью HTTP-заголовка Set-Cookie
:
Set-Cookie: cookie-name=cookie-value; SameSite=None; Secure; Path=/; Partitioned;
Когда браузер получает cookie с установленным атрибутом Partitioned
, cookie хранится с использованием двух ключей — host key и новый partition key. Рассмотрим пример, в котором не используются файлы cookie CHIPS:
- Пользователь посещает сайт
https://example-1.com
, на котором размещается контент с сайтаhttps://3rd-party.com
(который, в свою очередь, устанавливает cookie с сайтаhttps://3rd-party.com)
; - Пользователь посещает другой сайт
https://example-2.com
, на котором также размещено содержимое сайтаhttps://3rd-party.com
; - Встроенное содержимое сайта
https://example-2.com
может обращаться к cookie, установленному на сайтеhttps://example-1.com
.
Это связано с тем, что файлы cookie хранятся с ключом (так называемым host key), основанным на хосте или доменном имени сайта, который их установил (в приведённом выше примере ключ — 3rd-party.com
).
При использовании CHIPS cookie-файлов все происходит по-другому:
- Пользователь посещает сайт
https://example-1.com
, в который встраивается контент с сайтаhttps://3rd-party.com
(который, в свою очередь, устанавливает cookie с сайтаhttps://3rd-party.com
, включающий атрибутPartitioned
); - Для хранения cookie используются два ключа:
{("https://example-1.com"), ("3rd-party.com")}
(первый — partition key, второй — host key); - Пользователь посещает другой сайт
https://example-2.com
, на котором также размещено содержимое сайтаhttps://3rd-party.com
; - Встроенное содержимое
https://example-2.com
не может получить доступ к cookie, установленному наhttps://example-1.com
, так как разделённый ключ (которым являетсяhttps://example-1.com
) не совпадает.
В Symfony 6.4/7.0 добавлена поддержка CHIPS cookie в компоненте HttpFoundation. На практике cookie теперь содержат флаг partitioned
, который можно установить при их создании:
use Symfony\Component\HttpFoundation\Cookie;
$cookie = new Cookie('cookie-name', 'cookie-value', '...', partitioned: true);
// или:
$cookie = Cookie::fromString('cookie-name=cookie-value; ...; Partitioned;');
// или:
$cookie = ...
$cookie->withPartitioned();
Кроме того, с помощью нового метода можно проверить, является ли cookie — CHIPS cookie:
$isPartitioned = $cookie->isPartitioned();
Узнать больше о CHIPS cookie:
- Cookies Having Independent Partitioned State (CHIPS)
- CHIPS Cookies spec by W3C Privacy Community Group
В ближайшие месяцы работа с cookie сторонних разработчиков претерпит значительные изменения. Благодаря постоянным обновлениям Symfony ваши приложения могут подготовиться к этому заранее.