express-session 和 cookie-session 有啥区别?

Posted

技术标签:

【中文标题】express-session 和 cookie-session 有啥区别?【英文标题】:What's difference with express-session and cookie-session?express-session 和 cookie-session 有什么区别? 【发布时间】:2014-06-27 07:23:58 【问题描述】:

我是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,我的终端总是会收到。

对于express-session,我得到这样的东西。

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


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

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

【问题讨论】:

What is the difference between 'session' and 'cookieSession' middleware in Connect/Express?的可能重复 【参考方案1】:

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

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

【讨论】:

是否有一个好地方可以让我了解仅客户端与服务器端 cookie/会话的优缺点?对于一无所知的人,很难知道从哪里开始 @AlexMills 答案中指向 Rails 指南的链接几乎解释了它。【参考方案2】:

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

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

我尝试使用 express-session,但无法启用安全 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-session 符合我的需求。

【讨论】:

请注意,这是由 express 前面的反向代理配置错误引起的(缺少X-Forwarded-Proto)。 express-session 也完全支持安全 cookie。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

来自cookie-session的文档:

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

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

【讨论】:

集群部分和它的大优势是正确的,那么安全方面呢【参考方案5】:

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

来自 cookie-session 存储库 (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】:

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

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

【讨论】:

【参考方案7】:

官方Express.jsdocumentation指的是

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

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

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

【讨论】:

【参考方案8】:

这里有一个简单的解释:-

用户会话可以通过 cookie 以两种主要方式存储:在服务器上在客户端

express-session 仅将客户端上的会话标识符存储在 cookie 中,并将会话数据存储在服务器上,通常存储在数据库中。 cookie-session 将客户端上的会话数据存储在 cookie 中

【讨论】:

以上是关于express-session 和 cookie-session 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

node的cookie-parser和express-session

与 socket.io 一起使用时 express-session 未设置会话 cookie

什么时候应该将 cookie-parser 与 express-session 一起使用?

express-session整理

Node.js、Angular、express-session:由于 cookie 策略(sameSite cookie),Chrome 80 不保存会话

express-session 在设置 cookie 时会导致服务器崩溃?