2. 授权策略的核心概念:、、OAuth 2.0、JWT 简述

授权策略这东西,说起来好像就是“给一把钥匙开一扇门”。但我在实际项目里见过不少团队,钥匙类型搞混了,或者根本不理解各自的能力边界,最后要么安全漏洞,要么用户体验烂到爆。我最早做SDK接入的时候,也以为弄个就能搞定一切——结果后来被安全团队怼回来重写。

这一章咱们就把四个最基础、最常用的授权概念拆开来讲清楚。你不需要背定义,但要知道它们各自解决什么问题、在什么场景下选哪个。嗯,直接开始吧。

2.1 —— 临时的通行证

说白了就是一个临时令牌。客户端拿它去访问资源,服务端验证一下,有效就放行。它不像密码那样永远不变,通常有过期时间,过期就得重新获取。

我在项目中遇到过好几次 过期导致调用失败的情况。有一次调试了半天,才发现是客户端的 缓存策略写死了,没有自动刷新。所以记住: 一定要带过期刷新机制。

  • 作用:证明“我”是谁,以及“我”有权做什么。
  • 典型流程:登录 → 服务端发 → 客户端存起来 → 每次请求带在 Header 里 → 服务端校验。
  • 常见形式:不固定,可以是随机字符串(如 UUID),也可以是结构化字符串(如 JWT)。

我的习惯:在生产环境中, 尽量用短有效期(比如 15 分钟)配合 Refresh 来实现无感刷新,这样既安全又兼顾体验。

2.2 —— 最简单的静态凭证

就是一个固定的字符串,服务端生成后发给客户端,客户端每次请求带上它。简单粗暴,但问题也明显——它不会过期,一旦泄露,相当于把房子的钥匙直接给了别人。

我曾经见过某家公司的移动端 App 里, 硬编码在资源文件中,反编译一下就能拿到。后来他们被刷了十几万的流量费才改过来。

  • 适用场景:服务器之间的内部调用、开发者测试环境的快速接入。
  • 安全隐患:不能用于前端或移动端直接暴露给用户。
  • 改进方案:绑定 IP 白名单、限制权限范围、定期轮换。

千万注意: 明文传输时务必使用 HTTPS,并且不要在 URL 参数里传递(容易落入日志)。

2.3 OAuth 2.0 —— 授权框架,不只是登录

OAuth 2.0 是个大框架,它定义了怎么安全地把访问权限委托给第三方。你看到的“第三方登录”(比如用微信登录某App)只是它的一个子模式——授权码模式。

我刚开始接触 OAuth 时,被四种 grant type 搞得一头雾水。后来发现核心就一条:根据客户端类型选择最合适的授权方式。举个例子,纯后端服务用 client credentials,移动端用 authorization code + PKCE。

授权模式 适用客户端 是否返回Refresh
授权码(Authorization Code) Web 服务器应用 是
隐式(Implicit) 单页应用(已不推荐) 否
密码(Resource Owner Password) 受信任的客户端 是
客户端凭证(Client Credentials) 服务器到服务器 否

OAuth 2.0 本身不规定 的格式。你可以用随机字符串,也可以用 JWT。它只关心怎么拿 ,不关心 长什么样。

2.4 JWT —— 自包含的 格式

JWT 是一种 格式,而不是一个授权协议。它的特点是“自包含”:服务端把用户信息、权限声明、过期时间全部编码成一个字符串,客户端拿着它,服务端不需要再查数据库就能验证。

结构分三部分:Header、Payload、Signature。Header 声明算法,Payload 放数据,Signature 防篡改。注意,Payload 只是 Base64 编码,不是加密——用线上工具就能解码看到内容。

// 一个 JWT 示例(解码后的 Payload)
{
  "sub": "user_123",
  "role": "admin",
  "iat": 1710000000,
  "exp": 1710003600
}

我曾经用过 JWT 实现内部微服务间的 SSO,省掉了中心认证库的查询,性能确实好。但有一次不小心把用户的邮箱地址放进了 Payload,被安全审计发现后紧急整改——记住,敏感数据永远别放 JWT 的 Payload 里。

  • 优点:无状态、可跨域、解析速度快。
  • 缺点:一旦签发无法撤销(除非引入黑名单或短过期)。
  • 签名算法:推荐 RS256(非对称)而不是 HS256(对称),防止密钥泄露后全线沦陷。

我的避坑小技巧:JWT 的过期时间一定要校验,而且最好用毫秒精度。我曾经遇到过服务端和客户端时区不一致,导致 刚一签发就过期了的乌龙。

授权策略核心概念关系图 客户端请求 OAuth 2.0 JWT 资源服务器 格式 生成 可以是 说明: 是最简单的静态凭证,适合内部或低安全场景; OAuth 2.0 是授权框架,负责安全获取 ;JWT 是 的一种自包含格式。

好了,四个概念简单撸了一遍。说白了, 适合“非人类”场景(机器对机器),OAuth 2.0 适合“人类”场景(第三方授权), 是通用的临时凭证,JWT 是其中一种最流行的实现。选的时候别死板,根据你的客户端类型、安全要求、开发成本灵活搭配就可以。