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

时间:2013-01-25 15:17:39

标签: security session express

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

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

3 个答案:

答案 0 :(得分:4)

我在ExpressJS Google群组中找到something,因此ExpressJS中的会话和Cookie略有不同。基本上是:

  

Res.cookie为响应添加了一个cookie; req.session是服务器端   键/值存储。会话数据默认存在于服务器内存中,   虽然您可以配置备用商店。

     

您可以在会话中存储任何内容。唯一的事情   client see是一个识别会话的cookie。

(信用转到Laurie Harper

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

答案 1 :(得分:2)

我不知道您的确切实施,因此我不会专门针对您的情况发表评论。但通常你可以验证每个请求从浏览器发送到服务器的内容,你可以安装firefox扩展,如“Live HTTP Header”或“Tamper Data”,甚至是wireshark(如果不是https)或firebug,firecookie等。

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

我已经看到一些旧的不安全代码,它们为用户的会话设置了一个像loggedin = 1的值,如果是你的情况,你必须知道它真的很容易被绕过。您必须为每个客户生成,保存和设置会话ID。

答案 2 :(得分:1)

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

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