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

Security ExpressJS:req.session是如何工作的?,security,session,express,Security,Session,Express,我正在编写一个支持用户登录的ExpressJS后端。从多个示例中,我看到了req.session对象的使用。该对象似乎用于跨服务器和客户端存储和检索信息,因此服务器可以设置一个“logged”标志,然后检查该标志以查看用户是否已登录 我的问题是,这到底是如何工作的?服务器如何在客户机上存储信息并从每个请求中检索信息,是通过cookie实现的吗?客户端是否可以在客户端手动操作此对象的内容以屏蔽安全性?如果是的话,检查用户登录的更安全的方法是什么?我不知道您的具体实现,所以我不会专门针对您的情况发表

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


我的问题是,这到底是如何工作的?服务器如何在客户机上存储信息并从每个请求中检索信息,是通过cookie实现的吗?客户端是否可以在客户端手动操作此对象的内容以屏蔽安全性?如果是的话,检查用户登录的更安全的方法是什么?

我不知道您的具体实现,所以我不会专门针对您的情况发表评论。但一般来说,您可以在每次请求时验证从浏览器发送到服务器的内容,您可以安装firefox扩展,如“Live HTTP Header”或“Tamper Data”,甚至可以安装wireshark(如果不是https)或firebug、firecookie等

然后检查通过Cookie发送的内容,我确信ExpressJS thing在成功验证用户身份后会生成会话ID,将其存储在DB中,并将相同的值存储在浏览器Cookie中。在浏览器发送cookie的每个请求(甚至图像)中,服务器都会使用db验证会话ID并检测会话

我见过一些旧的不安全代码,它将用户会话设置为loggedin=1这样的值,如果是您的情况,您必须知道它非常容易被绕过。您必须为每个客户端生成、保存和设置会话ID。

我从ExpressJS Google组中找到,因此在ExpressJS中会话和cookie有点不同。基本上:

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

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

(归功于)


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

实际上,客户端不会传递req.session中的session对象。在您的语法中,您可能使用了
app.use(会话{options})

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

请参阅中的文档。