整个Web 认证授权技术的演进时间线
史前时代:HTTP Basic Auth (1990s)
Authorization: Basic dXNlcjpwYXNzd29yZA==
背景:早期 Web 只需要简单的访问控制。 机制:Base64 编码用户名密码,随每个请求发送。
致命缺陷:
- 明文传输(仅编码未加密)
- 无法主动登出(浏览器记住凭据直到关闭)
- 跨域困难
现状:仅用于内部系统或 API 快速测试,配合 HTTPS 勉强生存。
第一代:Cookie + Session (1994-2000s)
1994年:Netscape 工程师 Lou Montulli 发明 Cookie,解决 HTTP 无状态问题。
典型流程:
客户端 ──登录──→ 服务端创建 Session(内存/Redis/DB)
←─Set-Cookie: SESSION_ID=abc123──
──后续请求携带 Cookie──→ 服务端查 Session 表验证
解决的问题:
- 状态保持:用户不必每次请求都输密码
- 安全性提升:密码只传一次,之后用随机 SessionID
- 可控登出:服务端销毁 Session 即可强制下线
架构痛点(2000s后期暴露) :
- 有状态:Session 粘滞,水平扩展困难(需 Redis 共享 Session)
- 移动端困境:原生 App 不擅长处理 Cookie,跨域受限(CORS 严格)
- 微服务灾难:每个服务都要访问集中式 Session 存储,成为瓶颈
第二代:Token 时代 - JWT (2010)
背景:RESTful API 兴起,前后端分离成为主流,需要无状态认证。
2010年:IETF 标准化 JWT (JSON Web Token) ,基于 2007 年的 JWS/JWE 标准。
革命性改变:
服务端不再存 Session!
登录成功颁发 JWT(含签名),客户端存储(LocalStorage)
后续请求携带 JWT,服务端仅验签即可确认身份
优势:
- 真正的无状态:任意服务实例可独立验证 Token,水平扩展无压力
- 跨域友好:Token 放在 Header,不受 Cookie 同源策略限制
- 移动端天然适配:App 直接存内存或 Keychain
代价与问题:
- 无法主动吊销:JWT 一旦颁发,在过期前一直有效(需配合黑名单/短有效期)
- 体积膨胀:比 SessionID 大得多(可能几 KB),频繁请求浪费带宽
- XSS 风险:存在 LocalStorage 易被 JS 窃取(vs Cookie 的 HttpOnly)
第三代:第三方授权 - OAuth 演进
OAuth 1.0 (2007)
背景:Web 2.0 时代,用户需要让第三方应用(如 Flickr 图片上传到 Twitter)访问其数据,但不能给第三方密码。
特点:复杂,需计算签名(HMAC-SHA1),已被淘汰。
OAuth 2.0 (2012) ★ 现代基石
RFC 6749 发布,大幅简化,放弃加密签名,依赖 HTTPS。
核心创新:
- 授权码模式 (Authorization Code) :最安全的第三方登录流程
- Access Token:短期访问令牌(如 2 小时)
- Refresh Token:长期刷新令牌(如 30 天),用于获取新的 Access Token
解决的问题:
- 用户不必向第三方应用透露密码
- 可随时在授权服务器撤销权限
- 细粒度权限控制(Scope:只读/读写)
误区澄清:OAuth 2.0 设计初衷是授权(Authorization),不是认证(Authentication)!但现实中被广泛用于"使用微信/谷歌登录"。
OpenID Connect (2014)
背景:OAuth 2.0 没有标准化"用户信息获取",各家实现混乱。
OIDC = OAuth 2.0 + ID Token (JWT)
- 在授权流程中增加
openidscope - 颁发 ID Token(含用户基本信息的 JWT)
- 标准化
/userinfo端点
意义:终于有了一套标准的身份认证协议,打通"第三方登录"和"单点登录(SSO)"。
并行发展:单点登录 (SSO)
- SAML (2005) :企业级 XML 协议,重,主要用于企业 AD 集成
- CAS (2004) :Yale 大学开发的中央认证服务,教育界常用
- OIDC (2014) :现代 Web SSO 的事实标准,取代 SAML 大部分场景
现代趋势:无密码与去中心化 (2020s)
WebAuthn / Passkey (2019-)
FIDO2 标准,用生物识别/硬件密钥替代密码:
- 私钥存于设备安全芯片(TPM/Secure Enclave),公钥注册到服务端
- 彻底杜绝钓鱼攻击(域名绑定)和数据库泄露(无密码可泄)
- 苹果/谷歌/微软共同推动,iOS 16/Android 14 原生支持
隐私计算与去中心化身份 (DID)
- Verifiable Credentials:用户自持身份凭证,选择性披露
- Web3 钱包:MetaMask 等作为身份入口,挑战传统 OAuth 体系
技术选型简史总结
| 年代 | 主流方案 | 适用场景 | 淘汰原因 |
|---|---|---|---|
| 1990s | HTTP Basic | 简单系统 | 安全性差 |
| 2000s | Cookie/Session | 传统 Web 单体应用 | 微服务/移动端不适应 |
| 2010s | JWT + OAuth 2.0 | 前后端分离、移动端、第三方登录 | 无状态带来的吊销难题 |
| 2020s | OAuth 2.1 + Passkey | 现代 Web/移动应用 | 逐步淘汰密码 |
关键设计矛盾(至今仍存在)
- 有状态 vs 无状态:Session 可控但难扩展,JWT 易扩展但难吊销
- 安全 vs 体验:短 Token 安全但频繁登录,长 Token 体验好但风险高
- 中心化 vs 去中心化:传统 IAM vs Web3 身份
现代最佳实践:
- Web 应用:Cookie(HttpOnly/Secure/SameSite)+ Session(Redis)或 短有效期 JWT
- 移动/API:OAuth 2.0 + JWT(Access Token 短,Refresh Token 长)
- 高安全场景:Passkey/WebAuthn 无密码认证