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

bnlyeluc  于 2023-05-22  发布在  Node.js
关注(0)|答案(9)|浏览(143)

我是新来的快递员。由于 Express 4.x 已删除捆绑的中间件。
我想使用的任何中间件都应该是必需的。当我在github上阅读express-sessioncookie-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'}

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

pod7payv

pod7payv1#

基本上,express-session更抽象,它支持不同的会话存储(如文件,DB,缓存等)。
cookie-session是一个简单/轻量级的基于cookie的(cookie是唯一支持的存储引擎:在cookie)会话实现中,所有会话信息都存储在客户机上。这类会话最著名的可能是它的Rails实现。

jhkqcmku

jhkqcmku2#

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

zzzyeukh

zzzyeukh3#

express-session将会话标识符存储在cookie中,而实际的会话数据驻留在后端会话存储中,如connect-redis,其中cookie-session允许您将会话数据存储在cookie中(客户端)。
cookie-session的文档中:
用户会话可以通过Cookie以两种主要方式存储:在服务器或客户端上。此模块将客户端上的会话数据存储在cookie中,而像express-session这样的模块仅将客户端上的会话标识符存储在cookie中,并将会话数据存储在服务器上,通常存储在数据库中。
使用cookie-session的主要优点是,当你有一个集群node.js应用程序时,你不必依赖于在分叉进程之间共享会话数据。

z6psavjg

z6psavjg4#

让我分享我发现的一个重要差异:安全Cookie
我在nginx代理后面有一个处理SSL的节点进程。
我尝试使用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)

我只是将require('express-session')更改为require('cookie-session')并添加了secureProxy: true,:一切都很顺利。
还要注意的是,这两个包都是由expressjs维护的,所以在我的用例中,我很幸运地发现cookie-session符合我的需要。

fae0ux8s

fae0ux8s5#

官方的Express.js文档引用了
这两个模块之间的主要区别在于它们如何保存cookie会话数据。
express-session中间件在服务器上存储会话数据;它只在cookie本身中保存会话ID,而不是会话数据。默认情况下,它使用内存中存储,并且不是为生产环境设计的。在生产环境中,您需要设置一个可伸缩的会话存储;查看兼容会话存储的列表。
相比之下,cookie-session中间件实现了cookie支持的存储:它将整个会话序列化为cookie,而不仅仅是会话密钥。仅当会话数据相对较小且易于编码为基元值(而不是对象)时才使用它。虽然浏览器应该支持每个cookie至少4096字节,但为了确保不超过限制,每个域的大小不要超过4093字节。此外,请注意cookie数据对客户端是可见的,因此如果有任何理由保持其安全或模糊,那么express-session可能是更好的选择。

yqlxgs2m

yqlxgs2m6#

getannon-empty console.log(req.session)需要在记录之前设置会话值。
从cookie会话存储库(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对象上设置任何信息,它将返回空。

hpcdzsge

hpcdzsge7#

v4-> cookie-session is(Establish cookie-based sessions.)equals in ->v3 express.cookieSession
v4-> express-session是(建立基于服务器的会话(仅限开发))。equals in ->v3 express.session

nzkunb0c

nzkunb0c8#

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

用户会话可以通过两种主要方式使用cookie进行存储:服务器端客户端
*express-session只在客户端的cookie中存储会话标识符,并将会话数据存储在服务器上,通常存储在数据库中。
*cookie-session将客户端的会话数据存储在cookie中

w7t8yxp5

w7t8yxp59#

express-session将会话数据存储到可配置的后端,从内存到任意数量的数据库,因此允许基本上无限的会话存储。
cookie-session将会话数据存储到cookie中,因此仅限于4k字节以下的会话存储位。
其余的大部分差异都是这个决定的后果:
cookie-session不依赖于外部数据存储(因此需要设置、配置和维护的基础架构更少)。
cookie-session在负载均衡器后工作,无需启用/配置“sticky-sessions”。

相关问题