令牌类型:JWT、Opaque 、Reference 的对比与选型

聊到访问令牌,绕不开三种主流类型:JWT、Opaque 和 Reference 。很多新手容易混淆,甚至觉得“反正都是 ,随便选一个就行”。嗯,这里我得说一句——选错了,后面运维会非常痛苦。

我个人习惯,在系统设计初期就把令牌类型定下来。因为一旦上线,再想换类型,牵涉到客户端、网关、资源服务器、认证服务器,改造成本极高。今天咱们就把这三兄弟掰开揉碎,讲清楚。

JWT(JSON Web )

JWT 是目前最火的令牌格式。它本身就是一个自包含的数据载体,说白了,你把令牌解码,就能拿到用户信息、权限、过期时间等。

核心特点:JWT 是 无状态 的。资源服务器不需要去认证中心查数据库,只要验签通过,就能信任令牌里的内容。

我在项目中遇到过这样一个场景:一个微服务网关,每天处理上亿次请求。如果每个请求都去认证中心查一次令牌状态,认证中心肯定扛不住。用 JWT 就解决了——网关本地验签,性能极高。

但 JWT 也有明显的短板:

  • 无法主动撤销——签发后,只要没过期,就算你把用户踢下线,他手里的 JWT 依然有效。除非你引入黑名单机制,但那又回到了有状态。
  • 令牌体积大——JWT 包含 Header、Payload、Signature,通常 500 字节到 2KB。如果放在 URL 参数里,可能超限。
  • 敏感信息泄露风险——Payload 只是 Base64 编码,不是加密。千万别把密码、身份证号放进去。

我曾经踩过的坑:有次把用户手机号直接塞进 JWT 的 Payload,想着反正有签名,别人改不了。结果前端调试时把令牌打到了日志里,手机号全泄露了。后来我强制要求:JWT 里只放用户 ID 和角色,其他敏感信息一律走接口查询。

Opaque (不透明令牌)

Opaque ,顾名思义,就是一段随机字符串。你拿到它,完全看不出任何信息。它只是一个“钥匙”,资源服务器必须拿着它去认证中心换真正的用户信息。

说白了,Opaque 是 有状态 的。认证中心需要维护一个令牌存储(Redis、数据库等),记录令牌与用户信息的映射关系。

它的优点也很明显:

  • 可主动撤销——只要删掉存储里的记录,令牌立即失效。
  • 体积小——通常 32 字节或 64 字节,传输效率高。
  • 信息安全——令牌本身不携带任何用户数据,没有泄露风险。

但缺点同样突出:每次请求都要查一次存储,延迟比 JWT 高。如果认证中心挂了,所有请求都会失败。

我的建议:如果系统对实时撤销有强需求(比如金融、支付场景),优先考虑 Opaque 。但一定要给认证中心做高可用,否则就是单点故障。

Reference (引用令牌)

Reference 其实和 Opaque 很像,也是一段随机字符串。区别在于,Reference 通常配合 令牌内省( Introspection) 端点使用。

你想想看,Opaque 需要资源服务器自己去查存储,那如果资源服务器很多,每个都直连 Redis,连接数会爆炸。Reference 的解决思路是:统一走一个内省接口,由认证中心返回令牌的元数据(是否有效、权限范围、过期时间等)。

我习惯把 Reference 看作是 Opaque 的“标准化版本”。OAuth 2.0 规范里定义的 RFC 7662 就是专门干这个的。

特性 JWT Opaque Reference
状态 无状态 有状态 有状态
可撤销 困难(需黑名单) 容易 容易
体积 大(500B-2KB) 小(32-64B) 小(32-64B)
验证方式 本地验签 查存储 内省接口
性能 高 中(依赖存储延迟) 中(依赖网络延迟)
信息泄露风险 有(Payload 可解码) 无 无
适用场景 高并发、低延迟、可接受延迟撤销 强撤销需求、内部系统 多资源服务器、标准化管理

如何选型?

选型没有银弹。我一般会问自己三个问题:

  1. 我能接受令牌延迟撤销吗? 如果能,选 JWT;如果不能,选 Opaque 或 Reference。
  2. 我的资源服务器多吗? 如果只有一两个,Opaque 直连存储更简单;如果超过五个,Reference 加内省接口更易管理。
  3. 我的令牌会暴露给第三方吗? 如果会(比如开放 API),JWT 更合适,因为第三方可以直接验签,不需要调用你的认证中心。

我个人的经验法则:

  • 内部微服务间调用 → JWT(性能优先)
  • 面向用户的登录会话 → Opaque (可随时踢人)
  • 开放平台 / 第三方集成 → Reference (标准化、可控)

你可能会问:能不能混用?当然可以。我在一个项目中就同时用了 JWT 和 Opaque ——网关层用 JWT 做快速校验,核心业务接口再用 Opaque 做二次鉴权。但混用会增加复杂度,建议团队成熟度够高再尝试。

令牌类型选型决策流程 开始选型 需要实时撤销令牌? 是 否 资源服务器数量 > 5? JWT 是 否 Reference Opaque 选型总结 • JWT:高并发、可接受延迟撤销、资源服务器多时本地验签性能最优 • Opaque :强撤销需求、资源服务器少、内部系统直连存储 • Reference :多资源服务器、标准化管理、需要统一内省接口

最后说一句:不管选哪种,令牌的 生命周期管理 一定要做。签发、刷新、撤销、轮换,每个环节都要有清晰的策略。别等到线上出了安全问题,才想起来“哦,原来我的令牌永远不会过期”。