session、cookie、token。 相信学过接口的朋友都特别熟悉了。
但是对我一个刚接触接口测试的小白来说,属实有点分不清楚。
下文就是我通过查阅各种资料总结出来的一点理解,不准确的地方还请各位指正。
(文末送洗浴中心流程指南)
产生背景
网络中http协议本身是无状态协议。
无状态协议的意思是:客户端向服务器请求数据时,每一次的请求和上一次都是没有任何关联的(特点:快!)。网上有一个经典的例子(看一次笑一次)可以帮助大家理解。
- 夏洛:楼上住的是马冬梅家吗?(第一次请求)
大爷:马什么梅? - 夏洛:马冬梅。(第二次请求)
大爷:什么冬梅? - 夏洛:马冬梅!(第三次请求)
大爷:马冬什么? - 夏洛:没事,大爷您歇着吧。
这位大爷就可以理解为web服务器。为了让这位大爷无状态的服务器能记住上一秒我是谁,cookie、session、token就横空出世,各显神威了。
cookie
- 一句话概括:服务器产生,只保存在客户端,客户端后续请求都需要携带cookie,供服务器识别身份。
产生过程:
1.客户端第一次访问服务器,服务器并不认识这是谁,于是创建一组数据放到一个叫做'Set-Cookie'的字段里发送给客户端,数据格式为'key=value'
2.客户端收到Set-Cookie字段的数据后,将数据保存到浏览器本地,下次请求时会自动将这个'key=value'放到cookie中发送到服务器
3.服务器收到请求后,就可以根据cookie字段中的值识别其身份,并提供服务。
分析
作为一名测试,一听就知道,这种放在客户端的数据肯定不安全,有可能被拦截并恶意使用,所以cookie用来保存一些不重要的信息,比如我们常见的记住用户名、浏览记录等。
拓展
那么cookie具体是存放在哪里呢?
以chrome为例,右上角点击‘...’,选择设置,点击左侧隐私设置和安全性,然后选择Cookie及其他网站数据,最后点击查看所有 Cookie 和网站数据
在不信任的环境下可以清除这里面的数据。
也可以通过F12查看我们当前网页存的cookie数据,以我自己的csdn博客为例
cookie数据有失效时间,看expire值。
session
- 一句话概括:session就是一个会话信息。保存在服务器上,客户端每次请求时带着sessionID(一般放在cookie里)即可。
产生过程
1.客户端访问服务器
2.服务器收到后生成一个sessionID发送给客户端,同时,服务器也把sessionID和对应的用户信息、操作记录等记录在服务器上(记录方式有很多,文件、数据库、内存都可以)。
3.客户端再次访问服务器时,会带着包含sessionID的cookie
4.服务器再次收到请求,发现cookie里有sessionID,然后去之前自己记录的信息找这个sessionID,找到后就可以知道该sessionID对应的用户信息、操作记录等信息。
5.客户端退出,则会话结束,session失效(但不绝对),所以服务器也为session设置了一个失效时间,默认为30分钟。
分析
session相对于cookie来说更安全,所以一些重要信息会存放在session中。但session会在一定时间内(默认半小时)保存在服务器上,当访问增多,会比较占用你服务器的性能。
session还有一个最突出的缺陷就是可拓展性差,比如服务器有两台机器,我通过机器A登录了系统,那么我的信息,也就是session就会保存在机器A上,但如果我下次的请求发到了机器B上怎么办?机器B上可没有存我的sessionID。
虽然大家也研究出来了一些应对办法,但都很麻烦且不能算完美解决(主要是我看不太懂,不过在学习接口测试前期,了解session的工作机制及其优缺点就暂时够用)。
token(令牌)
一句话概括:用户登录成功后,服务器用一堆复杂的数据加算法进行加密并签名后,返回一个token给客户端,作为客户端的唯一身份标识,客户端后续请求带着这个token即可。
产生过程
1.用户通过用户名和密码进行登录
2.服务器验证后,根据算法生成token返回给客户端,同时给数据库和Redis里关联token和用户信息
3.客户端收到token并保存,再次发送请求时把token放到http的请求头里。
4.服务器查询数据库和Redis,验证(解密)token,通过则返回数据
分析
token作为目前比较常用的登录验证方式, 我理解的其最明显优势:
1.无状态。token放到http的头里,相当于无状态访问,服务器不用存数据,只需要验证token,相当于用token的解密时间换取session的存储空间。
2.安全。服务器生成token时会用到各种算法进行加密/签名,且这套算法只有他自己知道,听起来就比前边两种安全多了。而且我们在登录的时候可以带上一些参数(比如设备ID、mac地址)发送给服务器用来加密,服务器解析token时如果这些参数的值发生变化了,就会验证不通过,这样就保证了每一个设备拥有了一个唯一的会话。
token是有时效的,一段时间之后用户就需要重新验证。
3.可拓展性。支持跨域访问和跨平台(比如支持移动设备)访问,在不同的服务器上,只要token校验规则相同,就可以请求到数据和资源。
思考
最后,通过一个生活中的例子加强对三者的理解:
比如你去洗浴消费,你就相当于客户端,洗浴中心相当于服务器。
你来到前台说要洗澡(登录成功),这时会给你个手牌(token)作为你身份认证标识,进去洗澡、搓澡、打盐(这些服务会记在你的手牌号上并通知前台)一通享受后,出来结账,前台会通过你的手牌号码(sessionID)查一下你进行了哪些服务,结完账,临走前洗浴中心送了你一张打折券(cookie),下次来别忘了带(存你本地了),见券打8折。
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】