目录
- Cookie
- 会话Cookie和持久Cookie
- Cookie具有不可跨域名性
- Session
- Session的创建
- Session的客户端实现形式
- Session与Cookie的联系
- Session与Cookie的区别
- 参考
Cookie
Cookie 并不是它的原意“甜饼”的意思,Cookie是存放在客户端的,Cookie是一段不超过4KB的小型文本数据,由一个名称(Name)、一个值(Value)和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。由于Cookie是存放在客户端,是可见的,安全性就会很低。因此不建议将一些重要的信息放在Cookie中。
客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie,客户端会把Cookie保存起来。
当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
会话Cookie和持久Cookie
- 若不设置过期时间,则表示这个Cookie的生命期为浏览器会话期间,关闭浏览器窗口,Cookie就消失。这种生命期为浏览器会话期的Cookie被称为会话Cookie。会话Cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。
- 若设置了过期时间,浏览器就会把Cookie保存到硬盘上,关闭后再次打开浏览器,这些Cookie仍然有效直到超过设定的过期时间。存储在硬盘上的Cookie可以在浏览器的不同进程间共享。这种称为持久Cookie。
Cookie具有不可跨域名性
例如,浏览器访问百度不会带上谷歌的Cookie。
Session
Session意思是“会话”,Session 是存放在服务器端的,类似于Session结构来存放用户数据,当浏览器 第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标识这个Session,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的Session。
由于Session存放在服务器端,所以随着时间的推移或者用户访问的增多,会给服务器增加负担。使用的时候要考虑下服务器的性能。
Session的创建
当程序需要为某个客户端的请求创建一个Session时,服务器首先检查这个客户端的请求里是否已包含了Session ID,如果已包含则说明以前已经为此客户端创建过Session,服务器就按照Session ID把这个Session检索出来使用(检索不到,会新建一个);
如果客户端请求不包含Session ID,则为此客户端创建一个session并且生成一个与此Session相关联的Session ID,Session ID的值是一个既不会重复,又不容易被找到规律以仿造的字符串(例如:tomcat的ManagerBase类提供创建sessionid的方法:随机数+时间+jvmid),这个Session ID将被在本次响应中返回给客户端保存。
Session的客户端实现形式
使用Cookie来保存,这是最常见的方法,“记住我的登录状态”功能的实现正式基于这种方式的。服务器通过设置Cookie的方式将Session ID发送到浏览器,也就是通过Cookie把Session ID带给服务器端来分辨客户端的不同请求。
如果不设置Session过期时间,那么这个Cookie将不存放在硬盘上,当浏览器关闭的时候,Cookie就消失了,这个Session ID就丢失了。
如果设置Session过期时间为若干天之后,那么这个Cookie会保存在客户端硬盘中,即使浏览器关闭,Session ID仍然存在,下次访问相应网站时,同样会发送到服务器上。
如果客户端禁用了Cookie,通常有两种方法实现Session而不依赖Cookie。
- URL重写,就是把sessionId直接附加在URL路径的后面。
- 表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把Session ID传递回服务器。比如:
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng">
<input type="text">
</form>
Session与Cookie的联系
由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。
思考一下服务器端如何识别特定的客户?
这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。
实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个Session ID发送到服务器,我就知道你是谁了。
如果还是有些抽象,那就举一个具体一点的例子:
Session是房间,存放登录客户的相关信息,房间有个钥匙,叫Session ID,如何把这个钥匙交给客户端呢,最常见最简单的就是把钥匙(Session ID)交给Cookie,这样就可以用钥匙(Session ID)唯一标识Cookie了,也就唯一标识了客户,客户就会保存钥匙(Session ID),从此之后客户每次发送请求的时候就用Cookie将Session ID带到服务器端,如果钥匙(Session ID)是正确存在的,才可以进入房间(Session)。
Cookie禁用之后还是有其他方法可以把钥匙(Session ID)交给客户端,比如重写URL和隐藏域传值。
Session与Cookie的区别
- Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,通常也是实现Session的一种方式。 - Session默认被存在在服务器的一个文件里(不是内存)。
- Session的运行依赖Session ID,而Session ID是存在 Cookie中的,也就是说,如果浏览器禁用了 Cookie,同时 Session也会失效(但是可以通过URL重写或隐藏域传递)。
- Cookie不是很安全,可以通过分析存放在本地的Cookie并进行Cookie欺骗,容易泄露自己网站用户的隐私,考虑到安全应当使用Session;可以考虑将登陆信息等重要信息存放为Session,其他信息如果需要保留,可以放在Cookie中。
- Session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用Cookie。
- 单个Cookie保存的数据不能超过4KB,一般浏览器对单个网站站点有cookie数量与大小的限制。(很多浏览器都限制一个站点最多保存20个Cookie)
参考
session和cookie的区别
COOKIE和SESSION有什么区别?