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

Posted

技术标签:

【中文标题】Node.js express-session 代理选项有啥作用?【英文标题】: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 选项。我可以让它保持真实吗?这是做什么的?包含它会更好吗?我知道什么是代理,但我真的不明白为什么这是一个选项?

【问题讨论】:

【参考方案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 状态。

【讨论】:

以上是关于Node.js express-session 代理选项有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

node.js中express-session配置项详解

Node.js_express_临时会话对象 npm install express-session

node.js中express-session配置项详解

如何通过express-session在node.js上设置持久性cookie?

每次刷新或访问页面时,Node js express-session都会创建新的会话ID

使用 passport.js、mysql 和 express-session 保持登录状态