Вопрос или проблема
У меня есть веб-приложение на 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.
Вот несколько рекомендаций и возможные решения данной ситуации:
-
Используйте HTTPS в локальной среде разработки: Настройте ваше локальное окружение так, чтобы оно работало по HTTPS. Это можно сделать с помощью самоподписанных сертификатов или инструментов, таких как ngrok или mkcert. Это позволит вам протестировать ваше приложение в условиях, аналогичных продакшн-среде.
-
Избегайте использования localhost: Если возможно, используйте другие доменные имена, такие как
127.0.0.1
или создайте запись в/etc/hosts
, чтобы использовать имя, отличное отlocalhost
. Это может и не сработать в каждом браузере, но иногда это может помочь. -
Настройка флага для других сценариев: Если вы хотите проверять на наличие Secure cookies и на localhost, вы можете реализовать дополнительные проверки в своем коде, чтобы убедиться, что запросы идут по безопасному протоколу, даже если это не так предусмотрено на этапе установки cookie.
-
Обучение и документация: Убедитесь, что команда и другие разработчики знают об этом исключении, чтобы избежать путаницы в будущем.
В заключение, это поведение cookie с флагом Secure на localhost
ожидаемое и связано с особенностями работы браузеров. Для имитации реальных условий использования всегда старайтесь тестировать ваше приложение в окружении, максимально похожем на рабочее.