什么时候应该使用会话变量而不是cookie?

spr*_*man 55 cookies http session-variables

会话变量和cookie看起来与我非常相似.我理解技术差异,但您如何决定何时使用其中一个?

Dan*_*llo 54

  • 会话存储在服务器上,这意味着客户端无法访问您存储的有关它们的信息.存储在服务器上的会话数据不需要与每个页面完整传输; 客户端只需要发送一个ID,然后从服务器加载数据.

  • 另一方面,Cookie存储在客户端上.它们可以长时间保持耐用,并且当您拥有一组Web服务器时,可以让您更顺畅地工作.但是,与Sessions不同,存储在Cookies中的数据会随每个页面请求一起传输.

  • 避免将数据存储在cookie中

    • 它可以被最终用户看到,阅读和操纵,或被具有恶意意图的人截获.除了"session_id"之外,您不能信任cookie中的任何数据.
    • 它会增加您的带宽,如果您为每个用户每页请求添加1k数据,这可能会使您的带宽增加10-15%.从$$的角度来看,这可能并不昂贵,但它可能来自性能方面.它有效地将每台服务器上的带宽减少10-15%,即它可能会导致您需要更多服务器.
  • 您可以在会话数据中存储的内容取决于您拥有的数据量和用户数.no_of_users*size_of_session_data必须小于服务器上可用的可用内存.

  • 还要注意,如果重新启动Web服务器,会话数据将丢失 (4认同)
  • 公平地说,"会话"的大多数实现都需要cookie支持,因此服务器可以将客户端与会话相关联.有无cookie的实现可以为查询字符串添加额外的数据,但通常它们是例外. (4认同)
  • @Ben,并非总是如此,PHP使用文件来持久化会话,因此可以抵抗重启(就像db存储一样).通常,只有在会话数据持久存储在内存中时才会丢失会话数据,或者您使用的是应用程序服务器Glassfish等. (2认同)
  • 您还可以控制会话数据的存储时间。甚至可以自定义每个用户的持续时间。http://php.net/manual/en/function.session-set-save-handler.php (2认同)

Boz*_*zho 10

  • 始终使用会话
  • 仅在需要更长时间登录会话时才使用cookie - 然后添加带有加密userId的cookie.

  • 如果您说"始终使用会话",服务器性能是否可能成为问题? (6认同)

Dan*_*den 8

大多数情况下,会话状态使用cookie持久化.所以这不是一个或另一个的问题,而是如何一起使用它们.

使用框架的会话基础结构可以使事情变得更容易,但使用cookie手动跟踪状态通常可以提供更精细的控制.正确的解决方案取决于您要完成的任务.

  • “正确的解决方案取决于您要实现的目标。” 我相信这正是问题的根源所在。 (2认同)

dan*_*ben 5

Cookie可以比单个会话持续更长时间.但是,cookie也可能被用户删除,或者您的浏览器不接受cookie的用户(在这种情况下,只有服务器端会话才有效).


Sta*_*asM 5

Cookie是客户端的,会话是服务器端的.将Cookie用于您可以信任用户的小块数据(如字体设置,网站主题等),以及服务器端数据的不透明ID(例如会话ID).预计这些数据可能随时丢失,并且不可信任(即需要消毒).使用会话数据更大的数据块(许多系统可以存储对象,数据结构等),你必须相信的 - 像授权状态等.一般情况下,使用会话数据存储较大的状态数据.

如果需要GUI,缓存等,您也可以将授权状态存储在cookie中,但不要相信它,也不要依赖它存在.Cookie易于删除,易于伪造.会话数据更难以伪造,因为您的应用程序控制它.