谁动了你的cookie
呵呵,标题只是为了好玩。
最近好几个人问我,cookie到底是什么,能不能用通俗的语言解释一下。他们只知道cookie的字面意思是小甜饼,似乎与安全隐私有关。至于cookie的具体用途,全然不知。这个小甜饼与网络如何扯上关系,似乎风马牛不相及的事情。
实际上,有些命名规则,是说不清道不明的,一定置身于作者所在的文化背景下,才能体会作者的深意。比如,Java为什么叫Java,google为什么叫google,apache为什么叫apache,如此等等,如果当事人不给点提示,我们是无法知道这些名字来历的。
抛开小甜饼还是小咸饼不谈,我们先解释一下cookie的功能吧。这要从HTTP协议说起,HTTP是一种无状态协议,即按HTTP协议本身要求,前后两次请求是没有依赖关系的,比如你先浏览哪个网页,再浏览哪个网页,HTTP协议本身是不作限制的。这也正常,协议只提供机制,而不提供策略,完全是情合理的。
问题在于现实不同于理想,在实际应用中,一些请求是有依赖关系的,最常见的信箱、论坛和博客等,只有登录成功后,才能使用它的全部功能。登录了,你才能收发邮件,才能发贴子,才能写博客。服务器就需要知道你是否登录了,这个信息就是状态,即登录状态。
这个矛盾如何解决呢?如何在无状态的协议上实际有状态的服务呢?得有一种方法才行,这种方法就是cookie,说白了,cookie就是WEB服务器保存客户端(即浏览器)中的状态信息,在后面请求中,浏览器会把这些信息回传给WEB服务器,WEB服务器通过这些cookie检查是否登录过了。当然cookie不限于保存登录信息,它只是一种技术手段,服务器想用它保存什么都行,看需要而定。
Cookie为什么会涉及到安全问题呢?这是显而易见的,虽然一般cookie都是经过加密处理过的,正如保险箱里的钱未必是保险的一样,加密后的信息未必不能被泄露。对于设计得不好的服务器程序来说,cookie可以直接被非法利用。
既然把cookie放在客户端(即浏览器)会有安全隐患,为什么不把这些状态放在服务器上呢?其实,这也是迫不得已的,这种做法从技术实现上考虑,没有丝毫困难。但是在现实中行不通,你想想,一个网站可能被数以千万的用户使用,有的状态信息可能要保存数月之久,这要保存多少信息!这种做法开销太大。
服务器在请求客户端(即浏览器)保存信息时,在下传的HTTP响应头中包含Set-Cookie字段,在客户端(即浏览器)回传信息给服务器时,在HTTP请求头中包含Cookie字段。
Cookie的格式为:
key1=value1;key2=value2; expires=...; domain=...; path=...; secure
l key1=value1;key2=value2;代表服务器所要保存的有效数据。
l expires表示cookie的生命期,过期之后就无效了,比如有的网站要求你过一段时间后重新登录,就是通过它来实现的。
l Domain和path表示cookie的作用范围,即在哪些网网页上有效。
l Secure表示该cookie是不是只适用于HTTPS的请求。
下面是一个例子:
telnet www.google.com 80
HEAD /intl/zh-CN/ HTTP/1.1
Host: www.google.com
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html
Set-Cookie:PREF=ID=2595b468a53b7221:NW=1:TM=1145015023:LM=1145015023:S=iASetSIzh8_sHPue; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Server: GWS/2.1
Content-Length: 0
Date: Fri, 14 Apr 2006 11:43:43 GMT