Cookie相关总结 | GCidea's blog
- 1. 前言
- 2. 直观感受
- 3. cookie相关介绍
- 4. cookie安全性问题
- 5. JavaScript对cookie的操作与使用
- 6. cookie与session的对比分析
- 7. cookie在实际开发中的使用
- 8. 总结

前言
本篇简单总结cookie的概念,作用,应用,实现案例等要点,关于大段的介绍,就不再重复了,网上有很多可以参考。而且cookie相关是一个很大的话题,这里只是简单小结,主要包括:
1.cookie相关介绍
2.cookie安全性问题
3.javascript对cookie的操作与使用
4.cookie与session的对比分析
5.cookie在实际开发中的使用
直观感受
cookie是一种存储在用户本地的数据。比如在windows系统中使用chrome浏览器访问网站,相应的数据将保存在如下目录:
C:\Users\gaochang\AppData\Local\Google\Chrome\User Data\Default
如图所示:

我们可以用一些第三方工具查看这个文件内容,比如chrome浏览器的一款插件cookies:

我们也可以在具体访问某个网站时,点击URL左边的“纸张/锁”图标,显示当前网站的cookie信息:

cookie相关介绍
定义
Cookie是由服务器端生成的,当用户访问服务器后,发送给User-Agent(一般指浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端在开发过程中自己定义,通过cookie服务器可以知道该用户是否是合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
标准
cookie的规格标准文档主要有以下4种:
1.由网景公司颁布的规格标准
网景通信公司设计开发了cookie,并制定了相关的规格标准。1994年前后,cookie正式应用在网景浏览器中。目前最为普及的cookie方式也是以此为准的。
2.RFC2109
原本是想和网景公司的标准交互应用,可惜发生了微妙的差异。该标准现在已经淡出视线。
3.RFC2965
为终结IE浏览器与Netscape Navigator的标准差异而导致的浏览器战争,该标准定义了新的HTTP首部Set-Cookie2和Cookie2。可事实上,并未投入大量使用。
4.RFC6265
将网景公司制定的标准作为业界事实标准,重新定义cookie标准后的产物。
目前使用最广泛的cookie标准并不是上述中的某一个,而是在网景公司制定的标准上进行扩展后的产物。
编码
Cookies的值中可以保存除了“;”以外的标点符号。但是不能保存汉字。否则会出现乱码。所以对于Cookies中的内容要进行统一的编码和解码。为了在浏览器端和服务器端都能够进行解码和编码,可统一使用UTF-8编码格式。
javacript提供了内置的编码和解码函数,用来将非英文的字符编码或者解码。编码函数为“escape”,使用语法如下codedString=escape(originalString);
其作用为,将参数字符串“originalString”中的特殊字符(绝大多数的非英文字母、非数字的字符)替换为”%”加上该字符Unicode编码的两位十六进制字符,或者“%u”加上该字符unicode编码的4位十六进制字符(视该字符的编码而定);
函数“un escape”与“escape”相反,用于将“escape”编码后的字符串还原为原始的字符串,其语法如下:originalString=unescape(codedString);
属性
cookie主要的属性有:
(1)name:Cookie名称,Cookie名称必须,一般用字母及数字,不能包含特殊字符,如有特殊字符需要转码。如js操作cookie的时候可以使用escape()对名称转码。
(2)value:Cookie值,Cookie值同理Cookie的名称,可以进行转码和加密。
(3)expire:过期日期,一个GMT格式的时间,当过了这个日期之后,浏览器就会将这个Cookie删除掉,当不设置这个的时候,Cookie在浏览器关闭(会话结束)后消失。
(4)path:一个路径,在这个路径下面的页面才可以访问该Cookie,一般设为“/”,以表示同一个站点的所有页面都可以访问这个Cookie。
(5)domain:子域,指定在该子域下才可以访问Cookie,例如要让Cookie在a.test.com下可以访问,但在b.test.com下不能访问,则可将domain设置成a.test.com。
(6)secure:安全性,指定Cookie是否只能通过https协议访问,一般的Cookie使用HTTP协议即可访问,如果设置了secure,则只有当使用https协议连接时cookie才可以被页面访问。
(7)httpOnly:如果在Cookie中设置了”HttpOnly”属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息。
分类
cookie主要可以分为以下两类:
Session cookies - these are temporary and are erased when you close your browser at the end of your surfing session. The next time you visit that particular site it will not recognise you and will treat you as a completely new visitor as there is nothing in your browser to let the site know that you have visited before.
会话cookie—这类cookie是短暂性的,是位于客户端所在系统的内存中的,当你的会话结束,关闭浏览器时,这类cookie将会被清空。当你下一次再访问该网站时,服务端并不能识别出你而是将你当做一个全新的用户,因为你的浏览器中没有任何可以让服务端判断你之前访问过的信息。(在设置了Discard参数(该参数是指当客户端程序运行结束时丢弃这个cookie。是RFC2965中新增字段,允许浏览器在退出时,不考虑过期时间,将cookie强制销毁),或者没有明确设置的expires或Max-Age的情况下,创建的是一个会话cookie。)主要作用:根据名字也容易看出,主要是为了配合服务端session机制对用户进行标识。
Persistent cookies - these remain on your hard drive until you erase them or they expire. How long a cookie remains on your browser depends on how long the visited website has programmed the cookie to last.
持久cookie—这类cookie将保存在客户端所在设备的硬盘上(具体位置见本文开头直观感受部分),除非你主动删除它们或者它们过期了。这类cookie能在你的浏览器中保持有效多长时间,取决于你所访问网站为之设定的有效期。主要作用:持久化cookie则主要是进行用户特征的追踪,比如记录用户最初访问时间,用户习惯等。
限制
大多数浏览器支持最大为4096字节的 Cookie。浏览器还限制站点可以在用户计算机上存储的Cookie的数量。大多数浏览器只允许每个站点存储20个Cookie;注意这里的20个是指主键值,也就是20条Cookies记录,但是每个Cookies记录还可以包含若干子键。如果试图存储更多Cookie,则最旧的Cookie便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的Cookie总数作出绝对限制,通常为300个。
传输
cookie信息在浏览器(客户端)和服务器端的传递是通过http报文头部来实现的。
HTTP请求报文的首部字段有“请求首部字段”,“通用首部字段”,“实体首部字段”3种;HTTP响应报文的首部字段有“响应首部字段”,“通用首部字段”,“实体首部字段”3种。具体到这里:为cookie服务的首部字段有: