【发布时间】:2011-01-06 19:39:12
【问题描述】:
我正在学习 cookie,我想知道在编写依赖 cookie 来存储状态的 Web 应用程序时浏览器是否支持。
对于每个域/网站,可以向浏览器发送多少个 cookie,大小是多少?
如果发送和存储多个 cookie,会影响性能吗?
【问题讨论】:
标签: cookies
我正在学习 cookie,我想知道在编写依赖 cookie 来存储状态的 Web 应用程序时浏览器是否支持。
对于每个域/网站,可以向浏览器发送多少个 cookie,大小是多少?
如果发送和存储多个 cookie,会影响性能吗?
【问题讨论】:
标签: cookies
每个域不超过 50 个 cookie,每个 cookie 最多 4 KB(甚至总共 4 KB,请参阅 Iain's answer)。在 IE 6 上,它曾经是每个域 20 个 cookie。
通常建议在服务器上保留状态,并仅将 cookie 用于会话跟踪。它们与每个请求一起发送,因此如果目的是保持会话状态,它们会形成不必要的开销。
如果您确实想在客户端上保持状态,并且可以使用 JavaScript 来做到这一点,那么可以选择。直接使用各种存储 API 或查找抽象出细节的包装库。
客户端存储选项:
不推荐使用的存储选项:
因此,通常对于客户端存储,它取决于用例:
【讨论】:
Cookie 大小限制
如果您想支持大多数浏览器,则不要超过 每个域 50 个 cookie,以及 每个域 4093 个字节。即所有 cookie 的大小不得超过 4093 字节。
性能思考
每次请求域时都会发送 Cookie,其中包括图像。为了论证起见,假设您的网站上有 30 个资源,并且有 4093 字节的 cookie。这意味着用户正在上传 122Kb 的数据。因此,如果我有 1Mbit 的上传连接,则至少需要 1 秒。
如果您想查看我创建的 cookie 测试页面,或了解更多信息,请查看Browser Cookie Limits。
【讨论】:
首先,我建议你不要担心这个问题。有足够的空间来序列化大量的标识符。
其次,它不是由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 会导致性能下降,最好将所有静态文件(图像、CSS 等)放入您网站的子域中,例如 @987654322 @。
这样,每当您在www.yourdomain.com 上的站点请求静态文件(如图像)时,浏览器就不会再将 cookie 与 HTTP 请求一起发送。
来源:http://developer.yahoo.com/performance/rules.html#cookie_free
【讨论】:
【讨论】:
如果您正在对网站进行编程,最好不要在 cookie 中存储太多内容,因为每次用户从您的网站请求页面时,cookie 都会发送到服务器。一个更好的解决方案是在 cookie 中存储一个唯一的 id,并让服务器根据该唯一的 id 从数据库或文件存储中提取所需的信息。不幸的是,该解决方案导致人们担心您正在跟踪他们的内容,因此您可能希望在您的网站某处表达“cookie 政策”,说明您为什么在他们的浏览器上放置 cookie 以及您做什么和不做什么不要跟踪他们。
【讨论】:
4096 字节 然而,真正的问题出现在您尝试设置大尺寸的 cookie 时。标准规定浏览器必须支持每个 cookie 至少 4096 字节。 IE6 不这样做。相反,对于来自域的所有 cookie,它的最大大小似乎为 4096 字节。
【讨论】:
CDN 前来救援。
您可以将静态内容卸载到 CDN 或 Amazon S3 等文件存储服务,只要您没有在接收 cookie 的子域上设置 CNAME 记录,保持静态文件请求无 cookie 应该很容易来自您的顶级域。
Blog Post 是一本很好的读物,内容是从无 Cookie 域提供静态内容以及我们如何采用这种最佳实践来提高我们在客户端的性能。
【讨论】:
这是一个关于 cookie 限制的非常好的网站,可让您测试浏览器:
【讨论】: