为什么要在服务器上存储会话而不是在 cookie 中?

14 投票
4 回答
5558 浏览
提问于 2025-04-16 05:35

我使用Flask已经有一段时间了,真的很喜欢这个框架。不过,有一点我一直搞不明白,就是在很多地方都提到要把会话信息存储在服务器上,而把会话ID放在客户端,这样就能识别会话。但是在使用Flask之后,我觉得没必要这样做。把会话信息作为一个加密的cookie保存在客户端就能满足我的需求,而且看起来也很安全。唯一的问题是,我无法加密会话密钥,比如:

session['life'] = 'the great one'

在客户端保存的cookie中会显示为

life='gfhjfkjdfa some encryption kj'

但这有什么关系呢?因为它还是加密的。我相信这里的人比我懂得多,所以希望有人能帮我解释一下 :-)

4 个回答

7

除了上面提到的几点,还有一些其他的事情需要注意:

  1. 用户可以通过浏览器的设置来禁用 cookies。很多杀毒软件也会扫描 cookies,并把它们标记为风险,这样可能导致用户的电脑上不允许使用 cookies。

  2. 用户甚至可以在使用网站的过程中删除 cookies。(实际上,我前几天就不小心做了这件事,当我的电脑扫描出跟踪 cookies 时,我只需点击“清理”,它们就全没了)。如果用户删除了 cookies,那么用户的状态信息就会丢失。

如果你用 cookies 来管理整个状态,那么你就总是依赖于用户的环境和设置。因此,你可能至少需要一个备用机制,以防 cookies 被删除或禁用,这样你的应用才能正常工作。

8

如果服务器需要用到会话数据,那么把这些数据存储在服务器上是比较合理的。这样可以减少客户端和服务器之间传输的数据量。而且,浏览器的 cookies 存储数据的容量是有限的。

21

即使你的数据是加密的,用户仍然可以把他们的cookie恢复到之前的状态(除非你开始使用一次性ID等进行编码)。

比如说,cookie显示用户有100个积分,用户花掉了这100个积分后,新的cookie显示他们的积分变成了0。此时,他们可以把之前的cookie(显示有100个积分的)恢复回来。

根据你加密cookie的方式,用户可能还可以删除一些密钥,或者插入虚假的数据等等。

撰写回答