【问题标题】:Node.js express-session what does the proxy option do?Node.js express-session 代理选项有什么作用?
【发布时间】:2015-08-28 10:04:10
【问题描述】:
app.use(session(
  {
    ...
    proxy: true,
    resave: true,
    saveUninitialized: true
  }
));

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

【问题讨论】:

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


    【解决方案1】:

    fine manual 声明:

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

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

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

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

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

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

    如果您直接公开您的 Node 服务器(以便客户端连接到它),您应该将此选项设置为 false,因为否则,客户端可以欺骗您的服务器(通过发送 X-Forwarded-Proto 标头本身)思考连接是安全的。但是,如果您仍然不使用安全 cookie,那也没关系。

    【讨论】:

    • 在这种情况下proxy 选项是什么?我们应该如何正确设置呢?
    • @NorayrGhukasyan 这就是我的帖子想要回答的问题。
    • 是的,除了设置 app "app.set('trust proxy' , true)" 我们还需要为 express-session 配置添加 "proxy: true" 是吗?
    • @NorayrGhukasyan proxy: trueproxy: undefined, as documented here (因为undefined 是默认值,如果您希望会话中间件使用@,则不必显式设置它987654334@ 来自 Express 的设置)。
    • @flo 当有代理时,它们不是特别需要的,但是如果您想使用安全cookie并且正在使用反向代理,还有一些额外的并发症需要考虑(我试图在我的回答中解释)
    【解决方案2】:

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

    代理如下所示:

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

    这里,服务器看不到原始请求,而是依靠代理真实地关联每个请求。

    来自express-session docs

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

    默认值为undefined

    • true 将使用“X-Forwarded-Proto”标头。
    • false 忽略所有标头,仅当存在直接 TLS/SSL 连接时,该连接才被认为是安全的。
    • undefined 使用 express 的“信任代理”设置

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-27
      • 2014-05-09
      • 1970-01-01
      • 2018-03-26
      • 2021-04-24
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多