`
悟小元
  • 浏览: 7662 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Inside HTTP —— Cookie

    博客分类:
  • http
阅读更多

注释:资料很多来自互联网。


一、浏览器允许每个域名所包含的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头的设置。

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics