为什么说不建议用JWT作为Session系统?
什么是JWT
JWT,全名JSON Web Token是一个开放标准,它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。
![51f10f37000e31998d45438cd5e74598.png](https://i-blog.csdnimg.cn/blog_migrate/19241af4bbd47c83245bf1b42a7f3088.jpeg)
重要问题:安全性
作为安全级别要求很高的Session认证,JWT token的无需持久化,随取随用的特性,或是有人说的优势,其实也是很严重的列劣势:安全问题。
通过JWT token,你可以知道系统给你加密的是一串什么内容,通过jwt.io的解密,就可以看到内容。
![a0bbab5001a90c7e25d025c643324ca1.png](https://i-blog.csdnimg.cn/blog_migrate/dcdf24bddcda006b0ad8deff54f3ab7c.jpeg)
若对外包装的sub是一个有规律的信息,比如递增的用户编号(当然这本是一个大坑),通过这套算法,和尝试性的sub,可以套出可以通过JWT认证通过token,从而盗用系统用户。尽管可以在开始,初始化一个通过hmacShaKey加密的secretkey,而一旦这个key泄露,系统用户几乎就透明了。
![b79aab82f13b85654da780ab33497bd1.png](https://i-blog.csdnimg.cn/blog_migrate/b26a22d89fd830ecef5c83aa3a302c95.jpeg)
那既然即使被人套到了,也不至于透明,不是可以销毁吗?这就是JWT安全上又一个麻烦所在,它无法被单独销毁,而且不管你在什么终端使用,只要认证信息能匹配上算法结果,就会通过,想及时止损,都非常麻烦。
致命缺点:无法自动续期
JWT的过期时间,通过setExpiration来设置,设好后就不可变更了,你想实现“用户操作后,自动续期”的需求,办不到。无法主动销毁,还不能设置续期,这在Session场景下是很难受的,且不说限制单点登录、单平台登录等更多细节问题。
什么情况下用
天生我材必有用,JWT名声赫赫,自然有它可用之处。具体可以做什么用,了解了它的特性后,自己做些创新是最好的。这里推荐在需要一次性的授权令牌场景时,使用JWT是很合适的。