每月一争, 为什么 JWT 这么多诟病, 什么下线设备登录 JWT 不是很容易解决吗?

查看 65|回复 4
作者:seth19960929   
JWT 的基本就不再过多阐述
思考的问题前提: 比如我们面对一个千万级用户的系统.
* 客户端需要和服务端交互, 假设 50% 的接口需要校验
* 10% 的接口需要获取个人信息
  • 如果是 token 那么代表着 50% 的流量都需要去查 db(任何 db 都可以)
  • 如果用 jwt 我可以减少到 10%, 甚至更少

    至于常见的 JWT 诟病解决方案

  • 两个小时没操作自动掉线
  • 分钟级别过期 access_token, 2h 过期 refresh_token, 完全可以做到

  • 黑名单, 强制下线功能
  • 分钟即被过期 access_token, token 里包含信息 {uid: xxxx, token_version: xxx}
  • 修改密码, 或者强制下线, 修改 db 里的 token_version
  • 当要刷新 token 的时候, 校验客户端 token 里的 token_version 是否等于 db 里的 token_version, 不等于强制下线.(是在每一次去校验还是在刷新 token 的时候去校验都可以)

  • 单台设备下线, 这个我认为是业务的逻辑
  • 分钟即被过期 access_token, token 里包含信息 {uid: xxxx, device_id: xxx}
  • 当要刷新 token 的时候, 校验客户端黑名单 db 里是否包含这个 device_id


    为什么要用 JWT ?
  • 使用 token 会有千万级用户请求 * (存 token + 查 token redis)... 用户名,xxx 存储,

    下线, 黑名单为什么不直接存储 token ?
  • token 可能千万级别, 但是黑名单保守估计不会超过 1w, 并且我可以把黑名单 token 有效期设置成 refres_token 的有效期(极大的减少了黑名单 token 的数量), 这样子当黑名单过期了, 那么 refresh_token 也不能再使用了(如果去颁发, 在黑名单中也颁发不了)
  • 如果一个用户可能登录 5 个设备, 那么存储的 token 量就是 1000w * 5, 而 jwt 就是 0 ~ 黑名单数量

    token, 黑名单, jwt, 过期

  • seth19960929
    OP
      
    还有 access_token 一个就够了, 为什么还要有 refresh_token, 除了官方说的安全之外, 就是可以作为两个时间点去使用.
    access_token 每次都要校验, 可以简单的校验, refresh_token 使用的频次比较少, 这时候可以做更完整的校验.
    LeegoYih   
    用了 JWT 还要存 token 到服务端,每次还要查版本号和黑名单,不是脱裤子放屁吗?
    用户权限之类的更新了怎么办?难道让用户退出重新登录一遍吗?
    查一次缓存就能解决的事情,不要太小看 Redis 的性能了。
    而且 JWT 不是 100%安全的: https://github.com/yihleego/jwtcrack
    oldshensheep   
    你这个都依赖 **分钟级别过期 access_token**
    你加个 token_version 那每次刷新 jwt 就要查询数据库,而且你刷新的非常频繁,这不又和原来一样
    同样的还有检查 device_id 要查询数据库
    giter   
    我选择把 accessToken 与 refreshToken 存在 localStorage 中。既然要 JWT ,那就贯彻到底,给服务端彻底减负。
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部