CHIPS и Storage Partitioning: как проектировать авторизацию и embedded-виджеты без thir... — 18 июня 2026 г. в 12:07:07
CHIPS и Storage Partitioning: как проектировать авторизацию и embedded-виджеты без third-party cookies Старый паттерн "вставим iframe с auth.example.com, он прочитает cookie и молча залогинит пользователя" больше не является production-гарантией. Это бьет по SSO, embedded-виджетам, checkout, support-chat и B2B-интеграциям. Что меняется Storage Partitioning изолирует localStorage, IndexedDB, Cache и cookies по top-level site. Один и тот же widget.example внутри shop-a.com и shop-b.com получит разные состояния. CHIPS - это third-party cookie с partitioned-состоянием: Set-Cookie: __Host-widget_sid=abc; Path=/; Secure; HttpOnly; SameSite=None; Partitioned Такая cookie полезна для сессии виджета, но не для глобального SSO между сайтами. Как проектировать авторизацию Не рассчитывайте на hidden iframe login: IdP внутри iframe будет нестабилен или сломан. Практичнее: * top-level redirect или popup с user gesture; * для SPA - Authorization Code + PKCE; * для чувствительных систем - BFF, где токены остаются на сервере, а браузер получает HttpOnly first-party session cookie. Типичная ошибка - хранить долгоживущие access/refresh tokens в localStorage. Partitioning не защищает от XSS. Embedded-виджет Рабочий production-flow: * host backend выдает короткоживущий signed embed token; * host передает его в iframe через postMessage; * widget backend валидирует token и создает partitioned-сессию. iframe.contentWindow?.postMessage( { type: 'BOOT', token }, 'https://widget.example' ); window.addEventListener('message', async e => { if (e.origin !== 'https://shop.example') return; await fetch('/api/session', { method: 'POST', credentials: 'include', body: JSON.stringify({ token: e.data.token }) }); }); Проверяйте event.origin, не передавайте refresh tokens в iframe, делайте embed token scoped, короткоживущим и желательно одноразовым. Если нужен общий аккаунт CHIPS не возвращает старый cross-site SSO. Нужен явный login flow, popup, FedCM для IdP-сценариев или точечный Storage Access API. Вывод: Embedded-виджет должен получать контекст от host-приложения, создавать свою partitioned-сессию и не зависеть от глобальной third-party cookie.