会话如何在Express.js中与Node.js一起工作?

foo*_*bar 95 javascript cookies session node.js express

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

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

我基本上希望能够看到用户是否已登录,即使当时用户实际上并不在该网站上(例如,当您在其他网站上时,facebook知道您已登录).但我想要明白,我应该先了解会议是如何运作的.

Way*_*inn 157

概观

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

细节

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

客户端

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

[sid].[signature]
Run Code Online (Sandbox Code Playgroud)

其中[SID]是的SessionID和[签名]通过使用初始化会话中间件时提供的密钥签署[SID]产生.签名步骤是为了防止篡改.在不知道所使用的密钥的情况下修改[sid]然后重新创建[签名]在计算上是不可行的.如果不需要修改[sid],会话cookie仍然容易被盗和重用.

这个cookie的名称是

connect.sid
Run Code Online (Sandbox Code Playgroud)

服务器端

如果在中间件cookieParsersession中间件之后发生处理程序,它将有权访问该变量req.cookies.它包含一个JSON对象,其键是cookie键,值是cookie值.这将包含一个名为key的键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
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

user字段是自定义的.其他一切都是会话管理的一部分.

示例来自Express 2.5.

  • @WebHrushi我在考虑一个中间人攻击:http://en.wikipedia.org/wiki/Man-in-the-middle_attack (2认同)

dav*_*vin 41

我从来没有使用过Express.js,虽然根据他们关于这个主题的文档听起来像:

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

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

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

因此,如果您想要检查没有特定req请求对象的内容,就像您说的那样,您只需访问相同的存储空间即可.在第一个文档页面的底部,它详细说明了存储需要实现的必需方法,因此,如果您熟悉存储API,也许您可​​以执行.getAll()类似存在的操作,并循环访问会话数据并阅读任何内容你想要的价值观.


yoj*_*o87 9

我很好奇他们实际上是如何工作的.

试着看看这个答案和wiki的东西.

它是否在客户端存储了一些cookie?

是的,它通常是一个带有指定会话ID的cookie,应该用秘密签名以防止伪造.

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

你不应该在客户端混淆会话cookie.如果你想在服务器端使用会话,你应该检查相关的express.js连接文档.