Как предотвратить использование nginx безопасных файлов cookie?
Мы устанавливаем secure
flag на наших куки, и nginx отказывается их передавать, потому что мы общаемся с ним по HTTP.
Это вполне понятно, так как это ожидаемое поведение. Однако перед nginx мы запускаем классический балансировщик нагрузки (ранее известный как Elastic Load Balancer), который принимает HTTPS-трафик из Интернета и общается с nginx во внутренней сети через HTTP.
Итак, есть ли способ сказать nginx, что он не должен удалять куки, так как соединение в целом является доверенным?
2 ответа
Хорошо, прежде всего, когда вы отлаживаете "странную" проблему с сеансами, основанными на HTTP-cookie, убедитесь, что Set-Cookie
заголовок даже отправляется сервером!
Когда вы установили, что он не отправляется (как я), вы захотите установить переменную окружения DEBUG
в *
, если вы используете приложение NodeJS/express.
Если вы это сделаете, вы можете заметить следующую строку в ваших журналах:
cookie-сеанс Ошибка сохранения сеанса Не удается отправить безопасный cookie-файл через незашифрованное соединение
Затем вы отследите эту строку до cookie-сессии, а затем - до cookie. Именно тогда вы понимаете, что все это имеет отношение к экспрессу, а не к тому, что соединение считается доверенным.
Таким образом, nginx не удаляет файлы cookie. В некотором смысле, это виновато, хотя. Я нашел ответ в переменной схемы nginx $ за балансировщиком нагрузки. Чтобы процитировать принятый ответ:
# Sets a $real_scheme variable whose value is the scheme passed by the load
# balancer in X-Forwarded-Proto (if any), defaulting to $scheme.
# Similar to how the HttpRealIp module treats X-Forwarded-For.
map $http_x_forwarded_proto $real_scheme {
default $http_x_forwarded_proto;
'' $scheme;
}
Вы поместите это в свою конфигурацию nginx и затем используете $real_scheme
вместо $scheme
для X-Forwarded-Proto
заголовок:
proxy_set_header "X-Forwarded-Proto" $real_scheme;
По умолчанию nginx не выполняет никакой обработки, связанной с secure
флаг.