登录 |  注册 |  繁體中文


cookie和session的关系

分类: 服务器相关 颜色:橙色 默认  字号: 阅读(1753) | 评论(1)

cookie和session机制之间的区别与联系
    cookie是当你浏览某网站时,网站存储在你机器上的一个小文本文件,它记录了你的用户ID,密码、浏览过的网页、停留的时间等信息,当你再次来到该网站时,网站通过读取Cookie,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等。这些文件通常是以user@domain格式命名的,user是你的本地用户名,domain是所访问的网站的域名。
    cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
    cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在浏览器内存中里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式     
    
为什么会有cookie呢,大家都知道,http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力.

         ----------------------------------------------------------------------------------------------------------------------

      session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是此用户有哪些session,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器。而sessionID可能需要借助于cookie来保存。系统会创造一个名为PHPSESSID的输出cookie,我们叫做session cookie,以区别persistent cookies,也就是我们通常所说的cookie,注意session cookie是存储于浏览器内存中的,并不是写到硬盘上的,所以平时我们关闭了浏览器后,再打开,需要重新登录。那sessionID是怎么产生的呢?应该是第一次访问服务器的时候,服务器随机生成的,即当服务器需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。
      举个例子,假如浏览者访问服务器,服务器产生了一个sessionID为111,这些信息存在了服务器上了,服务器再这些信息传送给浏览者,当浏览者继续操作,也就是打开另一个页面,打开另一个页面的时候其实相当于重新访问服务器,如果没有特殊的处理机制,系统会再次重新分配一个sessionid的,这样的话就失去意义了~!所以sessionid在第一次访问后,应该存在了客户端.,这样浏览者再次访问时,传给服务器sessionID,服务器就知道是刚才访问的用户了。那这个sessionId能存哪呢?当然,只能存在cookie中了也就是前面提到的 session cookie,存于浏览器的内存中,这也就是为什么关闭cookie后,session就失去作用了。


      明白了原理,我们就可以很容易的分辨出persistent cookies和session cookie的区别了,session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本(通常是加密的),而且可能会遭到cookie欺骗以及针对cookie的跨站脚本攻击,自然不如session cookie安全了。
    就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。


        经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:
    


    
    
    
实际上这种技术可以简单的用对action应用URL重写来代替。

 

 



上一篇:php代码注意事项   下一篇:浅谈HTTP的无状态性

  • #1uguke2010-05-31 19:21:20
    不错,好地方
姓 名: *
邮 箱:
内 容: *
验证码: 点击刷新 *   

回到顶部