Если cookie не устанавливается из-за SameSite, пользователь может успешно войти, но следующий запрос снова считает его гостем. Это часто проявляется при отдельном API-домене, внешнем OAuth callback, iframe или переходе между схемами HTTP и HTTPS.

Не исправляйте проблему безусловным SameSite=None для всех cookie. Нужно определить реальный cross-site сценарий, включить Secure и ограничить область cookie, сохранив защиту от межсайтовых запросов.

Проверьте причину блокировки в браузере

DevTools показывает Set-Cookie и конкретное предупреждение, почему значение не сохранено или не отправлено.

  • Set-Cookie присутствует, но запись не появляется в Storage.
  • Cookie сохраняется, однако отсутствует в запросе к API.
  • Вход работает при прямом открытии домена, но не внутри iframe.
  • Проблема появляется только после перехода с внешнего провайдера.

Почему возникает проблема

SameSite оценивается вместе с Secure, схемой, host, методом запроса и контекстом верхней страницы.

  • SameSite=None используется без обязательного Secure.
  • Cookie записана для другого Domain или Path.
  • Frontend-запрос не отправляет credentials.
  • CORS не разрешает credentials для конкретного origin.
  • Reverse proxy сообщает приложению неправильную схему HTTP.

Пошаговая диагностика

Тестируйте на реальных origin, а не только на localhost.

  1. Изучите Set-Cookie и предупреждение браузера.
  2. Сравните site, origin, scheme, domain и path запроса.
  3. Проверьте credentials на клиенте и CORS-заголовки сервера.
  4. Проследите redirect login и callback без потери cookie.
  5. Проверьте forwarded proto и HTTPS-настройки приложения.

Выберите минимально необходимый режим

SameSite должен соответствовать архитектуре, а не отключаться глобально.

  • Lax подходит многим обычным сессиям верхнего уровня.
  • Strict ограничивает межсайтовые переходы сильнее.
  • None нужен для подтвержденного cross-site сценария и требует Secure.
  • Чувствительные действия дополнительно защищаются CSRF-механизмом.

Как исправить проблему

Исправьте origin, HTTPS и область cookie до расширения SameSite.

  1. Настройте Secure, HttpOnly, Domain и Path для нужной сессии.
  2. Укажите корректный SameSite только этой cookie.
  3. Включите credentials на клиенте и точный CORS origin.
  4. Передавайте исходную HTTPS-схему через proxy.
  5. Добавьте CSRF-защиту для state-changing запросов.

Как проверить результат

  • Cookie сохраняется и отправляется только нужному домену.
  • Сессия работает после OAuth callback и API-запроса.
  • HttpOnly и Secure остаются включенными.
  • Чужой origin не получает credentialed-доступ.

Типичные ошибки

  • Ставить SameSite=None всем cookie.
  • Использовать wildcard origin вместе с credentials.
  • Отключать Secure на production.
  • Расширять Domain на все поддомены без необходимости.

Как предотвратить повторение

  • Документируйте origin и назначение каждой cookie.
  • Тестируйте вход в основных браузерах.
  • Проверяйте proxy headers после переноса.
  • Добавьте тесты CORS и CSRF.

Когда нужна помощь

Если браузер блокирует cookie из-за SameSite, я разберу домены, redirect, CORS и proxy, настрою сессию так, чтобы вход работал без ослабления Secure, HttpOnly и CSRF-защиты.