基于jwt token机制鉴权架构

常见的鉴权方式有两种,一种是基于session,另一种是基于token方式的鉴权,我们来浅谈一下两种 鉴权方式的区别。

两种鉴权方式对比

session

  1. 安全性:session是基于cookie进行用户识别的,cookie如果被截获,用户很容易受到跨站请求伪造的攻击。
  2. 扩展性:session是有状态的,是具有IP黏贴性和有中心化特性的,在分布式环境下,虽然每台服务器业务逻辑一样,但是session是保存在各个服务器中的,而且每个服务器内存是不共享的,如果使用session去实现分布式部署的话,需要使用其他的一些技术手段去实现,比如spring session,将session保存在第三方服务中,比如redis,这样一旦第三方服务出现问题,整个验权系统就会奔溃,在电商系统及高并发系统中的集群化处理显然是不合适的。
  3. 抗压能力:通常session是存储在内存中的,每个用户通过认证后都会将session存储在服务器内存中,当用户量增大的情况下服务器的压力也随之增大。

token

  1. 安全性:浏览器会将接收到的token值存储在Local Storage中,(通过js代码写入Local Storage,通过js获取,并不会像cookie一样自动携带)
  2. 扩展性:token是无状态的,是去中心化的,在分布式环境下,各个服务器中的服务只对token进行数据查询,它不需要在服务端保留用户信息或者会话信息,这意味着用户不需要考虑登录的是哪一台服务器,高效的解决了session扩展性的弊端。
  3. 抗压能力:token与session的不同主要在认证成功后,会对当前用户数据进行加密,生成一个加密字符串token,返还给客户端(服务器端并不进行保存)

基于token的鉴权方式

业界常用的授权标准有两种,一种是使用auth2,这种方式更适合于类似第三方授权登录,比如微信、微博、QQ信任登录业务。另一种是oauth,即第三方无需知道用户和密码就可以申请获得该资源的授权,更适用于对用户的权限校验并分配访问权限,比如常见的登录后分配可见资源(按钮、菜单等)类型网站。

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的存储。

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中获取签名。
2.如果是非生产环境,直接由header中读取token。
二、生产环境传递如下参数
memberid (用户id)
nonce(随机字串,6位)
timestamp(当前时间戳,到秒)
sign= md5( uid+ nonce + timestamp +token )
三、验证逻辑
1.验证时间戳
判断时间戳是否起过60s,大于60s则判别为重放攻击。

2.验证nonce
首先验证nonce在 reids中是否存在,如果存在,则判别为重放攻击,否则将nonce记录在redis中(key为:"nonce"+uid+"_"+nonce),失效时间为60s。
3.验证sign
md5( uid+ nonce + timestamp +token ) 验证是签名是否通过。
4.验证token
通过uid拿到token ,验证逻辑同验权流程。

当然在不同的业务场景下实现方案是多种多样的,仅以此方案抛砖引玉,供大家参考。

(0)

相关推荐

  • koa2实现jwt登录

    koa2实现jwt登录

  • 认证授权基础

    认证授权基础

  • Web开发应该学习的Token登录认证知识

    chrisghb Web开发 3天前 来自:简书,作者:chrisghb 链接:https://www.jianshu.com/p/a32634a5170c 基于 Cookie/Session 的认证 ...

  • Cookie、Session、Token 的区别

    首先我们来说一下认证(Authentication): 通俗的来说认证就是 验证当前用户的身份.例如,你上班打卡,为了防止你作弊,就需要你用到你的指纹来打卡,如果打卡系统里面的指纹和你的指纹匹配,那就 ...

  • drf—— 响聊聊cookie session token的演变

    一.会话保持 会话保持是指在负载均衡器上的一种机制,可以识别客户端与服务器之间交互过程的关连性,在作负载均衡的同时还保证一系列相关连的访问请求都会分配到一台机器上. 用人话来表述就是:在一次会话过程中 ...

  • 第 82 天:Python Web 开发之 JWT 简介

    在之前的课程中,介绍过 Flask-Login 框架,它是基于 Session 和 Cookie 技术来实现用户授权和验证的,不过 Session 有很多的局限性,这一节介绍一种基于 token 的验 ...

  • 前后端接口鉴权全解 Cookie/Session/Token 的区别

    今天 作者:ssshooter 不知不觉也写得比较长了,一次看不完建议收藏夹!本文主要解释与请求状态相关的术语(cookie.session.token)和几种常见登录的实现方式,希望大家看完本文后可 ...

  • 单体应用到分布式再到微服务,用户认证和授权机制的演进史

    Web应用和用户的身份验证息息相关,从单一服务器架构到分布式服务架构再到微服务架构,用户安全认证和授权的机制也一直在演进,下文对各个架构下的认证机制做个总结. 单一服务器架构 该架构下后端只有一台服务 ...

  • 接口鉴权之sign签名校验与JWT验证

    优质文章,第一时间送达 作者 |  那一片蓝海 来源 |  urlify.cn/FJjmqa 需求描述: 项目里的几个Webapi接口需要进行鉴权,同接口可被小程序或网页调用,小程序里没有用户登录的概 ...

  • 基于局部对比度机制的红外弱小目标检测算法

    0 引言 随着红外焦平面性能水平的不断提高,红外探测系统在军事和民用中得到了广泛的应用,尤其是在制导.预警等领域具有非常重要的应用价值[1].其中,能否及时准确地检测到远距离目标,是关系到能否有效地制 ...

  • 基于golang分布式爬虫系统的架构体系v1.0

    基于golang分布式爬虫系统的架构体系v1.0 一.什么是分布式系统 分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统.简单来说就是一群独立计算机 ...

  • 编程 | http 四种鉴权方式简介,未来可能还会出现第 5 种鉴权方式:全息生物验证

    因为 http 协议,它是一种无状态的协议,在服务器端并不知道客户的那一头,是谁在请求服务器.而服务器上的资源,有时候并不是向所有人开放的,而是仅对部分人开放的,在这种情况下,实现用户的登陆鉴权,就成 ...

  • 基于中央处理器的整车电子电器架构开发概览

    汽车行业的主战场-电子电器架构以及软件),以及电子电器架构的趋势.总体会是电子电器架构超中央化发展,那么这个中央化把物理件串联起来之后中央处理器如何分工?当前娱乐功能和安全功能如何确保?OTA如何升级 ...

  • ABP框架使用Mysql数据库,以及基于SQLServer创建Mysql数据库的架构和数据

    ABP默认的数据库是SQLServer,不过ABP框架底层是EF框架,因此也是很容易支持其他类型的数据库的,本篇随笔介绍在ABP框架使用Mysql数据库,以及基于SQLServer创建MySql数据库 ...

  • 基于JWT和CAS的SSO单点登录方案

    单点登录是一种比较流行的服务于企业业务整合的一种解决方案.单点登录(SSO:Single Sign On)的意思是:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.比如我们登录淘 ...

  • drf——基于jwt的多方式登录以及自定义多方式登录

    一.基于jwt的多方式登陆 1 手机号+密码 用户名+密码 邮箱+密码 2 流程分析(post请求): -路由:自动生成(推荐自动生成,自己手写也行) -视图类:ViewSet(ViewSetMixi ...