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: true
或 proxy: 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_临时会话对象 npm install express-session
如何通过express-session在node.js上设置持久性cookie?