3.1.4 cookie、session、token三角关系

前言

        在接口自动化中,我们经常会涉及cookie、session、token。为什么会有这三个内容呢?他们三者之间又是什么关系呢?那么今天我们彻底来理解搞懂他们~~~

故事开始

       为了更好的理解三者之间关系,小编设定几个故事来完成,故事角色人物设定:小编,cookie、session、token。

cookie的春天

cookie:首先我出场,大家知道为什么要存在我呢?

小编:为什么要存在?小样,这么简单的问题居然还问我?我们大家都知道http是一个基于应用层的面向对象协议,具有简单快速、灵活、无状态、无连接等特点信息,为了能够存储web的状态信息,方便服务器使用那必然不能少你呀。

cookie:那么我一般是怎么存在的呢,又有哪些内容呢

小编:哎,你怎么连自己怎么出生的都不晓得呢?你的第一次是服务器向客户端发送过来的,是开发创造了你的,你保存在客户端浏览器中;你构成嘛,主要是由cookie的name、cookie的域、cookie的路径、cookie的创建时间、cookie的到期时间、cookie的max-age、cookie的httpOnly、cookie的secure安全标志等。

cookie:嗯,我有自己的内容,但是他们是以什么形式存储的呢?有限制吗?

小编:这个问题嘛,说简单点就是以键值对的形式存在的字符串格式的。然后限制主要就是你的身体大小了,你一般就是4kb的大小限制,你的其他内容就是可选项了。

cookie:小编你好懂我呀,那么你知道我有多少分身吗?

小编:影分身呀,这个小case呀,我最喜欢鸣人的影分身了,哦,跑题了。你分类还是很多的,主要有会话cookie(session_cookie)、持久cookie、安全cookie、httponly cookie、第三方cookie等;具体分别影分身拥有的特征是如下:

  • a.session cookie:会话cookie:表示的是只会在当前会话期间有效,如果关闭浏览器的话,则其cookie会被删除

  • b.持久型cookie:表示的是长期在用户会话中是有效的;该有效当然也是根据cookie的生命周期而定的,主要是根据cache-control键值对进行声明(开发定义);它可以记录大多数用户的初始化或者自定义操作;(弱登陆状态)

  • c.安全cookie:主要是基于https协议下访问所产生的cookie形态;cookie从服务器传输到客户端,在客户端保存等整个过程会实现cookie的数据加密操作,那么这样就可以降低cookie的暴露以及被引用;

  • d.httponly cookie:相当于是设置成http only的cookie只能够在http(https)类型协议上发送请求传递;

  • e.第三方cookie:主要是用于进行采集用户的一些行为习惯和访问历史信息;

session 第二者插入

cookie:既然拥有我,为何还要session呀,它能干嘛,有我强吗?

小编:cookie呀,你是解决了很多问题,但是你不够安全呀,你懂得,你经常被别人欺骗呀,你知道我损失多大吗?哎~~~

cookie:那session它能保护你吗?它能解决我帮你解决的所有问题吗?它是怎么存在的?

小编:浏览器第一次访问服务器的时候,服务器会创建一个session,同时生成唯一的key,则是sessionID。并且这个sessionID是一串随机序列字符串。session机制是采用服务器保持状态的方案。

session:当然了,每次访问都会形成一个新的sessionID,那session就不一样了,这样后续每次发送请求都必须携带这个sessionID,如果不携带,服务器就不会拒绝后续请求,此时当然就安全了。

小编:session呀,虽然你有提高安全性的作用,但是你知道你是以什么形式返回给客户端的吗?

session:不晓得呢?

小编:通过设置cookie的方式返回给客户端哦。当然在后端的时候我们也可以将session保存到数据库或者redis这些nosql中。

cookie:偷笑中~~~,不还是要依赖我,哈哈哈~~

session:虽然我是通过cookie发送了,但是有些时候浏览器禁止了cookie怎么办?

小编:这个嘛?我想想,你说你何必两个人争来争去呢,搞得我费脑子。可以通过URL重写的方式发送给服务器嘛。

session:当然如果后台有个服务器部署,属于分布式,那我在其中一台登陆了,称为A,session也保存在A中,万一下次我访问另一台服务器B怎么办?B上没有A的session呢?

小编:你咋这么犟呢,哎,既然每个服务器都有session,那我们就保存到库里面呀,这样我们就互相通过访问过来的cookie里面拿到session信息与库中的进行比较,session就共享了。

session:嗯,嗯,不错,是的,可以通过数据库进行处理,但是又有问题了呀,这样我们保存这么多数据,数据量大的话则服务器不崩溃呀,还得了?

 

小编:我.....,非逼我呢,确实是,每次保存session信息对服务器而言就是一个很大的负担,这就是我们在设计的时候既需要考虑客户端存储部分数据,服务器端存储部分数据(敏感数据),这就是我说的cookie、session你们两个都必须同时存在,为我一起解决问题呀,同样的重要呀。

cookie:那我跟session的区别都有哪些呢?

小编:重要区别有以下几点:

        a.cookie数据存储在客户端、session数据存储在服务器;

 

        b.cookie不是很安全,只需要了解此机制的相关人员可以通过本地cookie完成cookie欺骗操作;session相对数据存储更安全;

        c.为了考虑服务器的性能问题,所以通常采用cookie与session同时使用的机制完成一个请求响应的操作过程;

        d.单个cookie的存储数据不能够超过4k,还有就是每个浏览器都存在对应的最大cookie的限制数;

 

token第三者插入

cookie:session 是保存了会话的链接信息与我们需要传输的内容,容量大,还需要保持会话信息,每次同一用户不同客户端访问我都需要重新建立session,造成冗余信息大。这怎么办,不想保存呀?

token:哈哈,我来了,用我呀。

session:token?又有第三者了?cookie来一起帮我揍它。

小编:session干啥呢,token是个新技术,表示的是令牌、身份校验,相对session而言更加的安全。

session:那token能验证用户的合法性吗?

小编:当然,比如用户登录了,我们会把令牌信息,发送给他,包含了一个他的userId,代表他的信息,再访问的时候通过header或者bady带过来就好。

session:那不是跟我一样呢,有啥区别呀?

小编:还是有区别的,token可以不用存储session信息到库里面了,还有每次不同的会话创建新的token,也不影响(单点登录貌似可以通过token做哦,做过的小伙伴可以尝试下),是不是感觉token比session好多了?

session:嗯嗯,但是这也给黑客创建了伪造token信息呀,安全性还是不高呀?

小编:这更简单了,对咱们返回的token里面数据做一个签名,秘钥别人不知道,这样伪造的token不就通不过我们的限制了嘛。加密算法可以采用HMAC-SHA256这些算法等等。

cookie:神奇呀,token这就解决session的问题了。小编总结下session与token的区别呗?

小编:两者主要区别是:

  • token 是无状态的,后端不需要记录信息,每次请求每次解密就行。

  • session 是有状态的,需要后端每次去检索id的有效性。不同的session都需要进行保存哦。但让也可以设置单点登录,减少保存的数据。

  • session与token的问题是空间与时间博弈,为什么这么说呢,是因为token不需要保存,直接获取,每次访问都需要进行解密。

小编:那么你们问了那么多,我有问题了,为啥客户端ios与Andriod基本上没见过用session的?

session:这个我来回答吧。因为在这些客户端上啊,原生接口都是每一次建立一个会话,这就出问题了,这样会导致登录功能失效了,登录每次把信息放到session中,session都不一样了,每次登录都成新的一个人了,这就不ok了。

小编:嗯,嗯,原来客户端是每次用原生接口都是新建立一个会话,好尴尬的设计。那我们采用什么方式解决这个问题呢?

session:在用户登录后,我们可以通过cookie嘛,我们在app端也可以是存储cookie的,我们知道cookie将sessionID保存好,返回给客户端,服务器最后也是通过SessionId来标识的。但是利用token的话,内容我们可以自定义,并且不用再服务端进行保存。方便我们处理。

小编:那么就是token可以保存到cookie中,如果禁止的话我们也可以保存到body中每次都请求上或者header中。

总结:至此,三者的故事结束了,希望大家从故事中理解他们三者之间的关系吧~~~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zemuerqi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值