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

时间:2015-06-12 11:47:51

标签: node.js session express proxy session-variables

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

我找到了一个关于快速会话的教程,他们有一个代理:true选项。我可以保留它吗?这是做什么的?包含它会更好吗?我知道代理是什么,但我真的不知道为什么这是一个选项?

2 个答案:

答案 0 :(得分:4)

fine manual州:

  

设置安全cookie时信任反向代理(通过“X-Forwarded-Proto”标题)。

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

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

当您将会话中间件配置为使用所谓的“安全cookie”(记录为here)时,这是一个问题。会话中间件不允许这些cookie通过普通HTTP发送,但要求它们是通过HTTPS发送的。如果您的反向代理通过HTTP与您的节点服务器通信,这将意味着您将无法使用安全cookie。

要解决此问题,反向代理会将X-Forwarded-Proto标头设置为它转发的每个请求。它告诉节点服务器请求的原始协议是什么,无论反向代理连接到节点服务器的方式如何。

使用会话中间件的proxy选项,只要X-Forwarded-Proto设置为https,您就会告诉它信任此标头并允许通过纯HTTP发送安全Cookie

如果您直接暴露节点服务器(因此客户端连接到它),您应该将此选项设置为false,否则,客户端可能会欺骗您的服务器(通过发送X-Forwarded-Proto标头本身)认为连接是安全的。但是,如果您还没有使用安全cookie,那就无所谓了。

答案 1 :(得分:3)

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

代理如下:

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

在这里,服务器无法看到原始请求,并依赖代理来真实地关联每个请求。

来自express-session docs

  

<强>代理
  在设置安全cookie时信任反向代理(通过“X-Forwarded-Proto”标题)。

     

默认值为undefined

     
      
  • true将使用“X-Forwarded-Proto”标题。
  •   
  • false只有在存在直接TLS / SSL连接时,才会忽略所有标头,并认为连接是安全的。
  •   
  • undefined使用快递
  • 中的“信任代理”设置   

查看堆栈溢出问题What does "trust proxy" actually do in express.js, and do I need to use it?(引用“Express behind proxies”),我们看到“trust proxy”表示应用是否信任其代理以准确报告来源请求。这会影响安全的仅HTTPS cookie:必须信任请求真正来自HTTPS源的代理。

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

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