专业的编程技术博客社区

网站首页 > 博客文章 正文

JWT身份认证的优缺点?以及常见问题的解决?

baijin 2024-10-11 10:44:46 博客文章 5 ℃ 0 评论


Token认证的优势

相比较于Session认证来讲,使用Token作为身份认证标识主要有如下的几个优势。

无状态

在使用Token的时候,由于它自身就包含了认证所需的各种信息,这样我们就不需要再服务器端去存储Session的信息,这样一来,可以减轻服务器端的压力。同样也是由于Token的无状态性质,也导致了它最大的缺点就是,后端在一个Token的有效期内删除了Token或者是修改了其权限,那么这个删除操作或者是权限修改操作是无法立即生效,一般需要重新授权,或者是等到有效期过了之后才会生效。还有一种情况就是用户完成了注销退出的操作,但是Token还是有效的,这就需要我们在处理后端业务的时候对相关逻辑进行处理。

避免CSRF攻击

CSRF攻击(Cross Site Request Forgery)跨站请求伪造攻击。相比较于SQL注入、XSS等攻击方式,CSRF不足为奇。但是却也是每个系统需要去考虑的问题。

那么到底什么是CSRF攻击呢?

简单来讲就是使用你的身份去发送一些不友好的请求,导致服务器瘫痪,或者是无法服务。

为什么Token认证不会存在问题呢?

简单来讲使用JWT生成了一个Token之后,一般情况下浏览器端会将其放到local storage中,然后在之后的请求中加入这个Token,这样就不会出现CSRF漏洞的情况。因为当你点击一个非法请求发送到服务器端,因为没有携带Token,服务器端会直接判定这个请求是违法的请求,而不予响应。这样就可以有效的防止CSRF攻击了。

但是这种操作还是有可能会出现XSS攻击,为了避免XSS攻击,可以将Token存储在标记为httpOnly的cookie中,这种情况下使用了cookie,所以要对CSRF攻击做出保护。

适合移动端的应用

使用Session做为身份认证的话,一般情况下Session信息会被存储在服务端,而且还会依赖于客户端的Cookie。所以这种操作不适合移动端应用的存储。

如果以Token作为移动端身份认证的话,那么就不会存在这个问题,因为Token可以存储在移动端任意可以用来存储的位置,并且Token一旦生成就可以跨语言使用了。

可以用来完成单点登录

如果使用Session来完成身份认证的话,那么需要实现单点登录就需要把Session的信息保存到另外的电脑上,并且还会出现Cookie跨域请求的问题。使用Token认证的话则不会出现这种情况。因为Token一直被客户端持有,所以认证成功之后,服务端只需要完成对于Token的续约即可。

Token认证常见问题以及解决方案

在用户完成注销的情况下,Token仍然有效

这种情况一般出现在如下的一些场景中

  • 用户主动退出登录操作
  • 用户修改密码的时候
  • 用户修改了权限或者是用户角色的时候
  • 用户账户被后端限制登录的时候
  • 用户账户被管理删除的时候

上述这些问题在Session中都不会存在,因为在Session方式中,遇到这种情况服务端一般会删除Session,所以用户操作会被拦截。但是在Token操作中则不好处理,因为Token的有效期不过的话所有的操作都是可以进行的。如果后端没有对应的操作的话,就会导致在Token失效之前,用户还是持有原来的权限进行操作。可以由如下的操作来避免这种问题的出现

  • 将Token存储到数据库中:使用Redis来完成Token的存储。如果Token过期之后就从Redis进行删除,但是如果每次请求都需要查库的话就违背了JWT的无状态原则,这就需要开发者根据自己的需求进行设计了。

Token续约问题

Token一般不会是长期有效的,所以当Token认证过期之后,如何对其进行动态刷新就成了需要我们去解决的问题?

在Session中的做法是如果Session的有效期是30分钟,如果30分钟到了就把Session的有效期延长30分钟就可以了。

在Token中我们也可以采用这种方式来做。

  • 与Session方式一样,这种操作几乎满足大部分的请求场景,如果服务器发现Token马上过期了,就对Token有效期进行续约,如果过期了就重新返回新的Token来保证用户的登录状态。
  • 每次请求都刷新新的Token,这种方式比较简单,但是系统开销比较大
  • Token过期时间统一设置到晚上,白天使用的时候不影响用户。
  • 返回两个Token,一个是用来设置过期时间,另一个则是用来校验有效性。两个Token值都在本地存储,每次访问的时候,传入正常的Token,如果过期了就将校验有效性的To肯传入,如果有效就继续,如果无效就重新进行获取。

当然在实际操作过程中可能还有其他的解决方案,需要开发者根据具体的业务逻辑来做相应的处理。

总结

JWT适合的场景就是不需要再服务端保存用户状态的场景,如果要考虑到续约、登录、注销等操作的场景的话,就需要给Token利用缓存操作加上状态来保存用户信息。这就有点像是伪Session的实现方式。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表