原因:前后端分离
以前的传统模式下,后台对应的客户端就是浏览器,就可以使用session+cookies的方式实现登录,但是在前后分离的情况下,后端只负责通过暴露的RestApi提供数据,而页面的渲染、路由都由前端完成。因为rest是无状态的,因此也就不会有session记录到服务器端。
优点
JWT的优点是服务端生成之后就不需要在维护JWT,只需要解析即可,省去分布式session方案中需要去数据库查询的时间。
缺点
不易实现JWT的主动失效。
要改变某个用户权限时数据库中用户的权限很容易改变,下次登录获得的JWT也是配置后的,还要解决的就是之前已经发放的失效前权限的JWT。
失效指的是加入管理员不想让某个持有JWT的用户继续访问资源,要让JWT失效不能再访问资源。
解决方案
将有效时间调小
但是即使过小会增加登陆的流程相当于一直在做登录操作。
维护JWT白名单
每个JWT发放都记录在数据库,这种和保存sessionid差不多。。
失效就将某个用户的JWT移除白名单。
维护JWT黑名单
失效就将该用户的JWT移入黑名单,直到过期再删除。
维护JWT版本号
数据库中记录用户所持有id的最新值,每次生成JWT时版本号自增。验证时先比较JWT版本号与数据库中维护的最新版本号是否相等,小于则失效。