ExpressJS:req.session 是如何工作的?

Xav*_*_Ex 3 security session express

我正在编写一个支持用户登录的 ExpressJS 后端。从多个示例中,我看到了 req.session 对象的使用。似乎这个对象用于跨服务器和客户端存储和检索信息,因此服务器可以设置“已登录”标志,然后检查此标志以查看用户是否已登录。

我的问题是,这究竟是如何工作的?服务器如何在客户端存储信息并从每个请求中检索它,是通过 cookie 吗?客户端是否有可能在客户端手动操作此对象的内容以破坏安全性?如果是,检查用户登录的更安全方法是什么?

Xav*_*_Ex 6

我从 ExpressJS Google 小组中找到了一些东西,所以 ExpressJS 中的 session 和 cookie 有点不同。基本上:

Res.cookie 在响应中添加一个 cookie;req.session 是服务器端的键/值存储。默认情况下,会话数据位于服务器内存中,但您可以配置备用存储。

您可以在会话中存储您想要的任何内容。客户端看到的唯一内容是标识会话的 cookie。

(归功于劳里·哈珀

因此,ExpressJS 似乎已经在做@Vahid 提到的事情,将值存储在服务器上并将密钥保存为客户端的 cookie。根据我的理解,req.session 使用它自己的 cookie(它只包含一个键),独立于 req.cookie 的自定义 cookie。


小智 5

实际上req.session中的session对象并不是由客户端传递的。在你的语法中你可能使用过app.use(session{options})

这是一个中间件。现在从express服务器传递的每个请求都必须通过这个中间件传递。该中间件获取 cookie(只是存储在服务器上的 sessionId 的编码版本)并对其进行解码以获取 sessionId。与该 sessionId 对应的会话从服务器获取并作为 req.session 附加到 req 对象。给人的感觉是我们从客户端获取会话,但实际上这是中间件的工作,通过从客户端获取 cookie 将会话对象附加到 req 对象。