Node.js express-session代理选项有什么作用?

Node.js express-session what does the proxy option do?

app.use(session(
  {
    ...
    proxy: true,
    resave: true,
    saveUninitialized: true
  }
));

我找到了一个关于 express-session 的教程,他们有一个 proxy: true 选项。我可以让它保持真实吗?这是做什么的?包括它更好吗?我知道代理是什么,但我真的不明白为什么这是一个选项?

如果您的应用不接收通过代理转发的请求,则无需担心此选项。代理通常用于将请求路由到多个应用程序之一。

代理看起来像这样:

[Client] ==request==> [Proxy] ==forwarded request==> [Server]

这里,服务器看不到原始请求,依赖代理如实关联每个请求。

来自express-session docs

proxy
Trust the reverse proxy when setting secure cookies (via the "X-Forwarded-Proto" header).

The default value is undefined.

  • true The "X-Forwarded-Proto" header will be used.
  • false All headers are ignored and the connection is considered secure only if there is a direct TLS/SSL connection.
  • undefined Uses the "trust proxy" setting from express

查看 Stack overflow 问题 What does "trust proxy" actually do in express.js, and do I need to use it? (which references "Express behind proxies"),我们看到“trust proxy”表示应用是否信任其代理来准确报告请求的来源。这会影响安全 HTTPS-只有 cookie:有必要相信代理请求真正来自 HTTPS 源。

[Client] ==HTTPS==> [Proxy] =="I'm forwarding an HTTPS request"==> [Server]

服务器看不到客户端。如果代理在撒谎,并且它实际上不是来自客户端的 HTTPS 请求,则服务器不应发送安全 cookie。因此,我们可以表明我们是否信任服务器如实报告转发请求的HTTP/HTTPS状态。

fine manual 状态:

Trust the reverse proxy when setting secure cookies (via the "X-Forwarded-Proto" header).

这是指客户端不直接连接到您的节点服务器,而是通过反向代理连接的情况。例如,客户端连接到 NGINX 网络服务器,它将请求转发到节点服务器;在这种情况下,NGINX 是反向代理。

在反向代理设置中,客户端通过 HTTPS 与反向代理通信,而代理使用纯 HTTP 与节点服务器通信也很常见。

当您将 session 中间件配置为使用 so-called "secure cookies"(已记录 here)时,这是一个问题。 session 中间件不允许这些 cookie 通过纯 HTTP 发送,但 要求 它们通过 HTTPS 发送。如果您的反向代理通过 HTTP 与您的节点服务器通信,这意味着您将无法使用安全 cookie。

为了解决这个问题,反向代理会为它转发的每个请求设置X-Forwarded-Proto header。它告诉节点服务器请求的原始协议是什么,而不管反向代理连接到节点服务器的方式如何。

使用 session 中间件的 proxy 选项,您告诉它信任此 header 并允许通过纯 HTTP 发送安全 cookie,前提是 X-Forwarded-Proto 设置为 https.

如果您直接公开您的节点服务器(以便客户端连接到它),您应该将此选项设置为 false,否则,客户端可以欺骗您的服务器(通过发送 X-Forwarded-Proto header 本身)认为连接是安全的。但是,如果您无论如何都不使用安全 cookie,那也无所谓。