快递会话和Cookie会话有什么不同?

我是Express新手。 由于Express 4.x已经删除了捆绑的中间件。 任何我想使用的中间件应该是必需的。 当我通过github上的express-session和cookie-session阅读README时,我感觉很难理解它们之间的区别。

所以我试图写简单的代码来弄清楚。 我为每个中间件运行两次。

 var express = require('express') , cookieParser = require('cookie-parser') , session = require('cookie-session') , express_sess = require('express-session') , app = express(); app.use(cookieParser()) app.use(session({ keys: ['abc'], name: 'user' })); //app.use(express_sess({ secret: 'abc', key: 'user'})); app.get('/', function (req, res, next) { res.end(JSON.stringify(req.cookies)); console.log(req.session) console.log(req.cookies) }); app.listen(3000); 

对于cookie-session ,我总是在我的terminal中{}。

对于express-session ,我得到这样的事情。

 req.session: { cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true } } req.cookie: {user: 's:aJ97vKA5CCwxqdTj0AV1siRQ.fWusS5+qfCKICtwkfrzcZ/Gq8P0Qdx/kx8mTBhoOhGU'} 

这真让我困惑。 那么如何用基本用法来解释结果呢? 他们之间有什么区别? 我应该什么时候使用它们?

基本上, express-session更抽象,它支持不同的会话存储(如文件,数据库,caching和什么)。

cookie-session是一个简单/轻量级的基于cookie的(cookie是唯一支持的存储引擎:所有的会话信息都存储在客户端,以cookie的forms)会话实现。 这种会话可能是最着名的Rails实现 。

让我分享我发现的一个重要区别: 安全的cookie

我在处理SSL的nginx代理后面有一个节点进程。

我尝试了快速会话,但无法启用安全的cookie,请参阅此处的问题 。

然后,我尝试了几乎相同的代码,但与cookie会话 ,而是类似的东西

  const expressSession = require('cookie-session') var expiryDate = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000); // 7 days const session = expressSession({ secret: sessionSecret, resave: false, saveUninitialized: true, cookie: { secureProxy: true, httpOnly: true, domain: 'beintoo.net', expires: expiryDate } }) app.use(session) 

我只是把require('express-session')改成require('express-session') require('cookie-session')并添加了secureProxy: true,一切都开箱即用。

还要注意,这两个软件包都由expressjs维护,所以可能在我的使用情况下,我很幸运地发现cookie会话符合我的需求。

这两者之间的基本区别涉及如何以及在哪里存储会话数据。 Cookie会话基本上用于会话数据存储在cookie中但位于客户端[浏览器]中的轻量级会话应用程序,而Express Session仅在客户端的cookie中存储仅仅会话标识符,而将会话数据完全存储在服务器上。 Cookie Session在后端没有使用数据库的应用程序中很有用。 但是,会话数据不能超过cookie的大小。 在使用数据库的情况下,它的作用就像是一个caching,用于停止频繁的数据库查找,而且这种查询很昂贵。