为什么我需要在每次使用 PassportJS 请求时反序列化用户?

Why do I need to deserialize user at each request with PassportJS?

我相信会有一个明显的答案,但我在官方文档和互联网上的任何地方都没有找到任何解决方案。

对于 Passport.js 我们必须定义两种方法,一种用于序列化,一种用于反序列化用户会话。

来自official documentation我读到:

Only the user ID is serialized to the session, keeping the amount of data stored within the session small. When subsequent requests are received, this ID is used to find the user, which will be restored to req.user

我的第一个问题是关于术语 序列化,根据 Wikipedia:

Serialization is the process of translating data structures or object state into a format that can be stored

但是在一个完全由 Javascript 创造的世界中,既然用户是对象,对象是原生的,我们为什么要序列化?我们可以将整个对象存储在会话中,有什么禁止的?

然后,反序列化是一个需要大量消耗资源的过程,因为与数据库交互。那么,为什么要在任何请求时执行反序列化?我们不能只做一次并保留结果以供进一步请求吗?

我阅读了很多关于 PassportJS 的内容,并且我能够实现登录系统,但我想澄清这些晦涩的方面。 谢谢。

如您所说,唯一保留在会话中的用户数据是用户 ID。如果您想将用户 ID 的反序列化缓存到用户,那么您必须自己维护它(大概在内存中,因为您担心检索数据的时间)。这样做的问题是,您必须 invalidate/update 缓存任何更新用户的操作(也许用户更改了他们的电子邮件地址或密码),否则您可能会在 req.user.[= 上拥有过时的数据。 11=]

您暗示您正在使用数据库(而不是像 Redis 这样的内存存储)并且担心在每次请求时从数据库中获取用户的性能影响。在不了解您的特定设置的情况下无法确定,但我认为您的担忧可能是没有根据的 - 一次调用基于 ID 获取用户记录(数据库针对哪些数据库进行了优化 - 上的主键索引例如,基于 SQL 的数据库)不应为请求增加任何显着的延迟。