cookie & session
cookie
-
是什么?
指某些网站为了辨别用户身份而存储在用户本地终端上的数据。(就是网站为了以后一段时间内还能确定你是谁 而存一些数据(cookie)在你本地的电脑上啦) -
分类
1、cookie就总是保存在客户端中。
按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。
内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。
硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。
所以,按存在时间,可分为非持久Cookie和持久Cookie。 -
用途
背景:因为HTTP协议是无状态的,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接,这严重阻碍了交互式Web应用程序的实现。
场景1:
在典型的网上购物场景中,户浏览了几个页面,买了一盒饼干和两饮料。最后结帐时,由于HTTP的无状态性,它就不知道你之前选了啥商品。。。
那么,不通过额外的手段,服务器并不知道用户到底买了什么╮(╯▽╰)╭要跟踪该会话,必须引入一种机制。
所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。就是需要的一种机制。
服务器可以设置或读取Cookies中包含信息,借此 维护用户跟服务器会话中的状态。
场景2:
在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结帐时,服务器读取发送来的Cookie就行。
场景3:
Cookie另一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,(如果该Cookie尚未到期)浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。
- 缺陷
1、Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
2、由于在HTTP请求中的Cookie是明文传递的,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,所以安全性成问题。(除非用HTTPS)
3、Cookie的大小限制在4KB左右,很多浏览器都限制一个站点最多保存20个cookie,对于复杂的存储需求来说是不够用的。
session
-
是什么
客户端浏览器去访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这个记录的信息就是session啦。
客户端浏览器再次访问这个服务器时,只需要从该Session中查找该客户的状态就可以确定这个用户了。 -
session对浏览器的要求
虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。
这是因为Session需要使用Cookie作为唯一识别标志(主键)。
HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户。
因此服务器向客户端浏览器发送一个名为 JSESSIONID 的 Cookie ,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。
该Cookie为服务器自动生成的,它的maxAge属性一般为–1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。 -
缺陷
1、session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能
对比cookie和session
1、cookie数据存放在客户的浏览器上,session数据放在服务器上
2、如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
3、考虑到安全应当使用session。考虑到减轻服务器性能方面,应当使用COOKIE。
4、Cookie和Session的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客户端的cookie有依赖关系的。
上面讲到服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie。
因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用。(。・_・)/~~~
补充
先说个有意思的场景来了解方便理解cookie、session~~
我们都知道银行,银行的柜台每天要处理众多客户的存款/取款业务,可以有几种方案:
凭借柜台职员的记忆,来为每位顾客办理业务。单凭职员的记忆力,要记到每位顾客的相貌,并迅速这个顾客当前的存款以及存取的次数,每次存取的金额是多少。-----------这种方式表示协议本身支持状态。(那么如果是http,就是没记忆的柜员,估计银行不要了她了(╥╯^╰╥),哈哈)
使用存折的方式。柜台职员就把每个顾客的存款/取款的信息保存在这张折子,然后交给顾客保管,当顾客来存款/取款时,只要拿出存折,职员查看存折就对当前这位顾客的存款/取款信息一目了然。当然,你马上会想到,顾客修改这个信息怎么办?我们也有措施对每次存款/取款记录后面盖章。无盖章的就是假冒信息。但如果顾客是真的要伪造,当然印章也是可以伪造的。-------------这种方式就是在客户端端保持状态。(那么cookie就是类似存折啦,存折(cookie)可以造假,所以不是很安全嘞(=′ー`))
使用银行卡的方式,发给每位银行用户一张银行卡,银行卡上有一个唯一的卡号,没有其它任何信息,当顾客来存款/取款时,拿出银行卡,银行把卡号输入的电脑,很快就显示当前用户的存/取款记录。这种方式的安全性就会有很大的提高。用户想要手脚只有攻破银行的服务器来修改自己的存/取款信息,这样做难度会很大。-----------------这种方式就是服务器端保持状态。(那么session就是银行电脑里的顾客个人信息及存取款信息啦,别人电脑里的就蛮难伪造了吧,session相比cookie就安全多啦o(*≧▽≦)ツ┏━┓)
参考:
虫师
理解Cookie和Session机制