接口鉴权cookie、session和token

一、鉴权

1、鉴权是指验证用户是否拥有访问系统的权力------鉴定权限

二、为什么会有cookie、session和token

1、http是无状态协议
什么是无状态?就是说这一次请求和上一次请求是没有任何关系的,无法共享信息。好处是速度快。
2、互联网的兴起
以前Web基本上就是文档的浏览而已,作为服务器,不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议,给予响应即可,但是互联网兴起,各种各样的交互网站,是必须登陆才能进行一些操作,比如发帖需要记录发帖人,浏览记录等。那么所有的账号都是必须分开的。
3、cookie、session的加入
因为HTTP请求是无状态的,所以要解决共享信息的问题必须用其他手段,于是就有了会话标识(session id),当然session是基于cookie实现的。服务器为每个用户生成一个不一样的随机字符串,每次向服务器发起HTTP请求的时候,把这个字符串传给服务器。这样就能区分谁是谁了。
接口鉴权session的解决方案:完成登陆后,获取带有session信息的cookie,再次请求时加入。
4、session有啥缺点呢?
虽然session解决了共享信息的问题,但同时对于服务器带来了其它问题—资源开销。对于客户端来说session是非常好的,只需要cookie中存一个字符串就行了,但是服务器必须存储所有在线的用户session,那么这是很大一笔开销(CPU,内存),严重影响了服务器的性能。这时可以选择去拓展服务器做集群,但同时也出现分布式session问题,那么可以采用session粘滞或者session集中式管理(redis)来解决。
5、摆脱session,拥抱token
上述的解决方案都是围绕 session,那么能不能不用session来解决呢?session原理:
在这里插入图片描述
那么不用session如何确保数据是服务器生成的呢?怎么去验证呢?用户信息存在哪?于是有人想到了自己按照一定规则生成加密字符串,服务器只验证不存储,只要验证通过说明是自己生成的,用户信息存储在加密字符串中,这样性能、CORS(跨域资源共享)都能解决。这个加密字符串就是token。
接口鉴权token解决方案:完成登录之 后,获取到token 字符串,再次请求时加入。

三、cookie、session的区别

在这里插入图片描述
概念:
cookie:Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。由于Cookie是存放在客户端,是可见的,安全性就会很低。因此不建议将一些重要的信息放在cookie中。
session:Session 是存放在服务器端的,当浏览器 第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标识这个Session,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的Session。

区别:
cookie:客户端和服务端都能生成cookie,存放在客户端。存放一些不敏感的数据,数据类型只能是字符串(json)
session:服务端生成session,存放在服务端。可以存放任意数据,java中session可以存放任意对象。session必须依赖cookie实现。(session相当于锁,cookie相当于钥匙,所以要传回Session ID给客户端)

四、session和token的区别

在这里插入图片描述
token是一种自验证(相当于它包含有钥匙和锁,通过一种算法来验证这个钥匙和锁是否匹配,匹配则token有效)

token的结构
在这里插入图片描述
服务器生成token时就会把签名带上,其他服务在鉴权时,只需要把header和payload进行验证生成签名,最后签名一致则通过鉴权(数据(header+body)没有变化,算法也没有变化,结果就不会变)

session: 服务器生成、存储、验证,以cookie的方式传给客户端,客户端以同样的方式发送给服务端。session有状态。

token: 服务器生成、验证,以cookie或者请求头的方式传给客户端,客户端以同样的方式发送给服务端。token无状态。

发布了2 篇原创文章 · 获赞 0 · 访问量 148

猜你喜欢

转载自blog.csdn.net/qq_42359314/article/details/104069380