Cookie和session区别(理解+面试)
君哥
阅读:1860
2019-08-14 01:20:27
评论:0
前言
本文主要讨论session和cookie的作用、联系、区别以及面试中的考点。
提示:以下是本篇文章正文内容,下面案例可供参考
一、银行场景分析
背景描述:大家都知道银行,用户把信息存储到银行。然后用户在需要钱的时候要到银行去取钱,但是取钱的过程中存在稍许的安全问题(例如:金额是否改变?存取客户是否是本人?能不能取出超额资金?等待),下面场景就是描述银行如何处理这类安全问题所采取的一系列措施。
场景1
最早的银行应该是我们古代的钱庄。客户将钱、等个人所属物品存储到钱庄。因为早期主要为富人提供服务,因此人员较少,钱庄采取的服务为老板坐台通过人眼“面部识别+账本”记录顾客的面貌、金额、次数。————这种方式表示协议本身支持的状态。
场景2
背景:凭着钱庄百年老店的信誉,钱庄老板不满足偏安一隅,想着扩张业务,增大店面。但是随着店面的增大,各种问题接踵而来,如何管理这么多店面?客户的信息如何存储?若依旧按照之前个人账本,那么如何做到这么多店面同步?
策略:使用存折模式,每次存取款时候会在存折中记录顾客的存取款信息,并在存取款处盖上钱庄特有印章,然后交予顾客保存,当顾客来存取款时候,只要拿出存折即可,店员校验存折的印章是否正确。当然若顾客存心伪造,那么印章也是可以伪造的(参考猫鼠游戏的小李子)——————这种方式就是客户端保持。
场景3
背景:随着人群的伪造功能提升,场景二的客户端保持信息已经变得越来越不安全。 加上计算机互联网的不断发展,需要开发一种新式的银行存储方案。
策略:银行卡系统。银行发给用户一张银行卡,每个银行卡上有一个唯一的卡号,没有其他信息(银行卡内置信息可以在银行中查到,但不算是银行卡表面上携带的信息)。顾客取款时候,输入银行卡和秘钥(秘钥仅用户和系统知道),银行根据银行卡和秘钥查询数据库,返回存取款信息。这种方式的安全性就会有很大的提高。用户想要做手脚只有攻破银行的服务器来修改自己的存/取款信息,这样做难度会很大。——————这种方式就是服务器端保持状态。
场景4(附)
背景:随着客户流量的急剧攀升,每个平台都会布置多个服务器防止服务器过载,那如何保证每台服务器都能识别用户呢,若每次登陆都查询服务器这样的安全性能肯定最高,但是性能问题则会出现严重问题。(其实以上场景描述也是主要针对如何解决用户的登录问题)
策略:token。现在比较流行的是JWTtoken。用户在第一次登录之后,系统会给用户一个token,token对用户信息进行加密的一个序列号。后端获取token之后会校验其合法性,若正确将token的用户信息返回即可。
二、cookie和session的产生过程
1.cookie机制
正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。
2.session机制
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。 当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识——session id(Tomcat服务器中称为jsessionid),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。
3.session和cookie交互策略
通过上述应该了解了,session id就是交互策略的关键。那如何保存这个session id,通过可以通过cookie实现,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。
面试相关
1.session和cookie的区别
1.cookie和session都是一种存储信息的手段,其中cookie存储在客户端(浏览器),而session存储在服务器端。前者容易伪造,后者基本不可能。session id(Tomcat称为jsessionId)就是session存在cookies中的key。
2.cookie因为存储在客户端,所以可能会存在cookie欺骗问题(修改session id,从而直接获取访问服务器的资格),而session通常更加安全
3.若均存储在session中,当访问增多时候,会比较占据服务器性能。
4.cookie因为存储在客户端,因此受到存储性能限制。单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie
5.cookies 本质就是http协议中一个配置项,很容易在多台服务器共享;session 不能在多台服务器共享,除非专门使用了分布式的session框架处理了。
2.并发访问下信息放在session中的性能隐患。
由上题可知,若要将数据放在session中,可能会造成并发访问下服务器的压力过大的情况,那如果我找一些服务器一起做这个事呢?比如整个负载均衡?
若使用负载均衡,那么可能访问的服务器可能不太一样,此时就需要保证服务器数据同步。因为要保持数据一致性,并且共享session时候不能返回用户信息,不然会出异常,即可用性和一致性的矛盾问题。
3.若禁用了cookie那么session能不能使用?
能使用。 经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。
来源 https://blog.csdn.net/JasonLee97/article/details/110368511
本文链接:http://yanjun202.com/post/31.html