【问题标题】:Express Session Cookie Management快速会话 Cookie 管理
【发布时间】:2017-01-07 13:48:09
【问题描述】:

我很难理解 express-session 包中生成的 cookie 的作用。

所以在下面的代码中:

var session = require('express-session')
var store = require('session-file-store')(session)

app.use(session({
    name: 'session-id',
    secret: 'sdafjlkdashf34khrjke'
    saveUninitialized: true,
    resave: true,
    store: new Store()
})

func auth (req, res, next) {
    if (!req.session.user) {
        req.session.user = 'admin'
        next()
    }else {
        console.log(req.session)
    }
}

app.get('/', function (req, res) {
  res.send('Hello World!');
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

所以本质上在上面的简单代码 sn-p 中,每当用户向服务器发出请求(例如:localhost:3000/)时,会发生 3 件事:

  1. 将为该特定客户端创建一个新的会话对象。
  2. 在该新会话对象中,将为该特定客户端自动附加一个 cookie。
  3. 最后,由于我使用的是会话文件存储,因此只有 cookie 信息(不是会话对象)会保存到我本地计算机上的 session 文件夹中。

现在假设有 50 个 cookie 对象存储在 session 文件夹中,因为有 50 个客户端向我的服务器发出请求。

所以我的问题是,每当这 50 个用户中的一个向我的服务器发出另一个请求时,express-session 如何知道要选择哪个 cookie 对象(来自 session 文件夹)并将其附加到要使用的 req 对象在代码中。

【问题讨论】:

  • 好的,所以在做了一些研究之后,我意识到当一个特定的客户端(比如说你的浏览器)向我的服务器发出请求时,然后基于客户端的域(换句话说,IP 地址,我想?有人可以在这里纠正我指的是什么域)服务器知道哪个cookie属于那个客户端。更多解释在这里:*.com/questions/8805958/….

标签: javascript session cookies


【解决方案1】:

会话对象是一个常规的 JavaScript 对象,您可以在其中存储(合理地)特定会话的通用信息。

会话由唯一标识符、会话密钥或会话 ID 标识。 是存储在 cookie 中的内容,用于将客户端与会话文件相关联。

这是为我设置的示例 cookie:

set-cookie: session-id=s%3AvdD2a8WqJD3R5L5UjZ_oWDkWMVbEa8UF.%2BXjKW6hIaX%2FfDAJm2lSZrEJ0xFigoeHjru1rZT7Na0E

它由四个部分组成(为了清楚起见,我对它们进行了 url 解码):

  • s:express-session设置的前缀,表示会话cookie已签名;
  • vdD2a8WqJD3R5L5UjZ_oWDkWMVbEa8UF:唯一标识符。如果您查看存储会话的目录,您会发现一个具有该名称的 JSON 文件;
  • .:会话 id 和签名之间的分隔符;
  • +XjKW6hIaX%2FfDAJm2lSZrEJ0xFigoeHjru1rZT7Na0E:cookie签名(防止篡改);

所以 cookie 本身不包含任何会话信息,这些信息都存储在文件中。

这是一个会话文件的示例:

{
  "cookie": {
    "originalMaxAge": null,
    "expires": null,
    "httpOnly": true,
    "path": "/"
  },
  "value": 1472628829554, // this is a value I stored in the session
  "__lastAccess": 1472628829557
}

就 cookie 而言,域是指 cookie 属于哪个域(或网站)。如果example.com 设置了 cookie,则 cookie 将绑定到该域,并且只会发送到该网站。但是,这与识别发送 cookie 的客户端没有任何关系,这是会话 id 的工作。

【讨论】: