Cookie
由W3C组织踢出的,既然HTTP是一种无状态的协议,那么就为每个客户端分发一张通行证吧,这样一个会话一个通行证,就能确认身份了,每当需要建立新的连接,则需要想服务端展示其通行证,这样就不怕小明加购物车的书加到小红的购物车里了。
了解了它的原理我们了解一下它的特性:
Cookie能记录用户的访问次数,和gc的寄存器有异曲同工之处
Cookie不可跨域名使用,比如小红在某宝买完东西她逛累了,打开了B站,这个时候某宝的Cookie就对B站没有用了,需要重新分发通行证了
保存中文,小红很有个性,就要将名称设置为中文,这个时候Cookie就会用Unicode编码来防止乱码
Cookie将图片转换为二进制来保存
Cookie的有效期,所有通行证都有有效期的,Cookie的有效期可以有程序猿自己设置,根据网站类型不同选择的时间也不太一样
Cookie的安全性 由于HTTP协议不仅是无状态的,而且也是不安全的,HTTP协议的数据不经过任何加密就直接在网络上传播,黑客就可以轻松截取到信息,所以使用他会有一定的安全风险,可以在设置Cookie的时候讲secure属性设置为true,浏览器就只会在HTTPS和SSL等安全协议中传输了,但是secure属性不能对Cookie内容加密,因而不能保证绝对的安全,如果需要提高安全性,就需要在程序中为Cookie内容加密,解密,防止被截取泄密
永久登录,小明觉得在家里很安全,不会有别人来偷窥,所以就可以将自己的账号密码保存在Cookie中,并将Cookie的有效期设置为几年甚至更久
额外知识:查看某个网站颁发的Cookie很简单。在浏览器地址栏输入javascript:alert (document. cookie)就可以了
Session
如果说Cookie是给客户端发通行证,那么Seesion则是在服务器端简历一个“客户表”来确认用户的身份,所有来访的用户只需要对应上表就可以了
了解了它的原理我们了解一下它的特性:
Session的生命周期:由于Session保存在服务器但,为了获得更高的存取速度,服务器一般将Session放到内存中,me米格用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器则会导致内存溢出等危险,所以Session里的信息都会比较精简,当用户第一次访问服务器的时候会自动创建,Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间
Session的有效期,当越来越多的用户访问服务器,Session的数量也会越来越多,如果不及时清理一些Session,会导致内存溢出,系统崩溃,我们知道,jvm在清理垃圾的时候会根据gcroot,根节点如果没有连接到的或者gc寄存器来清理垃圾,服务器的清理原则跟jvm的很像,服务器会将长时间没有活跃的Session从内存中清理掉,例如:小明在6年前在小米商城买了小米6,今天想买小米12,假设小米的Session只保留半年,则小明需要重新登录他的小米账号进行购买
Seesion对浏览器也是有要求的,虽然说Session保存在服务器内,但是对客户端是完全公开的,它的正常运行仍需要客户端浏览器的支持,因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,所以Session不能依据HTTP连接来判断是否为同一用户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,他的值为Session的id(就是HttpSession.getId()的值),Session依据该Cookie来识别是否为同一用户
我们了解完他们各自的属性后我们来看看他们有什么区别吧
区别
cookie数据存在客户端的浏览器上,session数据放在服务器上。当小明登录了一个网站,如果他登录的网站的web服务器端使用的是session,那么除了SessionID以外的所有的数据保存在服务器上,客户端每次请求服务器都会发送当前会话的session_id,服务器再根据当前的session_id判断用户数据,由于数据是保存在服务端,所以一般伪造,当黑客获取了小明的session_id之后,用特殊的浏览器伪造就能成功的伪造出小明的请求,一般session_id是不会重复的,但是如果有超大并发量请求的时候,也是有可能重复的,而SessionID是用Cookie保存在客户端的,如果客户端禁用了Cookie,那么Session也会失效
cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗。
session会在一定时间内保存在服务器上,当访问增多的时候,会比较占用我们服务器的性能,如果追求性能方面使用cookie较好
单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie。而session没有数量限制,而且可以保存更为复杂的数据类型
session很容易失效,用户体验较差,虽然cookie不安全,但是可以加密,使其相对安全一点,可以将账号密码存放在cookie中,下次登录就可以直接跳出来,用户体验较好、
两者的最大区别在于声明周期,小明将账号密码放在cookie中可以使用很久,但是session是在打开浏览器的时候创建,一旦关闭session也就销毁了