与express-session和cookie-session有什么区别?

时间:2014-05-09 13:59:53

标签: node.js session cookies express connect

我是Express新手。由于Express 4.x已删除捆绑的中间件。 我需要使用任何我想要使用的中间件。当我在github上阅读带有express-sessioncookie-session的自述文件时,我觉得很难理解其中的区别。

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

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,我总是在我的终端中获得{}。

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

req.session: { cookie: { 
     path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true 
   } 
}

req.cookie: {user: 's:aJ97vKA5CCwxqdTj0AV1siRQ.fWusS5+qfCKICtwkfrzcZ/Gq8P0Qdx/kx8mTBhoOhGU'}

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

7 个答案:

答案 0 :(得分:34)

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

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

答案 1 :(得分:8)

这两者之间的基本区别与会话数据的存储方式和位置有关。 Cookie会话主要用于轻量级会话应用,其中会话数据存储在Cookie中但位于客户端[浏览器] 中,而快速会话仅在客户端的cookie中存储会话标识符,同时将会话数据完全存储在服务器上。 Cookie会话在后端未使用数据库的应用程序中很有用。但是,会话数据不能超过cookie大小。在使用数据库的情况下,它就像缓存一样,可以停止频繁的数据库查找,而且价格昂贵。

答案 2 :(得分:4)

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

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

我尝试使用快速会话,但我无法启用安全Cookie,请参阅issue here

然后我尝试使用几乎相同的代码,但使用 cookie-session 代替

   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: 'example.com',
        expires: expiryDate
      }
    })

    app.use(session)

我刚刚将require('express-session')更改为require('cookie-session')并添加了secureProxy: true,:一切都开箱即用。

另请注意,这两个软件包都由expressjs维护,因此在我的用例中我很幸运地发现cookie会话符合我的需求。

答案 3 :(得分:4)

express-session将会话标识符存储在cookie中,而实际会话数据存储在后端会话存储中,如connect-redis,其中cookie-session允许您将会话数据存储在cookie中(客户端)。

来自cookie-session的文档:

  

用户会话可以通过两种主要方式存储在cookie中:在...上   服务器或客户端。该模块将会话数据存储在   cookie中的客户端,而像快递会话存储的模块   只有cookie上的客户端上的会话标识符并存储   服务器上的会话数据,通常在数据库中。

使用cookie-session的主要优势是,当您拥有群集node.js应用时,您就不必依赖于在分叉流程之间共享会话数据。

答案 4 :(得分:4)

官方Express.js documentation是指

这两个模块之间的主要区别在于它们如何保存cookie会话数据。

express-session中间件将会话数据存储在服务器上;它将会话ID仅保存在cookie本身中,而不保存会话数据。默认情况下,它使用内存存储,并且不适用于生产环境。在生产中,您需要设置一个可扩展的会话存储;请参阅兼容的会话存储列表。

相反,cookie-session中间件实现了cookie支持的存储:它将整个会话序列化为cookie,而不仅仅是会话密钥。仅当会话数据相对较小且容易编码为原始值(而不是对象)时才使用它。尽管浏览器每个cookie至少应支持4096字节,但为确保不超出限制,每个域的大小不得超过4093字节。另外,请注意,cookie数据对于客户端是可见的,因此,如果有任何理由确保其安全或晦涩,则express-session可能是一个更好的选择。

答案 5 :(得分:0)

获取非空的console.log(req.session),您需要在记录之前设置会话值。

来自cookie-session repo(https://github.com/expressjs/cookie-session):

app.get('/', function (req, res, next) {
 req.session.views = (req.session.views || 0) + 1
 console.log(req.session)
 res.end(req.session.views + ' views')
})

如果你从未在req.session对象上设置任何信息,它将返回空。

答案 6 :(得分:0)

v4-> cookie会话是(建立基于cookie的会话。)等于-> v3 express.cookieSession

v4-> express-session是(建立基于服务器的会话(仅开发))。等于-> v3 express.session