45

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

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

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

4

9 回答 9

51

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

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

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

客户端存储选项:

  • 本地存储: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 本身已弃用。
  • 用户数据:Internet Explorer 5.5+ 受限区域中每个域 64 KB,互联网区域中每个域 128 KB。替换为本地存储。
  • Web SQL:仅限 Chrome 和 Safari,它永远不会适用于其他浏览器,因为无法对其进行标准化

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

  • 对于会话 id 跟踪或几 KB,请使用 cookie。
  • 高达 2 MB 的 localstorage 可提供跨所有常见浏览器的解决方案。
  • 2 MB 及以上,使用 IndexedDB(寻找一个好的包装库)。
于 2010-01-19T20:24:44.200 回答
24

Cookie 大小限制

如果要支持大多数浏览器,则每个域不要超过50 个 cookie,每个域不超过4093 字节。也就是说,所有 cookie 的大小不应超过 4093 字节。

性能思考

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

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

于 2011-08-05T23:21:09.037 回答
16

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

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

第三,如果你不得不担心知道有两个可能的 cookie 标头。这些 cookie 标头的大小由浏览器软件限制决定。

设计讨论

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

表现

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

于 2010-01-18T15:37:56.737 回答
6

如果您担心在每个服务器请求上发送大型 cookie 会导致性能下降,一个好主意可能是将所有静态文件(图像、CSS 等)放入站点的子域中,例如http://static.yourdomain.com.

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

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

于 2011-03-26T13:57:25.687 回答
4

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

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

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

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

于 2010-01-18T15:42:20.083 回答
3

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

于 2010-01-18T15:43:48.897 回答
3

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

于 2014-06-18T09:40:34.220 回答
0

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

http://browsercookielimits.iain.guru/

于 2015-02-26T21:55:26.000 回答
0

CDN 前来救援。

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

This Blog Post is a good read for on Serving Static Content from a Cookieless Domain and how can we adopt this best practice to boost our performance in the client side.

于 2017-05-16T04:48:45.417 回答