Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 什么';快速会话和cookie会话有什么区别?_Node.js_Session_Cookies_Express_Connect - Fatal编程技术网

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
,其中as
cookie 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')
})