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

Tin*_*ple 39 cookies session connect node.js express

我是新手Express.由于Express 4.x已取消捆绑中间件.我需要使用任何我想要使用的中间件.当我在github上用快速会话cookie会话阅读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);
Run Code Online (Sandbox Code Playgroud)

因为cookie-session,我总是在我的终端得到{}.

因为express-session,我得到这样的事情.

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

req.cookie: {user: 's:aJ97vKA5CCwxqdTj0AV1siRQ.fWusS5+qfCKICtwkfrzcZ/Gq8P0Qdx/kx8mTBhoOhGU'}
Run Code Online (Sandbox Code Playgroud)

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

bre*_*hin 37

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

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

  • 有没有什么地方可以让我了解仅客户端与服务器端 cookie/会话的优缺点?对于什么都不知道的人来说,很难知道从哪里开始 (2认同)

Doo*_*d93 11

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


Abh*_*eet 7

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

从以下文档中cookie-session

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

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

  • 集群部分及其主要优点是对的,那么安全方面呢? (2认同)

Amj*_*mar 6

Express.js 官方文档是指

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

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

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


Gia*_*ati 5

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

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

我尝试使用 express-session,但无法启用安全 cookie,请参阅此处的问题

然后我尝试使用几乎相同的代码,但使用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)
Run Code Online (Sandbox Code Playgroud)

我刚换require('express-session')require('cookie-session')并补充secureProxy: true,:一切工作的开箱即用。

另请注意,这两个包均由expressjs维护,因此可能在我的用例中,我很幸运地发现 cookie-session 符合我的需求。

  • 请注意,这是由 express 前面配置错误的反向代理引起的(缺少“X-Forwarded-Proto”)。`express-session` 也完全支持安全 cookie。 (13认同)