express.session存储在服务器端散列会话密钥在哪里?

时间:2013-12-10 10:04:28

标签: node.js mongodb cookies express

我正在使用mongoStore来管理express.js框架上的会话。

...
var MongoStore = require('connect-mongo')(express);
...
...
app.use(express.session({
    secret:settings.cookieSecret,
    store: new MongoStore({db:settings.db})
}));
...

this is the connect.sid and its value

但是这里是mongoDB上的会话集合中的记录

> db.session
s.find()
{ "_id" : "gLQe0NwaSmk9nPu6vOWKuSy0", "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"flash\":{},\"user\":null}", "expires" : ISODate("2013-12-24T05:02:33.308Z") }
{ "_id" : "SoqYLZnEzlVCdj4A1606fDPg", "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"flash\":{},\"user\":\"vvv\"}", "expires" : ISODate("2013-12-24T09:43:55.098Z") }
{ "_id" : "pBtoFt6sR2EvNCuPJVqAFVpR", "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"flash\":{}}", "expires" : ISODate("2013-12-24T09:24:27.846Z") }
{ "_id" : "MEkFGzd190YeJAGDH3nzLT14", "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"flash\":{}}", "expires" : ISODate("2013-12-24T09:44:10.585Z") }
> 

我的理解是他们应该将connect.id的值存储在客户端cookie上以及服务器数据库或内存中的某个位置。由于我使用的是connect-mongo,因此connect.id应存储在db.sessions中。

但我在服务器端找不到connect.id。他们在哪里储存这个价值?如果我的理解是错误的,请更正。谢谢!

2 个答案:

答案 0 :(得分:1)

如果您阅读connect-mongo的{​​{3}},则Mongo文档的对象ID是会话ID:

var s = {_id: sid, session: this._serialize_session(session)};
source code中的

// get the sessionID from the cookie
req.sessionID = unsignedCookie;

但是,您不仅可以在屏幕截图中看到Cookie ID,因为session middleware会将哈希值附加到Cookie值(请参阅this relevant answer),因此sid.hash Cookie你看到的价值。

这是cookie-signature module,其中存储了散列值:

  // set-cookie
  val = 's:' + signature.sign(val, secret);
  val = cookie.serialize(key, val);

您还可以阅读relevant source code以获得更透彻的理解。

答案 1 :(得分:1)

express.js的会话cookie功能实际上由connect

提供

您设置的密钥用于将数据库中的会话ID签名为您看到的值

检查source code