【问题标题】:When should I use session variables instead of cookies?什么时候应该使用会话变量而不是 cookie?
【发布时间】:2011-01-15 11:34:03
【问题描述】:

会话变量和 cookie 对我来说似乎很相似。我了解技术上的差异,但您如何决定何时使用一种与另一种?

【问题讨论】:

    标签: http cookies session-variables


    【解决方案1】:
    • 会话存储在服务器上,这意味着客户端无法访问您存储的有关它们的信息。存储在您的服务器上的会话数据不需要与每个页面一起完整传输;客户端只需要发送一个ID,数据就会从服务器加载。

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

    • 避免在 cookie 中存储数据

      • 最终用户可以看到、读取和操作它,或者被恶意拦截。您不能信任 cookie 中的任何数据,“session_id”除外。
      • 它会增加您的带宽,如果您为每个用户的每个页面请求添加 1k 的数据,那么您的带宽可能会增加 10-15%。从 $$ 的角度来看,这可能并不昂贵,但从性能的角度来看可能是这样。它会有效地将每台服务器上的带宽减少 10-15%,也就是说,它可能会导致您需要更多服务器。
    • 您可以在会话数据中存储的内容取决于您拥有的数据量和用户数量。 no_of_users * size_of_session_data 必须小于服务器上的可用内存。

    【讨论】:

    • 另外需要注意的是,重启web服务器会丢失会话数据
    • @Ben,并非总是如此,PHP 使用文件来持久化会话,因此可以抵抗重启(就像数据库存储一样)。通常,只有当会话数据持久存在内存中或者您正在使用应用程序服务器 Glassfish 等时,您才会丢失会话数据。
    • @Ben:从技术上讲,您也可以拥有持久会话。例如,您可以将会话存储在数据库或文件系统中。事实上,一些应用程序需要持久会话来保持对谁有权访问应用程序资源的审计跟踪。
    • 公平地说,“会话”的大多数实现都需要 cookie 支持,以便服务器可以将客户端与会话相关联。有一些无 cookie 的实现会向查询字符串添加额外的数据,但通常它们是例外。
    • 您可以控制应该存储会话数据的时间。甚至可以为每个用户自定义此持续时间。 php.net/manual/en/function.session-set-save-handler.php
    【解决方案2】:
    • 始终使用会话
    • 仅当您需要更长的登录会话时才使用 cookie - 然后添加带有加密用户 ID 的 cookie。

    【讨论】:

    • 如果您说“始终使用会话”,服务器性能难道不是一个可能的问题吗?
    【解决方案3】:

    大多数时候,会话状态是使用 cookie 保持的。所以这不是一个或另一个的问题,而是如何一起使用它们。

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

    【讨论】:

    • “正确的解决方案取决于您要完成的任务。”我相信这正是这个问题想要解决的问题......
    【解决方案4】:

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

    【讨论】:

    【解决方案5】:

    Cookie 是客户端,会话是服务器端。

    将 cookie 用于您可以信任用户的小块数据(如字体设置、网站主题等),以及用于服务器端数据的不透明 ID(如会话 ID)。预计这些数据可能随时丢失并且无法信任(即需要清理)。

    将会话数据用于更大的数据块(因为许多系统可以存储对象、数据结构等)以及您必须信任的数据块 - 例如授权状态等。通常,使用会话数据来存储更大的状态数据。

    您也可以在 cookie 中存储诸如授权状态之类的内容,如果 GUI、缓存等需要它的话 - 但永远不要相信它,也永远不要依赖它的存在。 Cookie 易于删除且易于伪造。会话数据更难伪造,因为您的应用程序控制它。

    【讨论】:

      【解决方案6】:

      PHP 会话的一个缺点是会话处理的工作方式。具体来说,一次只有一个进程/请求可以打开一个会话以供写入。当

      session_start() 
      

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

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

      session_write_close()
      

      尽快释放会话是部分解决方法。

      用户厌烦并打开更多窗口的长时间运行请求可能具有相同的浏览器挂起效果。

      我建议避免使用 PHP 会话。

      【讨论】:

        【解决方案7】:

        Cookie 会在每次请求时发送到服务器,因此如果您计划存储大量数据,请将其存储在会话中。

        否则,如果您要存储少量数据,则使用 cookie 就可以了。

        任何敏感数据都应存储在会话中,因为 cookie 并非 100% 安全。 cookie 的一个优点是您可以节省服务器上通常用于存储会话数据的内存。

        【讨论】:

          【解决方案8】:

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

          【讨论】:

          • 但是当你使用会话时,服务器无论如何都会在每个请求中发送一个会话cookie。我认为您想说的是,应该在 cookie 中保留最少的数据,因为所有 cookie 数据都需要在每个 HTTP 请求和响应时通过网络发送。
          • Cookie 不会“减慢网站速度”。几个非结构化字节无关紧要。
          【解决方案9】:

          仅当数据对于 cookie 而言太大或数据太大以至于使用 cookie 会降低性能时才使用会话。

          例如,如果您在 cookie 中保存的数据比会话 ID 的大小要小,例如两个登录令牌或类似的东西……那么我不明白您为什么要使用会话而不是 cookie。

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

          【讨论】:

            【解决方案10】:

            会话存储在服务器端。如果访问者在 cookie 中存储了某些内容,浏览器将针对每个请求发送用户信息。

            这往往会消耗大量服务器计算机时间并降低用户体验。一些浏览器也不支持 cookie,这让会话比 cookie 更有优势……我强烈推荐会话。

            这可能会有所帮助:Cookies (php.net)

            【讨论】:

              【解决方案11】:

              您的明确指南

              注意- cookie 存储在用户的浏览器中,session 存储在您的托管服务器计算机上。

              何时使用

              1. 使用 cookie 如果您希望您的应用程序始终记住用户的数据,即使他们已经关闭了浏览器。例如,每当您键入 www.facebook.com 时,它都会将您带到您的帐户,即使您的浏览器已关闭并重新打开。

                因为一旦您关闭浏览器,会话中保存的所有数据都会被清除。

              2. 使用 cookie 当要存储的用户信息远大于正常时。 ... 对于会话,如果您拥有更大的用户群,例如 Facebook,请考虑将所有用户会话存储在主机上的样子。

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

              【讨论】:

                【解决方案12】:

                会话和 cookie 完全不同。 Cookies 是客户端。会话是服务器端的。会话通常(但不一定)使用 cookie 将一个请求与来自同一用户的另一个请求相关联,以识别它们属于同一会话。

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

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

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-06-15
                  • 2011-06-22
                  • 2015-12-11
                  • 2012-02-12
                  • 2012-06-27
                  • 2010-11-29
                  • 2015-12-23
                  相关资源
                  最近更新 更多