Cookie с флагом Secure отправляются по незащищённому соединению

Вопрос или проблема

У меня есть веб-приложение на Ktor, где сервер устанавливает флаг безопасного cookie по защищенному соединению (https) на стороне клиента, как только он корректно вошел в систему. Этот cookie необходим для доступа к защищенным аутентификацией маршрутам и должен отправляться только по защищенным соединениям (https). Чтобы убедиться, что он не отправляется по незащищенным соединениям, я протестировал это в своей локальной среде разработки:

  • установил флаг безопасного cookie после успешного входа по защищенному соединению на https://localhost
  • затем попытался получить доступ к защищенному аутентификацией маршруту по незащищенному соединению на http://localhost.

Вопреки всему, что я нахожу о cookie, cookie с флагом secure отправляется с запросом на незащищенное соединение http://localhost.

Кто-нибудь знает, почему это происходит?

Secure флаг эффективно предотвращает отправку cookie по обычному HTTP… за исключением localhost 😉

Цитата из MDN Web Docs:

Он никогда не отправляется через незащищенный HTTP (за исключением localhost) […]

Ответ или решение

Проблема, с которой вы столкнулись, связана с особенностями работы cookies с флагом Secure в локальной среде разработки. Давайте разберёмся в этом более подробно.

Когда вы устанавливаете cookie с флагом Secure, этот флаг позволяет передавать cookie только через защищённые соединения (https). Однако существует важное исключение: браузеры часто игнорируют этот флаг при обращении к localhost, что и объясняет, почему ваши Secure cookies всё же отправляются при запросах на http://localhost. Это отвечает на ваш вопрос, почему cookie с флагом Secure был отправлен во время тестирования на локальном сервере.

Как приводит MDN Web Docs, "они никогда не отправляются через незащищённый HTTP (кроме localhost)". Это связано с тем, что разработчики обычно проверяют приложения на локальных серверах, которые часто работают по http, а не по https.

Вот несколько рекомендаций и возможные решения данной ситуации:

  1. Используйте HTTPS в локальной среде разработки: Настройте ваше локальное окружение так, чтобы оно работало по HTTPS. Это можно сделать с помощью самоподписанных сертификатов или инструментов, таких как ngrok или mkcert. Это позволит вам протестировать ваше приложение в условиях, аналогичных продакшн-среде.

  2. Избегайте использования localhost: Если возможно, используйте другие доменные имена, такие как 127.0.0.1 или создайте запись в /etc/hosts, чтобы использовать имя, отличное от localhost. Это может и не сработать в каждом браузере, но иногда это может помочь.

  3. Настройка флага для других сценариев: Если вы хотите проверять на наличие Secure cookies и на localhost, вы можете реализовать дополнительные проверки в своем коде, чтобы убедиться, что запросы идут по безопасному протоколу, даже если это не так предусмотрено на этапе установки cookie.

  4. Обучение и документация: Убедитесь, что команда и другие разработчики знают об этом исключении, чтобы избежать путаницы в будущем.

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

Оцените материал
Добавить комментарий

Капча загружается...