jwt怎么让token在用户退出登录失效?

12,292 阅读3分钟

什么是JWT?

JWT是目前最流行的跨域认证解决方案,是一种基于Token的认证授权机制。JWT自身包含了身份验证所需要的所有信息。因此服务端不用像Session一样需要存储信息。增加了系统的可用性和伸缩性。JWT更符合设计RESTful API时的无状态原则。同时JWT可以有效避免CSRF攻击,因为使用JWT进行身份验证的过程是不会涉及Cookie的。

JWT由什么组成

JWT主要由三个部分的Base64编码字符串组成 分别是:

  • Header:描述JWT的元数据,定义了生成签名的算法以及Token的类型
  • Payload: 用来存放实际需要传递的数据。包含JWT相关数据比如JWT的签发时间、主题、过期时间以及私有数据比如用户名、ID等信息。但是我们不要把重要信息存放在Payload中,因为Payload默认是不加密的。
  • Signature(签名):服务器通过Payload、Header和一个密钥并通过签名算法生成。

1.客户端清除 token

登出时在浏览器或者 APP 客户端清除 token。这种方法比较简单,无需后端操作。

但不经过服务器验证的客户端清除 token 操作会造成登出后使用原 token 仍有访问权限的问题,针对该问题,token 的过期时间可以设置尽可能短,以减少原 token 的有效的时间。

2.白名单

在 Redis 维护有效的 token,在 token 生成后就存入 Redis,登出时从 Redis 删除该 token。在验证 token 之前先查询白名单中是否有该 token,如果有则表明是有效的,然后进入解析 token 的逻辑。有点像有状态的 session 的味道了。

为了避免白名单不断变大,可以按照 jwt 中的过期时间来设置存入 Redis 的 token 的过期时间。

3.黑名单

在 Redis 维护登出的无效 token,在验证 token 之前先查询黑名单中是否有该 token,如果没有表明是有效的,然后进入解析 token 的逻辑。多端登录登出redis可以使用set集合进行存储,value为不同设备的token

为了避免黑名单不断变大, 可以按照 jwt 中的过期时间来设置存入 Redis 的 token 的过期时间。

一般黑名单会比白名单占用的内存小。

修改密码

黑名单中key为用户id,修改密码后,所有该用户id的key存放的value都失效。

登出操作

如果是多端登录,将该用户的这个设备的token失效

转载:www.zhihu.com/question/39…

如何防止 JWT 被篡改?

对于JWT而言,即使JWT被泄露或者捕获,黑客也没有办法篡改TOKEN.因为服务端拿到了JWT会解析出其中的Header、Payload、以及Signature,通过密钥再次生成一个Signature与JWT中的Signature对比。所以黑客只要不知道我们的密钥是没有办法伪造Token的。

如何防止被抓包伪造获取token

最重要的是要防被抓包,其他的都只能加大被伪造的难度,并不能完全避免被“伪造”。

毕竟,无论是 cookie 或 session,或 token ,客户端都要有一个登录凭证,后端只能认这个凭证,如果凭证都被别人拿走了,那后端也没有什么办法。

当然,你可以通过多个认证方式结合,加大伪造的难度。
比如:
cookie 中的字段意义不要太容易被看懂,多放几个混淆一下,有些是请求的参数,有些是认证身份的;
不只判断 cookie,还要判断客户端是不是同一个,ip是不是同一个;
不只 cookie,localStorge 和 sessionStorage 也放一些认证的字段; \