在具有Express-Session的NodeJS中使用安全cookie时,会话没有持久化

时间:2018-11-09 10:34:49

标签: node.js express session-cookies express-session

我正在使用NodeJS + express + express-session来持久化应用程序中任何位置的用户ID。

在第一个路线上,我的会话已定义

userProfileRoutes.route('/authentication').post((req, res) => {
  req.session.userID = 10; //example
  console.log(req.session)
}

console.log的结果是:

Session {
  cookie:
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true,
     secure: true },
  userID: 10 } // this is the right value

但是,从另一条路线看,我看不到该值:

userProfileRoutes.route('/edit').get(function (req, res) {
  console.log('After the nav edit route');
  console.log(req.session);
}

这将打印

Session {
  cookie:
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true,
     secure: true }
} // ID VARIABLE DISAPEARS HERE

我正在使用以下参数配置express-session

app.use(session({
  secret: 'secret',
  proxy: true,
  resave: false,
  saveUninitialized: true,
  withCredentials: true,
  cookie: { secure: true },
  store: new MongoStore({ mongooseConnection: db })
}));

为什么我的userID不能在请求之间和所有路由上都保持不变?

1 个答案:

答案 0 :(得分:1)

您正在设置cookie: {secure: true},但尝试使用HTTP访问服务器。

来自express-session documentation

  

cookie.secure

     

将其设置为true时请注意,因为如果浏览器没有HTTPS连接,则兼容的客户端将来不会将cookie发送回服务器。

     

请注意,安全:真是推荐的选项。但是,它需要启用HTTPS的网站,即,对于安全Cookie来说,必须使用HTTPS。如果设置了安全性,并且您通过HTTP访问网站,则将不会设置Cookie。

请确保您正在使用HTTPS(始终在生产中!)或将cookie.secure设置为false(也许,并且仅用于开发!)

Cookie中的安全标记

  

安全标志是可以在HTTP响应中向用户发送新cookie时由应用程序服务器设置的选项。安全标记的目的是防止由于以明文形式传输cookie而导致未经授权的各方查看cookie。

     

要实现此目标,支持安全标记的浏览器将仅在请求进入HTTPS页面时发送带有安全标记的cookie 。换句话说,浏览器将不会通过未加密的HTTP请求发送带有安全标志的cookie。   通过设置安全标志,浏览器将阻止cookie通过未加密的通道传输。

来自https://www.owasp.org/index.php/SecureFlag

快速会话中的饼干

按照惯例,express-session使用cookie存储会话ID ,并使用服务器端存储(在您的情况下为mongoDB)存储会话数据。如果浏览器因为找不到有效的cookie而没有发送您的会话ID,则服务器将假定没有会话,并在每次请求时将用户ID保存在新的会话中。

进入/authentication后,它将把ID保存在新的会话中。当您尝试读取其他请求时,会话ID已更改,并且userID中没有值。