注释:资料很多来自互联网。
一、浏览器允许每个域名所包含的cookie数:
Microsoft指出InternetExplorer8增加cookie限制为每个域名50个,但IE7似乎也允许每个域名50个cookie。
Firefox每个域名cookie限制为50个。
Opera每个域名cookie限制为30个。
Safari/WebKit貌似没有cookie限制。但是如果cookie很多,则会使header大小超过服务器的处理的限制,会导致错误发生。
注:“每个域名cookie限制为20个”将不再正确!
二、当很多的cookie被设置,浏览器如何去响应。
除Safari(可以设置全部cookie,不管数量多少),有两个方法:
最少最近使用(leastrecentlyused(LRU))的方法:当Cookie已达到限额,自动踢除最老的Cookie,以使给最新的Cookie一些空间。Internet Explorer和Opera使用此方法。
Firefox很独特:虽然最后的设置的Cookie始终保留,但似乎随机决定哪些cookie被保留。似乎没有任何计划(建议:在Firefox中不要超过Cookie限制)。
三、不同浏览器间cookie总大小也不同:
Firefox和Safari允许cookie多达4097个字节,包括名(name)、值(value)和等号。
Opera允许cookie多达4096个字节,包括:名(name)、值(value)和等号。
Internet Explorer允许cookie多达4095个字节,包括:名(name)、值(value)和等号。
注:多字节字符计算为两个字节。在所有浏览器中,任何cookie大小超过限制都被忽略,且永远不会被设置。
补充:
a. Cookie设置:
http方式:以访问http://www.webryan.net/index.php为例
Step1.客户端发起http请求到Server
GET /index.php HTTP/1.1
Host: www.webryan.net
(这里是省去了User-Agent,Accept等字段)
Step2. 服务器返回http response,其中可以包含Cookie设置
HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value
Set-Cookie: name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT
(content of page)
Step3. 后续访问webryan.net的相关页面
GET /spec.html HTTP/1.1
Host: www.webryan.net
Cookie: name=value; name2=value2
Accept: */*
需要修改cookie的值的话,只需要Set-Cookie: name=newvalue即可,浏览器会用新的值将旧的替换掉。
b. Cookie属性
除了name=value对以外,我们还可以设置Cookie其他属性以支持更丰富的Cookie需求,这些属性通常是浏览器用来判断如何对待cookie,何时删除、屏蔽或者如何发送name-value对给Server。也就是说无论我们设置了某个cookie的多少属性,这些Cookie属性是不会被浏览器发送回给Server的。
a) Domain and Path
作用:定义Cookie的生效作用域,只有当域名和路径同时满足的时候,浏览器才会将Cookie发送给Server。如果没有设置Domain和Path的话,他们会被默认为当前请求页面对应值。 举例如下:
提问下:第一个和第三个Cookie有啥不一样??
结论:浏览器优先匹配domain,而对于Path字段则是以匹配的方式进行判断。
对于
1.http://docs.foo.com/accounts/index.html
2.http://docs.foo.com/accountstest.html
1.会带上Cookie1,2,3; 2会带上1,2
b) Expires and Max-Age
作用:设置浏览器何时删除Cookie
Expires的规定格式是:“Wdy, DD-Mon-YYYY HH:MM:SS GMT”。
相对于Expires的精准的时间设置,在RFC 2965中规范提供了一个替代方案:Max-Age:seconds,来设置cookie在设置后多长秒后失效。
Set-Cookie: lu=Rg3vHJZnehYLjVg7qi3bZjzg; expires=Tue, 15-Jan-2013 21:47:38 GMT; path=/; domain=.foo.com; httponly
Set-Cookie: made_write_conn=1295214458; path=/; domain=.foo.com
Set-Cookie: reg_fb_gate=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.foo.com; httponly
第一个Cookie: 过期时间是2013年1月15日的精确时间;
第二个:没有设置过期时间,为Session cookie.
第三个:删除Cookie
C) Secure and HttpOnly
作用:设置Cookie的安全属性
特质:Secure和HttpOnly都是没有value字段的。
Secure字段告诉浏览器在https通道时,对Cookie进行安全加密,这样即时有黑客监听也无法获取cookie内容。
HttpOnly字段告诉浏览器,只有在HTTP协议下使用,对浏览器的脚本不可见,所以跨站脚本攻击时也不会被窃取。
Google和Facebook都在使用HttpOnly的Cookie。
其他:
JavaScript对Cookie的操控:
一般通过document.cookie对象来操控cookie
JSP对Cookie的操控:
<%
String cookieName="Sender";
Cookie cookie=new Cookie(cookieName, "Test_Content");
cookie.setMaxAge(10);
response.addCookie(cookie);
%>
这个原理上是对HTTP头的设置。