JWT vs Oauth 鉴权
问得太好了! 这个问题直接戳中了 Web 安全演进的灵魂。
你的逻辑完全正确:HTTPS + Basic Auth 在"传输安全"上确实没问题,数据在互联网上跑的时候是加密的,谁都看不见。
那为什么后来还要搞出 JWT、OAuth 这些"花里胡哨"的东西?
核心答案:Basic Auth 解决的是"传输安全",JWT 解决的是"身份管理"
把它们想象成两个完全不同层面的问题:
| 维度 | HTTPS + Basic Auth | JWT |
|---|---|---|
| 传输过程安全吗? | ✅ 安全(加密管道) | ✅ 安全(同样走 HTTPS) |
| 服务器怎么知道你是谁? | 每次请求都要查数据库验证密码 | 验签就行,不用查数据库 |
| 能控制登录多久失效吗? | ❌ 浏览器关掉才失效 | ✅ 可以设置 1 小时、7 天过期 |
| 能主动踢人下线吗? | ❌ 做不到 | ✅ 配合黑名单可以做到 |
| 能支持第三方登录吗? | ❌ 只能自家账号密码 | ✅ 支持(Google/GitHub 登录就是 OAuth+JWT) |
| 能在多个服务间共享身份吗? | ❌ 每个服务都要存密码 | ✅ 用同一把密钥验签就行 |
| 移动 App 能用吗? | ⚠️ 勉强能用,但体验差 | ✅ 原生支持,体验好 |
具体拆解:为什么行业要"进化"出 JWT
1. 性能问题:每次都要查数据库
用 Basic Auth 时,每次请求服务器都要:
解码 Base64 → 拿出用户名密码 → 去数据库查用户表 → 比对密码哈希如果这个接口每秒被调用 10 万次,数据库就被查 10 万次。
JWT 的做法:
解码 Token → 用密钥验证签名 → 直接从 Token 里读出用户 ID(不需要查数据库)验签是纯 CPU 计算,不涉及 I/O,快几个数量级。
2. 无法控制"有效期"(致命伤)
Basic Auth 的凭证是永久有效的,除非:
- 用户修改密码
- 浏览器关闭(有些浏览器还会缓存)
一个真实的灾难场景:
员工小张在公司电脑登录了管理后台,下班回家了。第二天早上保洁阿姨打开这台没关机的电脑,浏览器自动填充了账号密码,阿姨不小心点了一下,删除了整个数据库 😱
JWT 的解决方案:
{
"user": "admin",
"exp": 1700000000 // 1小时后自动过期
}Token 过期了,就必须重新登录,大大降低了"长期不用导致的安全风险"。
3. 无法支持"单点登录"和"第三方授权"
- Basic Auth:每个系统都得单独注册账号密码,用户要记 10 套密码。
- OAuth 2.0 + JWT:你可以用 Google 账号登录 A 网站,Google 返回一个 JWT,A 网站验证签名就知道你是本人,不需要你在 A 网站再注册一次。
这就是为什么你看现在几乎没人用 Basic Auth 做登录,都用"微信扫码"或"手机验证码"——背后流转的就是 Token 机制。
4. 移动端和前后端分离的"用户体验"问题
- 网页 + Basic Auth:浏览器弹出一个丑丑的登录框,用户输入一次,后面自动带。
- App + Basic Auth:每次请求都要在代码里存着密码,一旦 App 被反编译,密码直接泄露。
JWT + App:
- 用户登录一次,服务端返回 JWT
- App 把 Token 存在安全的本地存储(Keychain/Keystore)
- 每次请求带上
Authorization: Bearer <token> - 不需要存密码,Token 还能设置过期自动刷新
一个形象的类比
- Basic Auth:你家大门装了一把机械锁(HTTPS 是锁芯),只要有钥匙(密码)随时能进,钥匙丢了就得换锁(改密码),而且你不知道谁来过、什么时候来的。
- JWT:你搞了一个"临时门禁卡",卡上印着你的头像和有效期(签名防伪造)。进门时保安(服务器)扫一下卡就知道你是谁、有没有权限,而且这张卡 8 小时后自动失效。你还可以随时在后台"挂失"这张卡。
所以结论是:
HTTPS + Basic Auth 不是"不安全",而是"功能太弱"。
在 1990 年代,网站就那么几个页面,用 Basic Auth 完全够用。但今天的 Web 是:
- 分布式微服务
- 移动端 + Web 端 + 小程序多端登录
- 第三方授权(用微信登录 xxx)
- 需要精细控制权限(管理员、普通用户、VIP 会员)
这些需求,Basic Auth 一个都满足不了,所以才有了 JWT、OAuth、Session-Cookie 这些更复杂的解决方案。
你现在写的这段 Basic Auth 代码,就像一个"复古的浪漫" —— 它依然有用,但只在特定场景下:比如保护你的 CI/CD 构建接口、内部监控面板、或者临时给朋友开一个测试环境。
本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/Web