Cookie深度揭秘
Cookie概述
HTTP是一种无状态的请求/响应协议,用户通过浏览器访问Web站点后,Web服务端没有可用信息来判断是哪个用户发起的请求,更加无法知道下次访问的还是不是上次访问的用户,无法识别当前用户。最初,为了解决这个问题出现了很多解决方案,例如客户端IP地址跟踪、用户登录认证、URL中嵌入识别信息等,但都没有很好的解决根本问题。然而,Cookie的设计实现很好的解决了这个问题。用户通过浏览器访问Web站点后,服务端会将一些Key/Value组合的键值对通过Set-Cookie或Set-Cookie2返回给浏览器,用户再次访问Web站点时浏览器会将符合条件的键值对再发送给服务端,这样服务端就可以通过这个键值信息识别出当前用户。
Cookie分类
Cookie可以分为两类:会话Cookie和持久Cookie。会话Cookie是一种临时Cookie,没有设置它的有效期,当用户退出浏览器的时候,它将会被删除。当设置了Cookie的有效期后,它就是持久Cookie,它可以被存储到硬盘上,当用户退出浏览器或机器重启时,它依然存在,可以被再次读取使用。
Cookie版本
当前可使用的Cookie规范有两个版本:Cookie版本0和Cookie版本1。Cookie版本1是对Cookie版本0的扩展,版本1可以和版本0互操作,但是Cookie版本1没有Cookie版本0使用的广泛。
Cookie版本0属性
版本0定义了Set-Cookie响应首部、Cookie请求首部。
Set-Cookie响应首部,其实就是服务端返回的Cookie信息,具体的语法如下:
Set-Cookie:key=value;expires=date;domain=domain;path=path;secure
Key/value表示在服务端可跟踪、可识别的用户信息;expires表示Cookie的结束日期,如果没指定,Cookie会在用户退出浏览器时过期;domain告诉浏览器这个Cookie可以被发送到哪个域名,如果没指定,默认为产生Cookie的服务器主机名,浏览器会存储很多不同网站的Cookie,浏览器会根据domain的值将Cookie发送到对应的域名下;path指定Cookie对哪些请求路径生效,如果没指定,默认为产生Cookie的URL路径;secure表示在使用SSL安全连接时才发送Cookie,若没设置secure,则没限制。例如:
Set-Cookie:member_id=1496800101;expires=Tuesday 16-Aug-01 22:10:11 GMT;domain=“abc.com";path=/member;secure
Cookie请求首部,就是浏览器请求服务端时发送的Cookie信息,具体语法如下:
Cookie:key1=value1;key2=value2;key3=value3...
例如:
Cookie:member_id=1496800101
Cookie版本1属性
版本1定义了Set-Cookie2响应首部、Cookie2请求首部。这个版本做了如下一些改动:
1.为每个Cookie添加了解释性文本,用于解释其目的;
2.用户退出浏览器时,允许不考虑过期时间,将Cookie销毁;
3.使用相对秒数来设置Cookie的生存时间;
4.对Cookie的生效限制,添加了端口条件,可以通过domain、path和port来共同限制;
5.在发送Cookie请求首部时,会将domain、path和port一起发送到服务端;
6.为了实现版本的互操作,使用版本号;
7.使用$前缀来附加服务端返回的Cookie信息。
Set-Cookie2响应首部具体语法如下:
Set-Cookie2:key=value;Version=“1”;Comment=Comment;CommentURL=CommentURL;Discard;Max-Age=age;domain=domain;path=path;Port=Port;secure
Version对应Cookie规范的版本;Comment说明服务器如何去使用这个Cookie;CommentURL表示一个URL,指向描述该Cookie的文档;Discard表示如果设置此标识,会在浏览器退出时放弃此Cookie;Max-Age使用相对当前时间的秒数来设置Cookie的生命周期;Port表示对Cookie生效的端口,多个端口可用逗号分隔。
Cookie2请求首部会回传每个Cookie的附加信息,也就是Set-Cookie2中的属性信息,例如:
Cookie:$Version=“1”;member_id=14690801;$Domain=“abc.com”;$path=/member
Cookie缺点
虽然Cookie可以很好的解决识别用户的问题,但是,它也有很多的缺点:
1.不安全,容易被破坏或盗取;
2.Cookie存储在浏览器中,浏览器对Cookie的数量和大小有限制;
3.Cookie中数据量很大时对性能和带宽有所损耗;