@@@@@@@@@@@@@@@
男生喜欢素颜的女生,指的是不化妆耶漂亮的女生
基于http无状态的特点,服务端是无法判断请求者的身份的,所以需要引入一个身份认证机制去判断请求人的身份。于是就有了cookie和session机制。先说说两者工作机制
cookie工作机制
cookie是通过在客户端存储用户状态信息的方式来实现,即用户首次请求后获得状态,并将状态存储在客户端,每次请求都需要带上本地的状态信息,这样服务端就知道是谁请求的了。cookie的完整工作流程如下:
1 客户端向服务端发送请求
2 服务端响应请求,并生成cookie
3 服务端将cookie放在响应信息中返回至客户端
4 客户端接收响应信息并在本地存储cookie
5 后续请求时客户端会在请求中带上cookie进行请求
6 服务端验证cookie的有效性并鉴定身份,请求成功
说起来比较抽象,举个实例,比如你去吃自助餐,餐厅在收了你的钱之后会给你个小票,然后你有了小票后面就可随意进出餐厅了,你出去上完厕所回来只要给他看一下小票就可以了。而这个小票就是cookie。
session工作机制
说完cookie说说session,session不同之处在于他把身份信息存放在服务端,其工作流程如下:
1 客户端向服务端发送请求
2 服务端相应请求,并生成session和session-id
3 服务端将session-id返回至客户端,并把session存放在服务端
4 客户端接收session-id,并在后续请求中带上session-id的值
5 服务端根据session-id的值去查找session,并判断用户的状态
依旧举个例子,还是你去餐厅吃饭,餐厅改革了,你交钱之后不给小票,而是给了你一个号码,然后你下次进来直接报号码即可。
那么两者区别是什么呢,首先一个很明显的区别,一个状态信息存放在客户端,一个存放在服务端。用上面的实例来说,第一个你可以从小票上看到你是什么时间下单,给了多少钱,你的单号是多少等信息,这些信息将作为你进来的凭证。而第二种,则是把这些信息都是记录在餐厅,生成了一个就餐人员明细表,而号码是每一条记录的一个唯一标识,你说出号码后,餐厅会根据你说的号码去餐厅的记录中找对应的信息,这个号码对应的人交了多少钱,在什么座位等信息。这就是最大的区别
从这两种机制的工作模式可以分析出他们各自的优缺点,用上述餐厅吃饭举例,先说第一种方式的缺点
1 如果小票上记录了客户的姓名,电话等隐私信息,那么由于小票是公开的,其他人也可以看到或者捡到,那么客户的信息就会暴露,对于隐私角度来说很不利
2 小票书写面积有限,如果要写的东西特别多,一张小票写不下就没办法了
第二种方式的缺点
1 就餐人数比较多时,就餐明细表会记录大量的内容,对餐厅本身就是一种数据压力
2 当一个客户频繁进入餐厅的时候,每次都要去表里找他这个号码的信息,无疑增加了服务器压力
由此可见,当考虑到数据安全性时,我们使用第二种比较好,当考虑减少餐厅压力时,我们用第一种比较好。对应到请求中也是一样,cookie和session的区别也是如此,我其实有一个长期困惑的疑问就是,感觉两种机制实现上是没有区别的呀。不管是用小票,还是用号码,都是通过一个“暗号”来实现身份信息判断的啊。确实,从本质来说,二者是没有区别,他们的区别只是在于实现方式而已,要说明一点的是,在session机制中大部分时候是借助了cookie的,session-id的传递实际上大部分时候都是通过cookie机制来实现的。所以session机制也可以理解为cookie机制的升级版。
总结
深入理解两者的工作流程,以及区别和联系,对一名it工作者有极大的好处,尤其作为测试,如果想更深入性能测试和安全测试等,对于互联网基础知识还需要不停的充电才可以,我们所见还只是冰山一角,路漫漫其修远,一步一个脚印慢慢走。
-- 以上内容均为笔者原创,转载请注明出处,如有不当欢迎指正~