【发布时间】:2013-08-30 07:39:05
【问题描述】:
最近我偶然发现了一些建议使用 cookie 来存储会话数据的文章。 我喜欢这个想法,并通过添加一个运行良好的 CookieStorage 类来扩展我的会话存储(请注意,每个用户我使用唯一的哈希密钥来签名和加密数据) 但是,还有很多其他文章建议不要将敏感数据存储在 cookie 中,即使您对值进行了加密和签名。
就个人而言,我没有理由不这样做,尤其是在为每个用户使用不同的密钥加密和签名值时。数据被泄露的风险与正常会话相同,不是吗?更不用说如果你使用 SSL,那么劫持的风险就会被消除。
我认为这种方法的好处是,如果会话数据不大,服务器上用于打开/读取/写入会话数据的 IO 操作更少,无论存储是基于文件、数据库还是基于内存
感谢您对此事的反馈
谢谢
【问题讨论】:
-
您在减少 I/O 方面看到的好处很可能一开始并没有那么大(尤其是 deceze 已经说过,当您使用 memcached 或其他东西时)——但您购买的是更多数据发送 每个 HTTP 请求,这将使用户浏览您的网站的速度变慢。 (您可以将 cookie 限制到某个路径,可以,但如果您想在项目的每个页面上使用它们,那么该路径很可能只是
/) -
确实响应会更大,但这也取决于会话数据。如果你的会话很小,你不会有问题。另一方面,如果您有一个非常繁忙的站点,只需使用 cookie 作为会话的存储空间,就可以节省大量 I/O。
-
不仅响应会更大,请求也会更大。如果没有额外的措施,cookies 也会发送到静态资源请求中,比如 JS、CSS、图像,即使它们对会话数据不是最不感兴趣的(是的,可以通过将它们放在另一个子域中来克服)。对于您的“非常繁忙”的站点,上述用于存储会话数据的 memcache 或类似内容将减少/消除物理 I/O 操作。而 cookie 中的加密数据将意味着更多的 CPU 消耗用于解密。
-
而且因为数据要被加密,它永远不会被客户端使用。所以在客户端和服务器之间来回发送它真的没有多大意义。结论:除了在非常特殊的情况下,恕我直言,这仍然不是一个好主意。
-
当然,memcached/redis 是很好的选择,但仍然是 I/O。假设您还使用上述内容进行缓存并且页面命中缓存假设 5 次以获取数据,并且您需要为每个请求执行 2 次操作(仅用于会话),假设一个非常高流量的站点,它可能值得 CPU 周期。至于被加密的数据和不可用的客户端,我没有看到不利的一面。您是否使用所有 cookie 客户端?我很少这样做