Node.js 什么';快速会话和cookie会话有什么区别?
我是新来的Node.js 什么';快速会话和cookie会话有什么区别?,node.js,session,cookies,express,connect,Node.js,Session,Cookies,Express,Connect,我是新来的Express。由于express4.x已删除捆绑的中间产品。 我想使用的任何中间件都是必需的。当我在github上阅读自述文件时,我觉得很难理解其中的区别 所以我试着写一些简单的代码来解决这个问题。我为每个中间件运行两次 var express = require('express') , cookieParser = require('cookie-parser') , session = require('cookie-session') , express_sess
Express
。由于express4.x
已删除捆绑的中间产品。
我想使用的任何中间件都是必需的。当我在github上阅读自述文件时,我觉得很难理解其中的区别
所以我试着写一些简单的代码来解决这个问题。我为每个中间件运行两次
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会话
,我总是在终端中获取{}
对于express session
,我会得到这样的结果
req.session: { cookie: {
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true
}
}
req.cookie: {user: 's:aJ97vKA5CCwxqdTj0AV1siRQ.fWusS5+qfCKICtwkfrzcZ/Gq8P0Qdx/kx8mTBhoOhGU'}
这真让我困惑。那么如何用基本用法来解释结果呢?他们之间有什么区别?我应该什么时候使用它们 基本上,
express session
更抽象,它支持不同的会话存储(如文件、数据库、缓存等)
而
cookie会话
是一个简单/轻量级的基于cookie的会话实现(cookie是唯一受支持的存储引擎:所有会话信息都存储在客户端的cookie中)。这类会话最著名的可能是它的安全性。让我分享一下我发现的一个重要区别:安全cookies
我在处理SSL的nginx代理后面有一个节点进程
我尝试使用express会话,但无法启用安全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: 'example.com',
expires: expiryDate
}
})
app.use(session)
我刚刚将require('express-session')
更改为require('cookie-session')
,并添加了secureProxy:true,
:一切都是现成的
还请注意,这两个包都是由维护的,因此在我的用例中,我很幸运地发现cookie会话符合我的需要。这两个包之间的基本区别与会话数据的存储方式和存储位置有关。 Cookie session基本上用于轻量级会话应用程序,其中会话数据存储在Cookie中,但在客户端[浏览器]中,Express session仅在Cookie中存储一个会话标识符,而会话数据则完全存储在服务器上。
Cookie会话在后端不使用数据库的应用程序中非常有用。但是,会话数据不能超过cookie大小。在使用数据库的情况下,它像缓存一样停止频繁的数据库查找,这非常昂贵。
express session
将会话标识符存储在cookie中,而实际会话数据则存储在后端会话存储中,如connect redis
,其中ascookie session
允许您将会话数据存储在cookie(客户端)中
从cookie会话的文档中
:
用户会话可以通过两种主要的Cookie方式存储:在
服务器或客户端上的。此模块将会话数据存储在
cookie中的客户端,而像express session这样的模块存储
只有客户端上的会话标识符在cookie中,并存储
服务器上的会话数据,通常在数据库中
使用
cookie会话的主要优点是,当您有一个集群node.js
应用程序时,您不必依赖于在分叉进程之间共享会话数据。获取一个非空的console.log(req.session)您需要在登录之前设置会话值
从cookie会话repo():
如果您从未在req.session对象上设置任何信息,它将返回空。v4->cookie session is(建立基于cookie的会话。)等于in->v3 express.cookieSession
v4->express会话是(建立基于服务器的会话(仅限开发))。等于->v3 express.session官方express.js所指的
这两个模块之间的主要区别在于它们如何保存cookie会话数据
express session
中间件在服务器上存储会话数据;它只将会话ID保存在cookie本身中,而不保存会话数据。默认情况下,它使用内存存储,不是为生产环境设计的。在生产中,您需要设置一个可扩展的会话存储;请参阅兼容会话存储的列表
相反,cookie会话
中间件实现了cookie支持的存储:它将整个会话序列化为cookie,而不仅仅是会话密钥。仅当会话数据相对较小且易于编码为基本值(而不是对象)时才使用它。虽然浏览器应该支持每个cookie至少4096字节,但为了确保不超过限制,每个域的大小不要超过4093字节。另外,请注意,cookie数据对客户端是可见的,因此如果有任何理由使其保持安全或不清晰,那么express session
可能是更好的选择
是否有一个好地方可以让我了解纯客户端与服务器端cookie/会话的优缺点?对于一个一无所知的人来说,很难知道从哪里开始this@AlexMills答案中指向Rails指南的链接很好地解释了这一点。注意:这可能是由于express前面配置错误的反向代理造成的(X-Forwarded-Proto
丢失)。安全cookie也完全受express 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')
})