jwt的优缺点和适用场景

硅谷探秘者 算法基础 107 0 0

基于session和基于jwt的方式的主要区别就是用户的状态保存的位置,session是保存在服务端的,而jwt是保存在客户端的。

JWT的优点:

  1. 可扩展性好 应用程序分布式部署的情况下,session需要做多机数据共享,通常可以存在数据库或者redis里面。而jwt不需要。
  2. 无状态 jwt不在服务端存储任何状态。RESTful API的原则之一是无状态,发出请求时,总会返回带有参数的响应,不会产生附加影响。用户的认证状态引入这种附加影响,这破坏了这一原则。另外jwt的载荷中可以存储一些常用信息,用于交换信息,有效地使用 JWT,可以降低服务器查询数据库的次数。

JWT的缺点:

  1. 安全性,由于jwt的payload是使用base64编码的,并没有加密,因此jwt中不能存储敏感数据。而session的信息是存在服务端的,相对来说更安全。
  2. 性能,jwt太长。由于是无状态使用JWT,所有的数据都被放到JWT里,如果还要进行一些数据交换,那载荷会更大,经过编码之后导致jwt非常长,cookie的限制大小一般是4k,cookie很可能放不下,所以jwt一般放在local storage里面。并且用户在系统中的每一次http请求都会把jwt携带在Header里面,http请求的Header可能比Body还要大。而sessionId只是很短的一个字符串,因此使用jwt的http请求比使用session的开销大得多。
  3. .一次性,无状态是jwt的特点,但也导致了这个问题,jwt是一次性的。想修改里面的内容,就必须签发一个新的jwt。

(1)无法废弃 通过上面jwt的验证机制可以看出来,一旦签发一个jwt,在到期之前就会始终有效,无法中途废弃。例如你在payload中存储了一些信息,当信息需要更新时,则重新签发一个JWT,但是由于旧的JWT还没过期,拿着这个旧的JWT依旧可以登录,那登录后服务端从JWT中拿到的信息就是过时的。为了解决这个问题,我们就需要在服务端部署额外的逻辑,例如设置一个黑名单,一旦签发了新的jwt,那么旧的就加入黑名单(比如存到redis里面),避免被再次使用。

(2)续签 如果你使用jwt做会话管理,传统的cookie续签方案一般都是框架自带的,session有效期30分钟,30分钟内如果有访问,有效期被刷新至30分钟。一样的道理,要改变jwt的有效时间,就要签发新的jwt。最简单的一种方式是每次请求刷新jwt,即每个http请求都返回一个新的jwt。这个方法不仅暴力不优雅,而且每次请求都要做jwt的加密解密,会带来性能问题。另一种方法是在redis中单独为每个jwt设置过期时间,每次访问时刷新jwt的过期时间。

可以看出想要破解jwt一次性的特性,就需要在服务端存储jwt的状态。但是引入 redis 之后,就把无状态的jwt硬生生变成了有状态了,违背了jwt的初衷。而且这个方案和session都差不多了。

适合使用JWT的场景:

  1. 有效期短
  2. 只希望被使用一次,比如,用户注册后发一封邮件让其激活账户,通常邮件中需要有一个链接,这个链接需要具备以下的特性:能够标识用户,该链接具有时效性(通常只允许几小时之内激活),不能被篡改以激活其他可能的账户,一次性的。这种场景就适合使用jwt。

而由于jwt具有一次性的特性。单点登录和会话管理非常不适合用jwt,如果在服务端部署额外的逻辑存储jwt的状态,那还不如使用session。基于session有很多成熟的框架可以开箱即用,但是用jwt还要自己实现逻辑。

 

猜你喜欢
工具 916 于分布式站登陆(SSO)JWT声明一般被来在身份提供者服务提供者间传递被认证户身份信息,以便于从资源服务器获取资源,也可以增加一些额外其它业务逻辑所必须声明信息,该tok
official 121 结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区情况):简单、高效:不于多处理机;只于操作系统内核进程,不户进程〈因为开/关中断指令只能运行
weblog 2929 什么是二叉树前驱节后继节?某节前驱节val值小于该节val值并且值是最大那个节。某节后继节val值大于该节val值并且值是最小那个节。下面给出一个二叉树节
数据结构与算法 496 prim(普里姆)算法求出。对于任何一个数据结构或算法,理解实现只是一个方面,更重要是要明白它范围或应,最小生成树算法非常广泛,例如:假设要在n个城市之间建立通信联络网,则连接n个
数据结构与算法 799 广度先搜索算法(dfs、深搜)java实现-数据结构算法邻接矩阵表示图之间关系如下图数据结构:则邻接矩阵表示为: privatestaticintmap[][]={ {0,3,6
数据结构与算法 835 上一篇:广度先搜索算法(bfs、广搜)java实现-数据结构算法邻接矩阵表示图之间关系如下图数据结构则邻接矩阵表示为: privatestaticintmap
official 128 /进程调度:于作业调度时,考虑是哪个作业先到达后备队列;于进程调度时,考虑是哪个进程先到达就绪队列。是否可抢占?:非抢占式算法:公平、算法实现简单:排在长作业(进程)后面短作
java基础 3242 待队列变为非空。2.阻塞队列:阻塞队列常于生产者消费者,生产者是向队列里添加元素线程,消费者是从队列里取元素线程。简而言之,阻塞队列是生产者来存放元素、消费者获取元素容器。3
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo
目录