Express Session and Cookie



我不明白express session是如何进行序列化和反序列化的。

当我安装Express会话时,它说我需要一个序列化和反序列化函数:

passport.serializeUser(function(user, done) {
  done(null, user._id);
});
passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

Server.js从登录表单发布路由:

router.post('/login', passport.authenticate('login', {
    successRedirect: '/home',
    failureRedirect: '/',
    failureFlash : true 
}));

我的问题是,当用户试图从我的HTML上的form登录并点击上面指定的'/login'的端点时,这就是express会话的作用所在吗?那么express会话将创建一个会话id为user._id的cookie,正如我的serializeUser函数中指定的那样,它将把这个cookie提供给客户端?因此,现在,当客户端在端点'/login'向同一服务器发出任何后续请求时,它将自动调用反序列化用户,而无需经过router.post('/login', ...)中提供的passport中间件?

我不确定何时何地调用这两个序列化函数,以及express会话实际是如何使用它们的?如有任何澄清,不胜感激。

要理解这一点,我们必须了解什么是cookie以及它是如何工作的基本概念?

Cookie:

它是存储在计算机浏览器中的数据集合,在请求标头中随每个请求发送到服务器,并在响应标头中由浏览器从服务器接收。

需要什么饼干

现在我们知道http请求是无状态的(意味着每个请求都是对服务器的新请求,例如,如果你登录某个网站,这是你提出的第一个请求,然后你提出第二个请求来显示你的个人资料,那么此时服务器不知道你是谁),因此为了获得授权,服务器需要知道你是什么人,并且这些信息存储在cookie中。当你登录时,你的凭据会被发送到服务器,服务器会在cookie中设置这些凭据,然后将其发送到浏览器,之后你提出的每个请求,cookie都会被发送回服务器,然后服务器会进行验证,从而允许你访问相关信息。

现在你应该想到一点,cookie对于存储用户凭据来说是安全的吗

答案是一个很大的"否",因为用户可以在空闲时进行操作。是的,cookie数据可以随时被操纵,所以将用户凭据存储在cookie中是不安全的,那么解决方案是什么?我们来谈谈会话的概念。

会话:

会话是一个存储在服务器端而不是浏览器端的对象,因此保持安全。现在,它如何帮助授权,请参阅:当用户登录时,请求被发送到服务器,并创建一个对象会话,该会话存储用户的凭据,该会话对象被赋予一个唯一的id,该id使用serializerUser()函数加密,该id存储在cookie中,然后发送到浏览器。现在,如果用户也试图操纵它,他/她就无法操作,因为cookie只包含经过加密的会话id,无法通过任何方式进行解码。然后,这个cookie与另一个请求一起发送到浏览器,然后通过deserializeUser()函数并得到与存储的会话id匹配的解码,从而验证用户。

最新更新