面试中被嘲笑Token放在Redis里?这把给我干沉默了...

面试中被嘲笑Token放在Redis里?这把给我干沉默了... 因公众号更改推送规则请点“在看”并加“星标”第一时间获取精彩技术分享点击关注#互联网架构师公众号领取架构师全套资料 都在这里0、2T架构师学习资料干货分上一篇2T架构师学习资料干货分享大家好我是互联网架构师面试被问登录认证怎么做你说Token 放 Redis 里。面试官笑了一下说你不懂 JWT 的无状态设计。这场景不少见。知乎上有人专门问过底下争了半天说的其实是同一件事选型没问题但你没说清楚为什么选。这篇文章把这件事说清楚从 JWT 是什么到放 Redis 的原因再到面试里怎么回答。JWT 到底是什么JWT 全称 JSON Web Token说白了就是一段字符串用点号分成三段Header、Payload、Signature。eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0. SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5cJWT的三段结构Header算法类型、Payload用户信息、Signature签名三部分Base64编码后用点号连接Header声明算法类型比如 HS256Payload存用户信息用户 ID、角色、过期时间。只是 Base64 编码不是加密——任何人拿到 token 都能解码看到内容密码绝对不能放Signature用 Header Payload 服务端密钥算出来的签名作用是防篡改整个验证流程JWT认证完整流程用户登录→服务端签发Token→客户端存储→请求时带上Token→服务端验签登录成功 → 服务端签发 Token → 客户端保存一般放 localStorage→ 每次请求在 Header 里带上Authorization: Bearer token→ 服务端验签从 Payload 取用户信息。全程不查数据库、不查 Redis自给自足。这就是无状态的意思。JWT无状态的代价四个致命场景无状态听起来很美上线后就知道了。场景一账号被盗无法立即踢人。Token 有效期 2 小时现在还剩 1 小时 45 分钟。怎么让它立刻失效纯 JWT 做不到——已签发的 token 在过期前一直有效。场景二封禁用户不生效。账号封了但手里的 token 还能用。场景三改密码不踢其他设备。用户改了密码想让其他设备全部失效。纯 JWT 做不到。场景四token 过期吞表单。用户填了 20 多分钟的表单点提交token 过期了整个内容全丢。这四个场景加在一起几乎是所有正经业务系统都会碰到的问题。为什么要把 Token 放 Redis解决上面这些问题最直接的方案是黑名单。用户被踢下线时把 token 加进黑名单。每次请求先查黑名单在里面就拒。黑名单存哪内存不行多台服务器不共享重启丢数据库太慢每个请求都查一次受不了Redis 最合适——查询不到 1ms分布式共享。// 退出登录时把 token 加入黑名单 public void logout(String token) { long expiration jwtUtil.getExpiration(token); long ttl expiration - System.currentTimeMillis(); if (ttl 0) { redisTemplate.opsForValue().set( blacklist: token, 1, ttl, TimeUnit.MILLISECONDS ); } } // 验证 token 时先查黑名单 public boolean isTokenValid(String token) { if (redisTemplate.hasKey(blacklist: token)) { returnfalse; } return jwtUtil.verify(token); }Redis 只存已失效的 token平时没什么写入查询也快。还有更彻底的方案直接把 token 存 Redis每次验证都去 Redis 查。这和传统 Session 没太大区别只是借了 JWT 格式当 Session ID 用。黑名单 vs 白名单两种方案的本质区别方案存什么查几次 Redis能否主动吊销是否无状态纯 JWT不存0 次不能是JWT黑名单存失效的 token1 次能不完全是token 存 Redis白名单存所有 token1 次能否黑名单相对轻量正常请求不写 Redis只有踢人时才写多数业务选这个。白名单控制力更强能做限制同时在线设备数、实时查看在线状态代价是每次请求都依赖 Redis。双 Token 续期方案Token 到期了用户正在操作怎么办AccessToken有效期短30 分钟做实际鉴权RefreshToken有效期长7 天只用来换 AccessTokenAccessToken 过期前端用 RefreshToken 换新的对用户无感。RefreshToken 存 Redis用户改密码就删掉自动让他下次操作时重新登录。Redis 本身可靠吗有人担心引入单点故障。Redis 的高可用方案跑了十几年Sentinel哨兵模式主节点挂了自动选新主Cluster集群模式数据分片横向扩展Redis Cluster架构数据分片分布在多个节点支持横向扩展和自动故障转移性能方面 Redis 单次查询 1ms 以内单机 QPS 十几万。说不能放 Redis 因为会单点故障——这逻辑说不通。面试官到底在嘲笑什么两种情况。第一种你用了 JWT 但验证时完全不走签名每次都去 Redis 查 token 是否存在。这等于只借了 JWT 格式没用它的能力——不如直接生成随机字符串当 Session ID还省了编解码开销。面试官嘲笑的是这里。第二种你确实有业务需求需要主动吊销选了 JWTRedis 方案。但面试里只说了放 Redis没说为什么。面试官误以为你不懂无状态设计。第一种要改方案第二种要改表达。纯 JWT 什么时候真的合适跨服务调用网关层做一次验签用户信息往下游传。订单服务、支付服务直接从 JWT 取 userId不用再查 Redis。这里 JWT 承担的是身份传递角色不是管理登录会话。一次性凭证邮箱验证链接、密码重置链接、临时分享链接。签一次用一次不需要续期和吊销。安全要求不高的内部工具用户量少不需要踢人下线。纯 JWT 省一层依赖。面试怎么答别上来就说放 Redis也别上来就说JWT 无状态。先说业务需求需不需要主动踢人改密码后需不需要其他设备立刻失效需不需要限制同时在线设备数然后根据需求说方案需要的话选 JWTRedis 黑名单说清楚纯 JWT 做不了主动吊销不需要的话纯 JWT 够了说清楚签名验证流程和密钥管理。面试官真正想听的不是你选了哪个是你知不知道每个方案的边界。Token 放 Redis这件事本身没问题问题是说不出来为什么放。1、2T架构师学习资料干货分享2、10000TB资源阿里云盘牛逼3、基本涵盖了Spring所有核心知识点总结· END ·最后关注公众号互联网架构师在后台回复2T可以获取我整理的 Java 系列面试题和答案非常齐全。如果这篇文章对您有所帮助或者有所启发的话帮忙扫描上方二维码关注一下您的支持是我坚持写作最大的动力。求一键三连点赞、转发、在看