会话如何在Express.js和Node.js中工作?


96

使用Express.js,会话非常简单。我很好奇它们实际上是如何工作的。

它会在客户端上存储一些cookie吗?如果是这样,我在哪里可以找到该Cookie?如果需要,如何解码?

我基本上希望能够查看用户是否登录,即使该用户当时实际上不在该站点上(例如,当您在其他站点上时,facebook如何知道您已登录)。但是我想了解的是,我应该首先了解会议的工作方式。

Answers:


43

我从未使用过Express.js,尽管根据他们关于该主题的文档,听起来像是:

  • Cookie存储在客户端上,带有一个密钥(服务器将使用该密钥来检索会话数据)和一个哈希(服务器将使用该哈希来确保cookie数据未被篡改,因此,如果您尝试更改) Cookie的值无效)

  • 与某些框架(例如Play Framework!)相反,会话数据保存在服务器上,因此cookie更像是会话的占位符,而不是实际会话数据的持有者。

  • 这里开始,服务器上的该会话数据看起来默认情况下保存在内存中,尽管可以将其更改为实现适当API的任何存储形式。

因此,如果您想在没有特定req请求对象的情况下进行检查,如您所说,则只需访问相同的存储即可。在第一个文档页面的底部,它详细说明了存储需要实现的必需方法,因此,如果您熟悉存储API,也许您可​​以执行.getAll()类似的操作,并遍历会话数据并读取任何内容。您想要的值。


166

总览

Express.js使用cookie将会话ID(带有加密签名)存储在用户的浏览器中,然后,在后续请求中,使用该cookie的值来检索存储在服务器上的会话信息。该服务器端存储可以是内存存储(默认),也可以是实现所需方法的任何其他存储(例如connect-redis)。

细节

Express.js / Connect使用创建一个24个字符的Base64字符串utils.uid(24)并将其存储在中req.sessionID。然后将此字符串用作cookie中的值。

客户端

签名的cookie始终用于会话,因此cookie值将具有以下格式。

[sid].[signature]

其中[sid]是sessionID,[签名]是通过使用初始化会话中间件时提供的密钥对[sid]进行签名来生成的。完成签名步骤是为了防止篡改。在不知道所使用的秘密密钥的情况下,修改[sid]然后重新创建[签名]应该在计算上不可行。如果不需要修改[sid],则会话cookie仍然容易被盗窃和重用。

该Cookie的名称是

connect.sid

服务器端

如果在cookieParsersession中间件之后出现处理程序,它将可以访问该变量req.cookies。它包含一个JSON对象,其键是cookie键,值是cookie值。这将包含一个名为的密钥connect.sid,其值将为签名的会话标识符。

这是一个如何设置路由的示例,该路由将检查每个请求上是否存在会话cookie并将其值打印到控制台。

app.get("/*", function(req, res, next) {

    if(typeof req.cookies['connect.sid'] !== 'undefined') {
        console.log(req.cookies['connect.sid']);
    }

    next(); // Call the next middleware
});

您还需要确保在配置部分app.use(app.router)之后cookieParsersession中包含路由器()。

以下是Express.js / Connect内部存储的数据的示例。

{
  "lastAccess": 1343846924959,
  "cookie": {
    "originalMaxAge": 172800000,
    "expires": "2012-08-03T18:48:45.144Z",
    "httpOnly": true,
    "path": "/"
  },
  "user": { 
    "name":"waylon",
    "status":"pro"
  }
}

user字段是自定义的。其他所有内容都是会话管理的一部分。

该示例来自Express 2.5。


1
当使用console.log打印cookie值时,它将给出编码的(签名的)cookie。我如何获得真实信息?
vsync

您的意思是什么?“如果不需要修改[sid],会话cookie仍然容易被盗窃和重用。”?由于SID是由express生成的,因此我们永远无法更改它吗?
Hrushikesh 2013年

2
@WebHrushi我正在考虑中间人攻击:en.wikipedia.org/wiki/Man-in-the-middle_attack
Waylon Flinn

谁能帮我解决这个问题:stackoverflow.com/questions/21982791/...
轮转

如何为任何特定的session_id创建令牌?
阿曼·维尔玛

9

我很好奇它们实际上是如何工作的。

尝试查看答案和Wiki内容。

它会在客户端上存储一些cookie吗?

是的,它通常是具有分配的会话ID的cookie,为了防止伪造,应该使用秘密对其进行签名。

如果是这样,我在哪里可以找到该Cookie?如果需要,如何解码?

您不应该在客户端使用会话cookie。如果要在服务器端使用会话,则应签出相关的express.js连接文档。


主席先生,我们能谈谈我对此是否有疑问。
Suraj Jain '18

0

除了已经非常好的答案之外,这里还有两个我用来解释Express会话的图表,它们与cookie和store的链接:

  • 巧克力曲奇: 巧克力
  • 草莓饼干: 草莓
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.