ExpressJS: req.session的工作原理是什么?

5
我正在编写一个带有用户登录支持的ExpressJS后端。从多个示例中,我看到使用req.session对象。似乎这个对象用于在服务器和客户端之间存储和检索信息,以便服务器可以设置“logged”标志,并稍后检查此标志以查看用户是否已登录。
我的问题是,这究竟是如何工作的?服务器如何在客户端上存储信息并从每个请求中检索它,是通过cookie吗?客户端是否可以手动操纵客户端上此对象的内容以破坏安全性?如果可以,那么更安全的检查用户登录的方法是什么?

1
请查看http://www.senchalabs.org/connect/session.html上的文档。 - josh3736
3个回答

7
我在ExpressJS的Google群组中找到了一些东西,因此,在ExpressJS中,会话和cookie略有不同。基本上:

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

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

(Credit goes to Laurie Harper)

所以,看起来ExpressJS已经在做@Vahid提到的事情,将值存储在服务器上,并在客户端保存一个键作为cookie。据我理解,req.session使用自己的cookie(仅包含键),独立于req.cookie的自定义cookie。


5

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

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


2
我不知道你的具体实现情况,所以无法对你的情况进行具体评论。但是一般来说,你可以在每个请求中验证从浏览器发送到服务器的内容,你可以安装像“Live HTTP Header”或“Tamper Data”甚至Wireshark(如果不是https)或firebug、firecookie等Firefox扩展程序。
然后检查一下通过Cookie发送了什么,我确定ExpressJS在成功身份验证用户后会生成一个会话ID,将其存储在数据库中并将相同值存储在你的浏览器Cookie中。在每个请求上(甚至图片),你的浏览器都会发送cookie,服务器会通过数据库验证会话ID并检测你的会话。
我曾经看过一些旧的不安全代码,它们会将用户的会话设置为类似于loggedin=1的值,如果你的情况是这样的,你需要知道这很容易被绕过。你必须为每个客户端生成、保存和设置会话ID。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接