阿里面试官:是否使用过jwt
回答:(前面第一次回答sso的认证和鉴权)
要考虑2个问题的处理
1.注销登录等场景下 token 还有效与之类似的具体相关场景有:
退出登录;
修改密码;
服务端修改了某个用户具有的权限或者角色;
用户的帐户被删除/暂停。
用户由管理员注销;
2.token 的续约
token 有效期一般都建议设置半天 (60*12min),
token 有效期设置到半夜 :这种方案是一种折衷的方案,保证了大部分用户白天可以正常登录,适用于对安全性要求不高的系统。但是 token 过期后如何认证,如何实现动态刷新 token,避免用户经常需要重新登录?传统的 Session 认证中一般的做法:
假如 session 的有效期30分钟,如果 30 分钟内用户有访问,就把 session 有效期被延长30分钟。
一、 去中心化的JWT token 优点:
1. 去中心化,便于分布式系统使用
-
基本信息可以直接放在token中。 username,nickname,role
-
功能权限信息可以直接放在token中。用bit位表示用户所具有的功能权限。
缺点:token本身是无状态
token 自身包含了身份验证所需要的所有信息,使得我们的服务器不需要存储 Session 信息,这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。但是,也正是由于 token 的无状态,也导致了它最大的缺点:当后端在token 有效期内废弃一个 token 或者更改它的权限的话,不会立即生效,一般需要等到有效期过后才可以。另外,当用户 Logout 的话,token 也还有效。除非,我们在后端增加额外的处理逻辑。
二、 中心化的 redis 等 媒介记录token
优点:服务端可以主动让token失效
缺点:每次都要进行redis查询。占用redis存储空间。
三、 可以优化的点
1. Jwt Token中,增加TokenId字段。
2. 将TokenId字段存储在redis中,用来让服务端可以主动控制token失效
3. 牺牲了JWT去中心化的特点。
4. 使用非对称加密。颁发token的认证服务器存储私钥:私钥生成签名。其他业务系统存储公钥:公钥验证签名。
总结:
JWT 最适合的场景是不需要服务端保存用户状态的场景。
比如如果考虑到 token 注销和 token 续签的场景话,没有特别好的解决方案(加一个网关token记录存在redis等其它媒介上)