〖转〗我对Cookie的理解----新手必看

[复制链接]
查看: 523   回复: 0
发表于 2005-4-21 16:01:40 | 显示全部楼层 |阅读模式
我对Cookie的理解——感知篇 0 E! H7 R, @, ~

) m+ r+ V- m: H& k  j2 Z2 z  中午见到有人建议我写一写cookie相关的文章。其实惭愧得很,我自己对cookie也是一知半解。不过把我的一点理解写出来,与朋友们进行交流,请朋友们多多指正,还是有一定用处的。 6 [) N# I8 z5 h; x5 H
  首先谈谈cookie是个啥东西。网上有很多关于cookie的介绍,一句话,cookie就是保留在客户端浏览器中,起在服务器和客户浏览器之间进行某些标识作用的东西。其实,这句话说了等于白说,不懂的人仍然不懂。那么让我来打个比方吧。假如你是某个仓库的管理员,每天都有好多人来你的仓库里领东西。不同的人有不同的领东西的权限,不同的人领的东西的数量和种类可能也不同。怎么办呢?对每一个人都去检查你的记录本,可能你会觉得需要花费太多的时间和精力。那么,采取这个办法吧,在来领东西的人的脸上写字做记号(哈哈,你别笑我这个憋足的比喻),当某个人脸上没有记号时,你查一下记录本,然后在他的脸上写上他叫什么,他可以领那些东西,他领了那些东西等等。下次他再来时,你看看他的脸,就对需要知道的情报一目了然了。 - s0 e% I/ K; c8 N0 j
  对照上面那个例子,我们可以把服务器理解成你(就是那个仓库保管员),把客户端服务器理解成来仓库领东西的人。那么cookie,自然就是写在前来领东西的人脸上的字了。现在理解了吗?反正我是这么理解的,有什么错误之处,朋友们赶快给我指出,免得我一错再错啦! ' B6 |$ `$ e  E6 c1 y1 ~
  说到这里,你可能会说,这个在人家脸上写字来做记号的办法也太愚蠢啦,要是人家自己在他脸上写字或者涂改怎么办呢?对啦,问题就在这里,要是没有这个问题,我们也用不着在这里讨论cookie了。因为cookie是保留在用户端的(也就是说记号是保留在人家脸上的),所以用户在理论上应该可以有对cookie完全的操作权。我所提供的浏览器右键Cookie芭比娃娃就实现了一定程度上的Cookie操作。所以,使用cookie来实现服务器和浏览器之间的某些标识,特别是用户权限标识,在很多时候是很不安全的。 8 y' h6 R  ?) E1 H- ^
  可是,虽然cookie很不安全,但是仍然有很多服务器采用这个办法来标识用户身份,比如最近经常讨论的所谓SD。现在论坛上提供的好多SD Cookie,就好比人家告诉你脸上写什么字,可以有什么权限,你用上这些cookie,你在SD的服务器上就有了这些cookie所对应的权限啦。 9 A7 ^" }- _, G$ l( ^* d

/ e# S3 `+ B$ W% i- F0 Z/ f1 t9 dCookie之生生死死 & T" F! @2 H( D0 n9 x$ |* K

$ \0 A* x7 Y1 q) B9 R+ K! {4 G& }* C7 c9 b4 _- ]. t7 e2 T
  上一篇文章大概地说了一下cookie是个什么东西。现在具体一点,讲讲cookie是如何产生、传播和消亡的。
