常见的鉴权方式有两种,一种是基于session,另一种是基于token方式的鉴权,我们来浅谈一下两种 鉴权方式的区别 。
两种鉴权方式对比session
- 安全性:session是基于cookie进行用户识别的,cookie如果被截获,用户很容易受到跨站请求伪造的攻击 。
- 扩展性:session是有状态的,是具有IP黏贴性和有中心化特性的,在分布式环境下,虽然每台服务器业务逻辑一样,但是session是保存在各个服务器中的,而且每个服务器内存是不共享的,如果使用session去实现分布式部署的话,需要使用其他的一些技术手段去实现,比如spring session,将session保存在第三方服务中,比如redis,这样一旦第三方服务出现问题,整个验权系统就会奔溃,在电商系统及高并发系统中的集群化处理显然是不合适的 。
- 抗压能力:通常session是存储在内存中的,每个用户通过认证后都会将session存储在服务器内存中,当用户量增大的情况下服务器的压力也随之增大 。
- 安全性:浏览器会将接收到的token值存储在Local Storage中,(通过js代码写入Local Storage,通过js获取,并不会像cookie一样自动携带)
- 扩展性:token是无状态的,是去中心化的,在分布式环境下,各个服务器中的服务只对token进行数据查询,它不需要在服务端保留用户信息或者会话信息,这意味着用户不需要考虑登录的是哪一台服务器,高效的解决了session扩展性的弊端 。
- 抗压能力:token与session的不同主要在认证成功后,会对当前用户数据进行加密,生成一个加密字符串token,返还给客户端(服务器端并不进行保存)
JAVAshop电商系统 采用的是oauth方式的鉴权标准 。我们以系统的应用为例来介绍oauth的方案 。
文章插图
1. 登录
服务端校验密码,成功后返回access_token和refresh_token,客户端记录上述token 。
2. 访问API
在访问API之前解析access_token,并且查看是否过期,如果不过 期则请求API,如果过期,则要刷新令牌,在请求API 。
3. 刷新token
携带有效期的refresh_token换回有效token,如果refresh_token过期,则需要用户重新登录 。
4. 注销
请求注销api,服务器端和客户端应同时删除token的存储 。
文章插图
【基于token机制鉴权架构】
1. 客户端请求API
携带access_token信息,如果生成环境不会直接携带access_token,会使用加密后的签名校验 。祥见以下防重放机制 。
2. 获取token
根据环境不同而有不同的获取token方式 。
3. 解析token
通过JWT工具将token解析 。
4. 由redis读取token
根据uid拼接key读取access_token, 如果不存在这个用户的token说明已经登出 。
5. 验证token
判断次token是否属于此uid,判断token是否过期,如果过期则进行以下刷新token的流程 。
6. 注入权限
如果token验证成功,根据user信息生成权限注入到spring安全上下文中 。
刷新token流程
文章插图
1. 客户端请求API
携带refresh_token,如果是生产环境不会直接携带refresh_token信息,详见以下防重放攻击 。
2. 获取token
根据环境不同而有不同的获取token方式 。
3. 解析token
通过JWT工具将token解析 。
4. token读取
根据uid拼接key读取出access_token,如果不存在这个用户的token说明用户已经登出 。
5. 验证token
判断此token是否属于此uid,判断token是否已经过期,如果过期,则返回refresh_token过期错误,此时用户需要重新登录 。
6. 刷新token
如果refresh_token 验证成功,则重新生成access_token和refresh_token,上述有效期以当前时间向后计算,替换此用户在redis中的token,并将token返回给客户端 。
防重放机制
文章插图
一、 参数的读取
1. 在生产环境时,不能直接传递token,而是要传递签名数据,服务器端验签后由Redis中获取签名 。
推荐阅读
- Captcha验证码机制已被网络钓鱼骇客所利用
- Java类的加载机制
- mysql数据库 InnoDB崩溃恢复机制总结
- Java反射机制是开发第三方架构的基础
- 基于centos7系统安装部署sendmail邮箱服务
- Redis主从复制机制详解
- 独家揭秘百度信息流广告算法机制
- python基于SMTP发送邮件
- 抖音,头条这类自媒体的推荐机制是什么?大数据如何给你贴标签?
- 基于DNS隐蔽信道的攻击与检测