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

时间:2010-02-10 21:40:52

标签: http cookies session-variables

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

12 个答案:

答案 0 :(得分:52)

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

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

  • 避免在cookie中存储数据

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

答案 1 :(得分:10)

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

答案 2 :(得分:7)

大多数情况下,会话状态使用cookie保留。所以这不是一个问题,而是如何一起使用它们。

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

答案 3 :(得分:5)

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

答案 4 :(得分:5)

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

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

答案 5 :(得分:2)

每次请求都会将Cookie发送到服务器,因此如果您计划存储大量数据,请将其存储在会话中,否则如果您要存储少量数据,则cookie就可以了。任何敏感数据都应存储在会话中,因为cookie不是100%安全的。 Cookie的一个优点是可以节省服务器上通常存储会话数据的内存。

答案 6 :(得分:1)

会话存储在服务器上。如果您将某些内容存储在Cookie中,则用户的浏览器会针对每个请求发送该信息,从用户的角度来看可能会降低您的网站速度。我尽量避免使用cookies。

答案 7 :(得分:1)

PHP会话的一个缺点是会话处理的工作原理。具体而言,只有一个进程/请求可以一次打开会话以进行写入。一旦

session_start() 

会话文件被锁定。如果有更多的流程出现,其余的流程就会堆积起来,等待轮到他们。

换句话说,如果您在页面上使用AJAX来更新多个元素 - 您不希望AJAX请求打开同一个会话 - 它们将被强制进入队列,如果其中一个请求被卡住 - 它不会释放会话 - 导致浏览器挂起,打开新选项卡或窗口只会将另一个不可填充的请求放入服务器的队列中。使用

session_write_close()

尽快发布会话是部分解决方法。

长时间运行的请求让用户感到无聊并打开更多窗口可能会产生相同的浏览器挂起效果。

我建议避免使用PHP会话。

答案 8 :(得分:0)

仅当sessions的数据太大或数据太大以至于使用cookies时会降低性能时才使用cookies

例如,如果您要保存较小的数据,那么session idcookie的大小,例如2个登录令牌或类似内容...那么我不明白为什么要使用sessions超过cookies

另请注意,默认情况下,PHP会话文件会保存到磁盘,而cookie只保存在客户端。

答案 9 :(得分:0)

会话存储在服务器端。如果访问者将某些内容存储在cookie中,浏览器将为每个请求发送用户信息,这往往会消耗大量服务器计算机时间并降低用户体验。一些浏览器也不支持cookie通过cookies为会话提供更多优势..强烈推荐会话。这个网站可能有帮助http://php.net/manual/en/features.cookies.php 感谢

答案 10 :(得分:0)

您的明确指南

N.B - Cookie 存储在用户浏览器中,会话存储在您的托管服务器计算机上。

何时使用

  1. 使用Cookie ,希望您的应用始终记住用户的数据,即使他们关闭了浏览器也是如此。例如,无论您何时键入www.Facebook.com,它都会将您带到您的帐户,即使您的浏览器已关闭并重新打开。

    当您关闭浏览器时,会话中保留的任何数据都会被清除。

  2. 当要存储的用户信息比正常情况大得多时,
  3. 使用Cookie 。 ...如果您拥有像Facebook这样的更大的用户群,可以考虑如何在托管计算机上存储所有用户会话。

  4. 当要存储的用户信息不大于正常情况时,
  5. 使用会话,并且您不希望公众有权访问您的用户变量......

答案 11 :(得分:0)

会话和cookie根本不同。 Cookies是客户端。会话是服务器端的。会话经常(但不是必须)使用Cookie将来自同一用户的一个请求与另一个请求相关联,以标识它们属于同一会话。

会话是人为的概念,HTTP没有这个概念。它由Web服务器创建,以帮助Web开发人员跨请求携带信息,例如用户帐户信息,购物车,表单数据等。Cookie由标准HTTP标头携带。

您在会话或Cookie中存储的信息完全由您决定。通常,您将东西放在要在用户关闭浏览器后在各个会话中保留的cookie中。也许记住身份验证令牌以实现“记住我”功能,或者记住过去的用户活动以个性化他/她的体验。将此信息保持较小且“具有参考意义”,即,它可能只是引用您在服务器端存储的更丰富信息的ID。请记住,客户端更容易受到恶意软件的攻击,因此请不要存储密码或敏感信息。

最后,还有本地存储,您没有提到。这也是客户端,但是可以说,它不太可能受到跨站点脚本黑客的攻击,因为与cookie数据不同,它不会自动在标头中发送。