您现于de位置乃:亚博 > 其他

亚博 2019-12-17 其他 99

JWTde优缺点以及如何去选择?


认证 / 授权

认证(Authentication):验证目标对象身份.比如 通过用户名和密码登录某个系统就乃认证.

授权(Authorization):给予通过验证de目标对象操作权限.

更简单地说:

认证解决了「您乃谁」de问题.
授权解决了「您能做什么」de问题.


对于1般deweb应用 我们知道 HTTP 乃无状态de 所以客户端和服务端需要解决de如何让之间de对话变得有状态.

例如只有乃登陆状态de用户才有权限调用某些接口 那么于用户登陆之后 需要记住该用户乃已经登陆de状态.(常见de方法乃使用 session 机制)


常见de session 模型乃这样工作de:

10096448-1004c3af75b0f930.webp.jpg

用户于浏览器登陆之后 服务端为用户生成唯1de session id 存储于服务端de存储服务(例如 MySql, Redis)中该 session id 也同时返回给浏览器 以 SESSION_ID 为 KEY 存储于浏览器de cookie 中 如果用户再次访问该网站 cookie 里de SESSION_ID 会随着请求1同发往服务端服务端通过判断 SESSION_ID 乃否已经于 Redis 中判断用户乃否处于登陆状态

理论上来说 JWT 机制可以取代 session 机制.用户不需要提前进行登陆 后端也不需要 Redis 记录用户de登陆信息.客户端de本地保存1份合法de JWT, 当用户需要调用接口时 附带上该合法de JWT 每1次调用接口 后端都使用请求中附带de JWT 做1次合法性de验证.

这样也间接达到了认证用户de目de 然而JWT 真de能取代 session 机制吗?这么做有哪些好处和坏处?

JWT de目de不乃为了隐藏或者保密数据 而乃为了确保数据确实来自被授权de人创建de(不被篡改)

当您拿到 JWT 时候 您完全可以于没有 secret de情况下解码出 header 和 payload 因为 header 和 payload 只乃经过了 base64 编码(encode)而已 编码de目de于于利于数据结构de传输.虽然创建 signature de过程近似于加密 (encrypt) 但本质其实乃1种签名 (sign) de行为 用于保证数据de完整性 实际上也并且并没有加密任何数据


JWT于web应用中de缺陷

缺点1: 无法满足注销场景

传统de session+cookie 方案用户点击注销 服务端清空 session 即可 因为状态保存于服务端.但 jwt de方案就比较难办了 因为 jwt 乃无状态de 服务端通过计算来校验有效性.没有存储起来 所以即使客户端删除了 jwt 但乃该 jwt 还乃于有效期内 只不过处于1个游离状态.

缺点2: 无法满足修改密码场景

修改密码则略微有些不同 假设号被到了 修改密码(乃用户密码 不乃 jwt de secret)之后 盗号者于原 jwt 有效期之内依旧可以继续访问系统 所以仅仅清空 cookie 自然乃不够de 这时 需要强制性de修改 secret.

缺点2: 无法满足token续签场景

我们知道微信只要您每天使用乃不需要重新登录de 因为有token续签 因为传统de cookie 续签方案1般都乃框架自带de session 有效期 30 分钟 30 分钟内如果有访问 session 有效期被刷新至 30 分钟.但乃 jwt 本身de payload 之中也有1个 exp 过期时间参数 来代表1个 jwt de时效性 而 jwt 想延期这个 exp 就有点身不由己了 因为 payload 乃参与签名de 1旦过期时间被修改 整个 jwt 串就变了 jwt de特性天然不支持续签!


JWT应用场景

1次性验证

比如用户注册后需要发1封邮件让其激活账户 通常邮件中需要有1个链接 这个链接需要具备以下de特性:能够标识用户 该链接具有时效性(通常只允许几小时之内激活) 不能被篡改以激活其他可能de账户

这种场景就和 jwt de特性非常贴近 jwt de payload 中固定de参数:iss 签发者和 exp 过期时间正乃为其做准备de.

总结

Web 应用中使用 JWT 乃让应用变得更复杂了.于 web 应用中 绝大多数情况下 传统de cookie-session 机制工作得更好.jwt 适合做简单de restful api 认证 颁发1个固定有效期de jwt 降低 jwt 暴露de风险 不要对 jwt 做服务端de状态管理 这样才能体现出 jwt 无状态de优势.


评论