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 是其中一种最流行的实现。选的时候别死板,根据你的客户端类型、安全要求、开发成本灵活搭配就可以。