如何防止 nginx 剥离安全 cookie?

如何防止 nginx 剥离安全 cookie?

我们正在设定secure旗帜在我们的 cookie 上,但 nginx 拒绝传输它们,因为我们通过 HTTP 与它进行通信。

这是完全可以理解的,因为这是预期的行为。然而,在 nginx 前面,我们运行了一个 Classic Load Balancer(以前称为 Elastic Load Balancer),它接受来自互联网的 HTTPS 流量,并通过 HTTP 与我们内部网络上的 nginx 通信。

那么,有没有办法告诉 nginx 不要剥离 cookie,因为整体连接是值得信赖的?

答案1

好的,首先,当您调试基于 HTTP cookie 的会话的“奇怪”问题时,请确保检查Set-Cookie服务器是否发送了适当的标头!

当你确定它是不是被发送(就像我做的那样),您将需要将环境变量设置DEBUG*,以防您正在运行 NodeJS/express 应用程序。

如果你这样做,你可能会在日志中发现以下行:

cookie-session 错误保存会话无法通过未加密的连接发送安全 cookie

然后你就可以追踪到cookie 会话然后进一步下降到饼干。这时您就会意识到,这一切都与 express 不将连接视为可信有关。

所以 nginx 不是剥离任何 cookie。在某种程度上,这是罪魁祸首。我找到了答案负载均衡器背后的 nginx $scheme 变量。引用已接受的答案:

# 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;

答案2

默认情况下,nginx不做任何与secureflag相关的处理。

相关内容