您的位置:首页 > 其它

session和cookie对比兼session实现机制

2017-02-18 17:57 274 查看
Session和cookie

1、session和
cookie概念区别

Cookie是浏览器(user agent)访问一些网站后,这些网站存放到客户端的一组数据,用于网站跟踪用户,实现自定义功能。

Cookie的Domain和Path属性标识了这个Cookie是哪一个网站发送给浏览器的;Cookie的expires属性标识了Cookie的有效时间,超过有效时间,cookie数据自动被删除。

Cookie若没有设置expires有效时间,那么Cookie的生命周期为浏览器会话时间,只要浏览器关闭,Cookie就被删除,这样的Cookie被称为会话Cookie,它一般保存在内存里,不同浏览器进程中不能共享这个Cookie。Cookie若设置了expires有效时间,那么Cookie的生命周期为expires设置的有效时间,只要在有效时间内,即使关闭浏览器,也不会删除Cookie,再次打开浏览器时,Cookie依然存在,这样的Cookie一般存储在硬盘中,可以实现在不同浏览器进程中共享Cookie。

Session是存放在服务器端的类似于HashTable的结构来存放数据。如果浏览器是第一次发送请求,那么服务器会自动为其生成一个HashTable和sessionID用来唯一标识这个hashTable,然后随响应发送给浏览器。以后浏览器向服务器发送请求时,会将第一次请求服务器给发送的sessionID放在请求中,一块发送给浏览器。服务器从请求中提取出sessionID,和已经保存的所有sessionID做对比,找到这个用户对于的hashTAble。

一般情况下,服务器保存这个hashTable有时间限制(默认20分钟),过了时间限制,就会销毁这个hashTable。在服务器销毁hashTable之前,程序员可以手动将用户的数据以键值对的形式暂存在这个hashTable中。也可以使用数据库将这个hashTable序列化后保存起来,但是这样就没有了时间限制,hashTable可以一直存放在数据库中,随着时间的增加,数据库中数据会越来月多,如果遇上超大访问量时,甚至会急速膨胀。所以一般还是不存在数据库中。

2、session和cookie的区别

Cookie存放在客户端,session存放在服务器端。

如果浏览器使用的是cookie,那么所有数据都保存在浏览器端。当客户端登陆一个网站后,服务器会为其设置一个cookie用户名(username),只要浏览器不关闭,客户端再次请求服务器时,会将这个cookie用户名(username)一块发给服务器,服务器会将其解释为cookie变量,cookie变量在浏览器不关闭的情况下是一直有效的,保证能够长时间不掉线。但是这样在客户端存放的cookie能够被第三者截获,然后伪造一个数据包发过去,冒充客户端的身份去请求服务器。所以使用cookie被攻击的可能性较大。

但是,伪造cookie的时候,直接copy cookie文件到cookie目录是没有用的,因为它还有一个index.dat文件(存储了cookie建立时间,是否修改等),所以你先要有该网站的cookie文件,并且从时间上骗过浏览器才可以。

如果web服务器端使用的是session,那么所有的数据都保存在服务器上面,客户端每次请求服务器时会发送当前会话的sessinID,服务器根据当前的sessionID判断用户数据标志,以确保用户是否登录,或具有某种权限。由于数据是存储在服务器 上面,所以你不能伪造,但是如果你能够获取某个登录用户的sessionid,用特殊的浏览器伪造该用户的请求也是能够成功的。sessionid是服务 器和客户端链接时候随机分配的,一般来说是不会有重复,但如果有大量的并发请求,也不是没有重复的可能性。

3、session和cookie配合使用

Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。

4、session的实现机制

(1)基于cookie实现session

当客户端请求服务器时,服务器会为客户端创建并维护一个session对象,用于存放客户数据,同时也会生成一个sessionID,作为标识这个客户的唯一身份,服务器会用cookie将sessionID保存在客户端。当浏览器再次访问该服务器时,会将这个存有sessionID的cookie一块发送到服务器,服务器提取出该sessionID,通过其检索到对应的session对象,访问这个session对象。注意,此时的cookie中仅保存一个sessionID,而相对较多的会话保存在服务器端的session对象汇总,有服务器统一来管理,这样一定程度保证了会话数据的安全性,但是增加了服务器的内存开销。存放在客户端的用于保存SessionID的Cookie会在浏览器关闭时清除。(session的有效期可以在服务器端设置)

(2)基于URL重写

    第一种方式session对象的使用基于cookie,如果考虑到客户浏览器禁用了cookie的话,可以采用URL重写的方式使session在客户端禁用cookie的情况下继续生效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: