确定会话的替代方法以保持用户登录


Identifying alternative to session for keeping user logged in

我正在用PHP做一个练习项目(制作论坛),并尝试决定一种保持用户登录的机制。我创建了一个用户类,通过该用户进行身份验证(登录时),所有将来与用户帐户相关的操作都将通过该类(即用户相关信息检索,当用户发布帖子/评论时等)。

为了保持用户登录,最简单的途径似乎是使用会话并将用户对象存储在会话中(而不是cookie,因为这会带来安全风险),但是在进行了一些研究之后,我发现会话会给系统带来巨大的负载,特别是如果其中保存了大量数据。

在试图找出解决方案后,我想出了两种选择:

  1. 在会话中仅放置用户 ID,并通过用户 ID 每次重新制作用户对象。但是,这似乎是一个糟糕的实现,因为每次都必须重新查询数据库。

  2. 在会话中
  3. 保存用户 ID(当然,一旦用户成功登录),并将整个对象保存在 cookie 中,并且每次在使用 cookie 之前,通过将会话中的用户 ID 与 cookie 中的用户 ID 匹配来验证 cookie。我不太确定 cookie 是如何工作的,但由于一些关键用户信息可能存储在用户对象中(因此是 cookie),这里是否存在某种安全风险?饼干会被盗吗?

有没有其他更好的选择?是使用会话或 Cookie 的不同方式,还是使用某种与会话和 Cookie 完全不同的方法?

我会选择:

  1. 在会话中仅放置用户 ID,并通过用户 ID 每次重新制作用户对象。但是,这似乎是一个糟糕的实现,因为每次都必须重新查询数据库。

并打开MySQL查询缓存,这将使您的频繁查询更快。我不建议$_SESSION你的数据是否很大(但这些数据实际上有多大?

一开始你应该

忘记 2. 选项。将关键数据保存在 cookie 中是非常危险的。

第一个选项要好得多。您需要选择:$_SESSION 或数据库中的数据。如果是大型对象,则可以序列化它们并发送到数据库中的 blob 字段中。或者另一个想法:将序列化数据保存在文件中,然后可以避免额外的查询。但当然还有另一个问题:许多 IO 文件操作。

考虑一下,测试一些选项,然后您应该能够为您选择最佳选项。