我正在学习cookie,在编写依赖cookie存储状态的Web应用程序时,我不知道浏览器支持。
对于每个域/网站,可以向浏览器发送多少个cookie,大小是多少?
如果发送并存储了多个cookie,是否会影响性能?
答案 0 :(得分:49)
每个域不超过50个cookie,每个cookie最多4 KB(甚至总共4 KB,请参阅Iain's answer)。在IE 6上,它曾经是每个域20个cookie。
通常建议在服务器上保留状态,并仅将cookie用于会话跟踪。它们与每个请求一起发送,因此如果目的是保持会话状态,它们会形成不必要的开销。
如果您确实希望在客户端上保持状态,并且可以使用JavaScript来执行此操作,则可以选择。直接使用各种存储API,或找到一个抽象细节的包装库。
客户端存储选项:
弃用的存储选项:
因此,通常对于客户端存储,它取决于用例:
答案 1 :(得分:24)
Cookie大小限制
如果您想支持大多数浏览器,请不要超过每个域 50个Cookie ,每个域 4093个字节。也就是说,所有cookie的大小不应超过4093字节。
表现思考
每次域名请求都会发送Cookie,其中包括图片。为了论证,假设您的网站上有30个资源,并且有4093个字节的cookie。这意味着用户正在上传122Kb的数据。因此,如果我有1Mbit上传连接,则需要至少1秒钟。
如果您想查看我创建的Cookie测试页,或想了解更多相关信息,请查看Browser Cookie Limits。
答案 2 :(得分:14)
首先,我建议你不要担心这个问题。有AMPLE空间来序列化大量的标识符。
其次,它不是由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服务器只需要一小部分时间 - 当然放在上下文中。您应该记住,Web是基于文本的协议构建的。
答案 3 :(得分:5)
如果您担心由于在每个服务器请求上发送大型Cookie而导致性能下降,最好将所有静态文件(图像,CSS等)放入网站的子域中,例如{{ 1}}。
通过这种方式,只要您的网站http://static.yourdomain.com
要求提供静态文件(如图片),浏览器就不会再发送Cookie和HTTP请求了。
来源:http://developer.yahoo.com/performance/rules.html#cookie_free
答案 4 :(得分:4)
不同的browswers在饼干上有不同的大小限制。以下是IE的信息。 Here是一个列出多个浏览器的页面。
Cookie不是基于服务器保存的,而是基于域保存(服务器可能托管许多域,或者服务器场可能正在为单个域提供服务)。
一般情况下,我会避免在cookie中保存大量信息,因为数据会在每次请求时发送到浏览器或从浏览器发送。正如您在问题中所建议的那样,这会对性能产生影响。
通常会在cookie中存储少量数据,主要用于识别用户/会话,以便从数据库或Web服务器本地的其他资源中获取更多数据。
答案 5 :(得分:3)
如果您正在编写网站,最好不要在cookie中存储太多内容,因为每次用户从您的网站请求页面时,该cookie都会发送到服务器。一个更好的解决方案是在cookie中存储唯一的ID,并让服务器根据该唯一ID从数据库或文件存储中提取所需的信息。不幸的是,该解决方案会让人担心您正在跟踪他们的内容,因此您可能希望在您的网站上某处显示“Cookie政策”,说明您为何在浏览器上放置Cookie以及您做了什么跟踪他们。
答案 6 :(得分:3)
4096字节 但是,当您尝试设置大尺寸的Cookie时,真正的问题就出现了。标准规定浏览器必须支持每个cookie至少4096个字节。 IE6不会这样做。相反,对于来自域的所有cookie,它的最大大小似乎为4096字节。
答案 7 :(得分:0)
这是一个关于Cookie限制的非常好的网站,可让您测试浏览器:
答案 8 :(得分:0)
CDN来救援。
您可以将静态内容卸载到CDN或Amazon S3等文件存储服务,只要您没有在接收Cookie的子域上设置CNAME记录,就可以轻松保持静态文件请求无Cookie来自您的顶级域名。
这个Blog Post非常适合从无Cookie域提供静态内容,我们如何采用这种最佳实践来提升我们在客户端的性能。