JWT 和 OAuth 2.0 是两种不同的技术,经常一起使用,但它们解决不同的问题。
核心区别
| 方面 | JWT (JSON Web Token) | OAuth 2.0 |
|---|---|---|
| 本质 | 一种令牌格式/标准 | 一个授权框架/协议 |
| 主要目的 | 安全地传输信息 | 授权第三方应用访问资源 |
| 使用场景 | 身份认证、信息交换 | 委托授权、API访问控制 |
| 关注点 | 如何表示和验证身份 | 如何获取访问权限 |
详细解释
JWT (JSON Web Token)
是什么:一种紧凑的、自包含的令牌格式
结构:
Header.Payload.Signature三部分特点:
包含声明(claims),可被验证和信任
自包含:不需要查询数据库即可验证
可签名(JWS)或加密(JWE)
主要用途:
身份认证(如替代Session)
信息安全传输
一次性验证令牌
OAuth 2.0
是什么:一个授权框架,定义如何获取访问令牌
核心流程:
客户端申请授权
资源所有者同意
客户端获得访问令牌
使用令牌访问受保护资源
授权类型:
授权码模式(最安全)
隐式模式
密码模式
客户端凭证模式
它们的关系(如何一起工作)
text 用户 → 使用OAuth 2.0流程 → 获得访问令牌 → 令牌是JWT格式 → 访问API资源常见组合模式:
OAuth 2.0 + JWT访问令牌
// OAuth 2.0颁发的访问令牌是JWT格式 access_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
OpenID Connect(OIDC)
基于OAuth 2.0的身份层
使用JWT作为ID Token
同时提供认证+授权
JWT结合OAuth 2.0的工作流程
第一阶段 (1-4步): OAuth 2.0授权
用户通过客户端发起请求
重定向到授权服务器进行认证
用户同意授权,返回授权码
第二阶段 (5-7步): JWT令牌生成
客户端用授权码交换令牌
授权服务器生成JWT格式的令牌
JWT包含:签名、有效期、用户信息、权限范围等
第三阶段 (8-10步): JWT验证与资源访问
客户端携带JWT访问API
资源服务器验证JWT签名(无需查询数据库)
验证成功后返回受保护资源
JWT在OAuth 2.0中的优势
自包含性
text 解码JWT Payload示例: { "iss": "auth-server.com", // 颁发者 "sub": "user123", // 用户标识 "exp": 1672531200, // 过期时间 "scope": "read write", // 权限范围 "name": "张三" // 用户信息 }无状态验证
资源服务器通过公钥验证签名
无需查询授权服务器验证令牌
减少网络调用
传统OAuth令牌:每次API调用需要验证令牌有效性
JWT令牌:本地验证即可,减少授权服务器压力
实际应用示例
场景:用户使用微信登录第三方网站
OAuth 2.0流程:
网站重定向到微信授权页面
用户同意授权
微信返回授权码
网站用授权码换取访问令牌
JWT的作用:
微信颁发的访问令牌可能是JWT格式
或者ID Token(OIDC)一定是JWT格式
网站可以解析JWT获取用户信息
关键要点
可以单独使用:
只用JWT做API认证(不涉及第三方授权)
只用OAuth 2.0但不使用JWT格式令牌(如使用随机字符串令牌)
结合使用更强大:
OAuth 2.0处理授权流程
JWT作为令牌格式,提供自包含、可验证的特性
安全考虑:
JWT一旦颁发,在有效期内无法撤销(除非使用黑名单)
OAuth 2.0支持令牌撤销机制
结合使用时需要考虑令牌生命周期管理
总结
简单说:OAuth 2.0是“如何获取权限”的规则,JWT是“权限凭证”的一种表现形式。它们经常搭档出现,这种结合方式广泛应用于现代Web和移动应用,特别是微服务架构中,既实现了安全的第三方授权,又确保了高效的令牌验证。此外他们各自也能独立工作。