【问题标题】:What is the maximum size of a cookie, and how many can be stored in a browser for each web site?cookie 的最大大小是多少,每个网站的浏览器中可以存储多少个?
【发布时间】:2011-01-06 19:39:12
【问题描述】:

我正在学习 cookie,我想知道在编写依赖 cookie 来存储状态的 Web 应用程序时浏览器是否支持。

  • 对于每个域/网站,可以向浏览器发送多少个 cookie,大小是多少?

  • 如果发送和存储多个 cookie,会影响性能吗?

【问题讨论】:

    标签: cookies


    【解决方案1】:

    每个域不超过 50 个 cookie,每个 cookie 最多 4 KB(甚至总共 4 KB,请参阅 Iain's answer)。在 IE 6 上,它曾经是每个域 20 个 cookie。

    通常建议在服务器上保留状态,并仅将 cookie 用于会话跟踪。它们与每个请求一起发送,因此如果目的是保持会话状态,它们会形成不必要的开销。

    如果您确实想在客户端上保持状态,并且可以使用 JavaScript 来做到这一点,那么可以选择。直接使用各种存储 API 或查找抽象出细节的包装库。

    客户端存储选项:

    • localStorage:Firefox 2+、Chrome 4+、Safari 4+、Internet Explorer 8+。每个域 5 MB 无需用户确认(但请注意,它以 UTF-16 存储,因此您可以使用每个字符两个字节)。
    • IndexedDB:Firefox 4+、Chrome 11+、Safari 10+、Internet Explorer 10+。每个域 5 MB 无需用户确认,确认后更多(高度特定于浏览器,请检查您的浏览器了解详细信息)。

    不推荐使用的存储选项:

    • Flash 8 持久存储:任何具有 Flash 8+ 的浏览器。 100 KB,更多需要用户许可。已弃用,因为 Flash 本身已弃用。
    • userData:Internet Explorer 5.5+。受限区域中每个域 64 KB,互联网区域中每个域 128 KB。已替换为 localStorage。
    • Web SQL:仅限 Chrome 和 Safari,它永远不会进入其他浏览器,因为它是 not possible to standardize it

    因此,通常对于客户端存储,它取决于用例:

    • 对于会话 ID 跟踪或少量 KB,请使用 cookie。
    • 高达 2 MB 的 localstorage 可提供适用于所有常见浏览器的解决方案。
    • 2 MB 及以上,使用 IndexedDB(寻找一个好的包装库)。

    【讨论】:

    • RFC 2109 指定最少 20 个 cookie 公关域。每个 4kB。但我读过 IE6 的 20 个文件只有 4kB。所以总共只有 4kB!
    • @gregers:不知道(关心)IE6。但在 IE7/8 上,每个 cookie 肯定是 4KB,而不是所有 cookie 都是 4KB。
    • @Marco Demaio:很高兴得到纠正,但是我的测试脚本报告 IE7 4KB 限制,IE8 10KB 限制所有 cookie。见myownplayground.atspace.com/cookietest.html
    • @Iain:+1 你似乎完全正确。我在 IE8 上只测试了几个 4KB 的 cookie,发现它们在工作,所以我想我可以写更多。您应该在此处添加答案以及您的结果以及指向您的出色测试页面的链接。
    • @Marco Demaio:这是一种解脱 :) 我想我可能错了。我已经发布了答案
    【解决方案2】:

    Cookie 大小限制

    如果您想支持大多数浏览器,则不要超过 每个域 50 个 cookie,以及 每个域 4093 个字节。即所有 cookie 的大小不得超过 4093 字节。

    性能思考

    每次请求域时都会发送 Cookie,其中包括图像。为了论证起见,假设您的网站上有 30 个资源,并且有 4093 字节的 cookie。这意味着用户正在上传 122Kb 的数据。因此,如果我有 1Mbit 的上传连接,则至少需要 1 秒。

    如果您想查看我创建的 cookie 测试页面,或了解更多信息,请查看Browser Cookie Limits

    【讨论】:

    • 这是一个很棒的发现。 cookie 大小限制不仅仅是 IE 的问题。
    【解决方案3】:

    首先,我建议你不要担心这个问题。有足够的空间来序列化大量的标识符。

    其次,它不是由web-server 存储的,而是由web-domain 存储的——例如,www.google.com,而不是为 Google 域提供服务的 100 台不同的物理服务器。

    第三,如果您确实需要担心,请知道有 两种可能的 cookie 标头。这些 cookie 标头的大小由浏览器软件限制决定。

    设计讨论

    您不希望将 cookie 标头用于发送有关客户端会话的详细信息。例如,如果您正在构建电子邮件前端,请不要尝试将客户正在输入的电子邮件填充到 cookie 中。相反,您将向客户端发送一个代表他的身份+会话的 cookie:您针对此身份存储所有会话数据。每个 cookie 标头可以存储数十个标识符(4-16 个字节),没有人需要超过其中的 4 个。 cookie 数据(作为整数)倾向于编码为 base64,这会增加字节数。

    性能

    您的浏览器会向网络服务器发送大量标头。 cookie 只是另外 100-1000 字节(大部分接近 100)。在这两个极端情况下,将这些发送到 Web 服务器只需要一小部分时间——当然,当它们被放入上下文中时。您应该记住,网络是建立在基于文本的协议之上的。

    【讨论】:

    • cookie 标头不仅用于请求 html,还用于从同一域加载的所有资源。所以如果cookies中存储了大量数据,会对性能产生相当大的影响。 yuiblog.com/blog/2007/03/01/performance-research-part-3
    • 嗯,是的,我显然不建议将莎士比亚的综合作品存储在 cookie 中。人们在阅读有关堆栈溢出的非正式答案时能够运用常识。
    • 另外这种分析在一般情况下完全没用。我在研究中编写了基于 GUID 的高性能自定义 cookie 生成代码,它不会增加额外的延迟。因此,您确实需要学习如何解释基于研究的结果并学习如何将它们置于上下文中,而不是硬塞不适用于此答案的结果。引用萨阿迪的话:“对于一个无知的人来说,没有什么比沉默更好的了;如果他意识到这一点,他就不会无知了。”
    • 如果我继续删除cookie并再次删除它可以吗...我的应用程序是这样的,我必须这样做很多次..?
    【解决方案4】:

    如果您担心在每个服务器请求上发送大型 cookie 会导致性能下降,最好将所有静态文件(图像、CSS 等)放入您网站的子域中,例如 @987654322 @。

    这样,每当您在www.yourdomain.com 上的站点请求静态文件(如图像)时,浏览器就不会再将 cookie 与 HTTP 请求一起发送。

    来源:http://developer.yahoo.com/performance/rules.html#cookie_free

    【讨论】:

      【解决方案5】:

      不同的浏览器对 cookie 有不同的大小限制。这是IE 的信息。 Here 是一个列出多个浏览器的页面。

      Cookie 不是以服务器为基础保存,而是以为基础(一个服务器可能托管许多域,或者相反,一个服务器群可能服务于单个域)。

      一般来说,我会避免在 cookie 中保存大量信息,因为每次请求都会向浏览器发送数据并从浏览器发送数据。正如您在问题中所建议的那样,这可能会对性能产生影响。

      通常在 cookie 中存储少量数据,主要用于识别用户/会话,以便可以从数据库或网络服务器本地的其他资源中获取更多数据。

      【讨论】:

      【解决方案6】:

      如果您正在对网站进行编程,最好不要在 cookie 中存储太多内容,因为每次用户从您的网站请求页面时,cookie 都会发送到服务器。一个更好的解决方案是在 cookie 中存储一个唯一的 id,并让服务器根据该唯一的 id 从数据库或文件存储中提取所需的信息。不幸的是,该解决方案导致人们担心您正在跟踪他们的内容,因此您可能希望在您的网站某处表达“cookie 政策”,说明您为什么在他们的浏览器上放置 cookie 以及您做什么和不做什么不要跟踪他们。

      【讨论】:

        【解决方案7】:

        4096 字节 然而,真正的问题出现在您尝试设置大尺寸的 cookie 时。标准规定浏览器必须支持每个 cookie 至少 4096 字节。 IE6 不这样做。相反,对于来自域的所有 cookie,它的最大大小似乎为 4096 字节。

        【讨论】:

          【解决方案8】:

          CDN 前来救援。

          您可以将静态内容卸载到 CDN 或 Amazon S3 等文件存储服务,只要您没有在接收 cookie 的子域上设置 CNAME 记录,保持静态文件请求无 cookie 应该很容易来自您的顶级域。

          Blog Post 是一本很好的读物,内容是从无 Cookie 域提供静态内容以及我们如何采用这种最佳实践来提高我们在客户端的性能。

          【讨论】:

            【解决方案9】:

            这是一个关于 cookie 限制的非常好的网站,可让您测试浏览器:

            http://browsercookielimits.iain.guru/

            【讨论】:

              猜你喜欢
              • 2010-10-13
              • 2014-06-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-05-12
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多