Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

Web开发基础:Cookie和Session

  HTTP是基于TCP来实现的,而单独拿出一个TCP连接,服务器也没办法确定这个TCP连接是哪个客户端发起的(一个IP可以有多个客户端)。所以,当服务器需要知道连接发起的客户端时,就需要客户端来主动告诉服务器自己是谁。这动作听上去很简单,但是客户端只是浏览器而已。浏览器如果要告诉服务器自己是谁就必须先记住自己是谁。如果没有这个记忆功能,自己都不知道自己是谁那服务器就更无法确定。所以,这时候就需要引入储存数据的功能。
  在Cookie被提出以前,HTTP只是用来做简单的HTML数据传输用的。自从有了Cookie之后,HTTP是腰不酸了腿不疼了,一口气上五楼不费劲儿。以至于普及到现在这种程度。Cookie的作用就是让客户端拥有记忆的能力,访问服务器是可以对服务器做个自我介绍。客户端上Cookie也不会平白无故的就出现了,通常是在访问了服务器之后服务器给客户端设置的。Cookie是在HTTP头中传输的,如果非要纠结这个,我们就去找个HTTP头来围观下。下面这个是一个“未经人事”的客户端去访问百度之后得到的HTTP响应头。 HTTP/1.1 200 OK
Date: Wed, 05 Dec 2012 13:56:32 GMT
Server: BWS/1.0
Content-Length: 4015
Content-Type: text/html;charset=gbk
Cache-Control: private
Expires: Wed, 05 Dec 2012 13:56:32 GMT
Content-Encoding: gzip
Set-Cookie: BAIDUID=07EBE84757CE914EF14ABF072B76405E:FG=1; expires=Wed, 05-Dec-42 13:56:32 GMT; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Connection: Keep-Alive
  其它部分无视掉,只看倒数第三行的Set-Cookie,这就是服务器传输给客户端的Cookie。客户端收到这个之后就会分析这个Cookie。Cookie其实不像我们想的那么简单,一个Cookie包含着许多信息。比如上面百度传过来的Cookie就由4个部分组成。第一个是名称=值,这是Cookie最基本的东西它是一个Cookie必须的,没有它后面对这个Cookie设置的参数也就没意义了。接着是:过期时间、路径、域名。Cookie是保存在本地的,也就是说即使关闭了浏览器Cookie也不会消失,但是这样就会让Cookie的数量只加不减而产生冗余,所以Cookie是有时效性的。Cookie在客户端只会被保存到过期时间为止,超过那个时间就会删除掉。如果服务器设置Cookie的时候没定义过期时间,那么这个Cookie就会在浏览器关闭时被删除。Cookie的作用域未必是一个域名,也可以是域名下的某个目录,所以需要用路径来指定哪个页面,百度使用了“/”说明是在首页上的。首页上的Cookie才是整个域名都可以使用的。最后还可以指定域名,这是因为,域名通常还包含子域,每个子域都是单独的一个域。而Cookie是不能被跨域访问的,这是当然。想想看,要是可以跨域访问会有什么后果(那我访问的XXX网站不全被你们知道了←_←)。百度这个Cookie是被设置到根域上的,和路径一样的道理,根域的Cookie在所有子域都是可以被使用的。这个域名和路径也不是必要参数,如果服务器没定义就会使用当前页面的域名和路径。
  像Cookie这样在网络上传来传去的东西当然不安全,如果保存用户的机密信息也这样肆无忌惮就很容易泄漏。所以我们的前辈们想出了一个办法,那就是把机密信息留在服务器不传给客户端,只给客户端留下一串标识符。这个方法就是我们耳熟能详的Session了,服务器传给客户端的标识符就称为SessionID。就像上面百度那个例子一样,BAIDUID的值我们是无法从中获取到什么信息的。客户端可以通过这个标识符告诉服务器哪一方机密信息是属于它的,需要做的处理都在服务器上完成,这样安全性就大大增加。现在主流的后端开发语言都支持Session,但是他们的支持方式和支持程度各不相同。不过有一个共同点,Session在服务器上保存的用户数据也是有时效性的,过了某个时间这个Session保存的数据就会失效。一般把这个Session保存的数据的失效时间和SessionID的失效时间设置成一样的。但是服务器是开发者自己来配置的,偶尔也会不同。这种情况它俩中任何一个过了失效时间都意味着这个Session失效。所以,谈论Session失效时间的时候是使用SessionID和Session在服务器端保存的数据失效时间中较小的那一个。
  虽然Session的安全性比Cookie高许多,但是这还是不够安全,因为别人可以窃取用户的SessionID冒充客户端向服务器请求一些机密信息。这就是传说中的XSS漏洞。前面说的Cookie禁止跨域问题就是因为这个。不仅是Cookie禁止跨域,除了一些特定的HTML标签外,客户端上的Web程序都是禁止跨域的。因为,只要不允许跨域,Cookie就不会在访问别的网站时泄漏。当然,如果你的电脑本身中毒了,那就真没办法了。浏览器对跨域的限制这么严格当然也会带来一些其它问题,所以跨域这个东西本身在Web前端中也是一个值得研究的课题,这里就不细说了。
  以上就是我眼中的Cookie和Session,欢迎调教(请多指教←_←)。
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^