% [+ O0 p7 j' G- G( p3 c  对网络技术有一定了解的朋友可能知道,你在浏览器的地址栏敲入地址然后回车(或者点击某个链接)后发生的事情大概是这样的: ! I2 t5 }9 b2 m' A
1、你的计算机向服务器发出连接请求;
0 L% l# Y: O" C% b2 P1 }2、连接上了后,你的计算机向服务器发出一系列的命令,包括告诉服务器你是谁,你可以接受什么东西,你想要得到什么东西等等;
: D1 @+ J# a6 U- F3 N8 W3、服务器收到你的命令,会产生一系列的反应,包括告诉你你的命令执行的怎么样了,需要在你的脸上写些什么字(这就是cookie了),你要的东西是不是给你发过来了等等。
: U) }. C7 U; W& v6 r% q- p6 d9 g  我们可以用minibrowser或sniffer软件看看这个过程的具体情况。如图所示。
; `% v3 k$ m* ^( i' o7 B4 \7 n/ g  褐色的"cmd> ..." 所在行的内容是客户端浏览器给服务器发的信息(cmd>是软件minibrowser加上的),我们可以看到,其中有" Cookie: EUID=..."的内容。这就是告诉服务器“我的脸上写字了,你看,写的是什么什么...”。
* d. y; a6 z. T" E( M( m% m8 \  绿色的"hdr> ..."所在行的内容是服务器给你的回复中的前面一部分信息(姑且称之为信息头,或者头部信息),我们可以看到,其中有"Set-Cookie:MIAMISESSION=..."之类的内容。这就是告诉客户端浏览器,“我要在你的脸上写字啦”。
8 Y9 E+ b& c9 `6 D5 t* E  至于红色的"cookie> ..."所在行的内容,是minibrowser分析出的cookie内容,并存在于客户端浏览器和服务器的交流信息当中。 1 `8 e' G& C: L, q( q7 W
5 S* ^! ^" f! m  w
  至此,我们应该可以做个总结啦:
) d; G  l; P) r& b0 X1、Cookie保留在客户端计算机里(或者用我上篇文章的比方说,写在来仓库领东西的人的脸上)。它可以是仓库保管员第一次见到这个人时写上的,当然,也可以是那个领东西的人自己写上的。一旦这些字被写到他脸上,他又没有擦除掉这些字,那么他下次来领东西时,你就可以根据他脸上的字而对有关他的信息一目了然。
' x2 F% V4 W0 J$ Z1 u; f! V2、Cookie的交流只发生在客户端和服务器对话的过程中。也就是说,一旦领东西的人离开了仓库,你不能保证他脸上的字是否被更改,也不能保证别人是不是在脸上写上和他脸上一模一样的字。
8 t. d0 B" `7 c8 V3、字迹写在脸上有一个时效问题,过了一定的时间这些字就看不见了。Cookie也一样,Cookie也有一个时效问题。关于cookie的时效和其他一些详细属性,下篇文章再详细讨论。
8 z: M. y0 G4 n& K  c
0 {8 Z( r7 ~+ |( g: F对Cookie的进一步了解
' X1 z; N! S  T; y0 S* Z+ s6 Y  y  m* V- w& w3 L% Q
  前面的文章简单的介绍了一下cookie。现在对cookie做进一步的讨论。
1 R& ]: s7 p- s4 A2 H3 C  首先,把前面经常混谈的两个概念澄清一下:Cookie和Cookies。其实说白了,Cookies就是Cookie的集合,也就是说几个Cookie就是Cookies。但是,我们往往有时候经常把Cookies也叫做Cookie,比如“一个能下书的SD Cookie”。我们心里有了这个概念,就不怕表达上的混淆了。
6 [2 H4 s% X  T/ M0 Z  在这篇文章里,为了避免混淆,我们谈到Cookie,仅指单个Cookie。写到这里,大家可能会嫌我有些啰嗦,浪费了这么多时间,还不知道我要讲啥;甚至越看越迷糊了,因为单个Cookie还没弄清楚,就十八摸什么cookie和cookies。好了,现在就来讲讲单个Cookie。 9 l9 R. Z+ c" w/ F
  单个Cookie可以说是一个“六元组”。大家别骂我,啥叫六元组?呵呵,其实这是我杜撰的一个词,通俗点说就是包含六个属性的东西。就好比一张调查表吧,里头有姓名、性别、年龄、籍贯、政治面貌、婚育状况等六项,我们就可以说这张调查表就是一个“六元组”。在一个Cookie里,首先有Cookie名,这个是最基本的。有了名,那当然就得有Cookie值了,这是第二个属性。第三个属性在上一篇帖子里提到过,就是Cookie实效(expires)。另外,cookie是和浏览器从服务器那里取得的网页紧密联系在一起的,那么,cookie当然少不得和服务器及其网页属性(也就是所谓的URL)发生一点关系了,这就牵扯到cookie的第四五个属性:Cookie域名(domain)和Cookie路径(path)。cookie属性里的domain和path可以理解为对应于URL里的domain和path。不过cookie属性里的domain和path有点高级。因为URL里的domain和path是一对一的,一个domain就是一个domain,一个path就是一个path。而cookie里的domain和path有点“通配符”的味道,也有点继承的味道。比如一个cookie的domain属性是".sciencedirect.com",那么URL的domain为www.sciencedirece.com或img.sciencedirect.com等等的网页,都可能拥有这个cookie。比如一个cookie的path属性是"/science/",那么URL的路径为"/science/","/science/p1/"等等“/science/”下的一切子路径的网页,都有可能包含这个cookie。
( G! J0 I+ ^& p4 M( b1 w1 Y
5 r# ^9 u3 F! @9 x  最后是cookie的第六个属性:secure。啥叫secure属性呢?我们在上篇文章的讨论里应该已经知道,cookie的用途在于在浏览器和服务器的交流过程中起一定的标志作用。浏览器和服务器之间的交流协议一般来说是HTTP协议(即超文本传输协议)。然而,除了HTTP协议之外,还有一种不太常见的HTTPS协议(即安全的超文本传输协议),其与HTTP协议最大的不同就在于“安全性”。cookie的secure属性,就是指,这个cookie是专门给HTTPS协议用的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则