Appearance
OAuth2 和 JWT 的关系
首先需要澄清一个常见的认知错误:access_token 和 refresh_token 是 OAuth2 规范的内容,而不是 JWT 规范的一部分。JWT 只定义了 token 的编码、加密和解密方式,并不规定 token 的使用方式。OAuth2 作为一种认证规范,定义了 refresh_token 和 access_token 两种 token,这两个 token 可以使用 JWT 来构建,也可以使用其他方式。
OAuth2 的双 Token 机制
OAuth2 定义了资源服务器和授权服务器两个角色:
- 用户首次认证时向授权服务器提交用户名和密码,获取两个 token
- 访问资源服务器时使用 access_token
- 资源服务器通常不被完全信任,因此不能获知 refresh_token
- access_token 失效后,客户端使用 refresh_token 向授权服务器获取新的 access_token
实际应用流程
用户登录:
- 用户提供用户名和密码
- 系统返回 access_token 和 refresh_token
日常接口访问:
- 请求需携带 access_token
- 无需使用 refresh_token
Token 更新:
- access_token 即将过期时
- 使用 refresh_token 获取新的 access_token
安全性考虑
JWT 的特性:
- 去中心化设计
- 已发放的 token 无法撤销
- 每次请求都需携带 token
安全风险与解决方案:
- access_token 设置较短有效期,降低被盗用风险
- refresh_token 使用频率低,降低暴露风险
- 双 token 机制提供了安全性与便利性的平衡
实际应用案例
许多平台(如抖音、钉钉等)都采用类似机制:
- 应用注册获取 appkey 和 appsecret
- 使用这些凭证获取 access_token 和 refresh_token
- access_token 通常 1-2 小时有效
- refresh_token 有效期较长
- API 调用使用 access_token
- 通过 refresh_token 定期更新 access_token