JWT:优缺点和适合场景。

JWT(JSON Web Token)与Session的主要区别在于状态存储位置。JWT将用户信息编码在令牌中,存储在客户端,适合分布式系统且无状态;而Session存储在服务器端,相对更安全。JWT优点包括可扩展性和无状态,但其一次性、安全性及性能问题使其不适合长期会话管理。适合JWT的场景如一次性验证,如邮箱激活。相反,对于需要会话管理和续签的场景,Session可能是更好的选择。
摘要由CSDN通过智能技术生成

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

JWT的优点

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

JWT的缺点

安全性

由于jwt的payload是使用base64编码的,并没有加密,因此jwt中不能存储敏感数据。而session的信息是存在服务端的,相对来说更安全。

性能

jwt太长。由于是无状态使用JWT,所有的数据都被放到JWT里,如果还要进行一些数据交换,那载荷会更大,经过编码之后导致jwt非常长,cookie的限制大小一般是4k,cookie很可能放不下,所以jwt一般放在local storage里面。并且用户在系统中的每一次http请求都会把jwt携带在Header里面,http请求的Header可能比Body还要大。而sessionId只是很短的一个字符串,因此使用jwt的http请求比使用session的开销大得多。

一次性

无状态是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的场景

  • 有效期短
  • 只希望被使用一次

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

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

JWT(JSON Web Token)和 CSRF token(Cross-Site Request Forgery token)都是常见的安全机制,但它们的作用有所不同。 - JWT 主要用于认证和授权,它是一种基于 JSON 的开放标准,用于在客户端和服务器之间传递安全声明。JWT 通常包含用户身份信息、访问权限等信息,用于验证用户身份和控制用户权限,从而保证数据的安全性和完整性。 - CSRF token 主要用于防止跨站点请求伪造攻击,它是一种随机生成的 token,用于验证用户提交的请求是否合法。CSRF token 通常存储在用户的会话中,当用户提交表单或发出请求时,服务器会将 token 作为隐藏表单字段或请求头信息返回给客户端,客户端再将其作为表单提交或请求头信息一起发送到服务器端进行验证。 它们的优缺点如下: - JWT 的优点是可以在多个应用程序之间共享,由于 JWT 包含了用户身份信息和访问权限等信息,因此可以减少对服务器的重复查询和验证,提高应用程序的性能。但是,如果 JWT 被劫持或篡改,那么攻击者就可以冒充用户进行访问,造成安全风险。 - CSRF token 的优点是可以有效防止跨站点请求伪造攻击,保证用户提交的请求都是合法的,从而保护用户的安全。但是,CSRF token 需要将 token 存储在用户的会话中,如果会话被劫持或泄露,那么攻击者就可以使用该 token 进行攻击,造成安全风险。 综上所述,JWT 和 CSRF token 都是常见的安全机制,应用场景不同,具有各自的优缺点。在实际开发中,应根据具体场景选择合适的安全机制,以保证应用程序的安全性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值