HTTP 接口鉴权(Authorization)是保护 API 接口的核心手段,用于识别调用者的身份和权限,防止未授权访问。常见的鉴权方式分为 5 大类,根据安全性、实现复杂度、场景不同进行选择。
一张表总结:常见 HTTP 接口鉴权方式
| 鉴权方式 | 是否推荐生产 | 安全性 | 适用场景 | 说明简述 |
|---|---|---|---|---|
| 1. Basic Auth | ❌ 一般不推荐 | 低 | 简单测试、内部接口 | 用户名 + 密码 base64 编码 |
| 2. Token(Session) | ⚠️ 一般 | 中 | 登录接口,轻量系统 | 登录生成 Token,Header 传递 |
| 3. JWT(Token) | ✅ 推荐 | 高 | 分布式、移动端、微服务接口 | 无状态令牌,可携带权限和过期信息 |
| 4. OAuth2 | ✅ 推荐 | 高 | 第三方接入、SaaS、多系统统一登录 | 标准协议,支持授权码、客户端模式 |
| 5. HMAC / 签名 | ✅ 推荐 | 高 | API 网关、开放平台接口 | 签名验真,防止参数篡改 |
Basic Auth(基础认证)
Authorization: Basic base64(username:password)
- 用于小型系统或临时接口
- 直接暴露用户名/密码,风险高
- 建议搭配 HTTPS 使用
✅ 优点:实现简单
❌ 缺点:安全性低,不能管理 Token 生命周期
Token + Session(常见登录鉴权)
Authorization: Bearer abc123token
- 登录接口返回 token(可存入 redis/session)
- 后续接口使用 token 鉴权
✅ 优点:简单,适合小系统
⚠️ 缺点:需状态存储(redis),横向扩展复杂
JWT(JSON Web Token)
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6...
- 无状态鉴权,Token 中携带用户信息
- 支持签名校验、防篡改、跨系统共享身份
// JWT payload 示例
{
"sub": "user123",
"role": "admin",
"exp": 1720000000
}
✅ 优点:分布式友好、可扩展性强
⚠️ 缺点:Token 一旦泄露,不能撤销,适合短时效设计
OAuth2(标准授权协议)
广泛用于第三方登录、授权平台:
| 模式 | 应用场景 |
|---|---|
| 授权码模式 | Web 登录跳转授权 |
| 客户端模式 | 后台服务间授权访问 |
| 密码模式(弃用) | 仅用于信任的客户端 |
| 简化模式(弃用) | 只返回 access_token(不安全) |
✅ 优点:安全、标准、适合大型系统
❌ 缺点:配置复杂、实现门槛高
常用于:
- 微信/支付宝/微博登录
- 企业微信、钉钉开放平台授权
- API 多系统集成授权
签名(HMAC / AppKey + Secret 签名)
常用于 API 网关、开放平台、物联网设备:
请求参数示例:
GET /api?timestamp=1680000000&appKey=abc123&sign=XYZ999
sign = MD5(appKey + secret + timestamp + 参数顺序)- 后端使用相同算法校验
优点:
- 抗重放攻击
- 不依赖 Session
- 可设置签名有效期
❌ 缺点:
- 参数排序、签名规则需严格一致
- 秘钥泄露后接口容易被伪造
推荐组合方案(生产级)
| 应用场景 | 推荐方案 |
|---|---|
| Web 后台登录 + 接口访问 | Token + Redis Session / JWT |
| 移动 App、H5 | JWT / OAuth2(客户端模式) |
| 微服务之间的接口调用 | JWT + 签名 / OAuth2 客户端模式 |
| 第三方对接、SDK 调用 | AppKey + 签名 |
| 微信/钉钉/支付宝开放登录 | OAuth2 授权码模式 |
小建议
- 所有鉴权信息务必通过
HTTPS传输! Authorization建议放在请求头,避免 URL 泄露- 签名接口防止重放,可加入
nonce+timestamp - 鉴权失败请统一返回
401 Unauthorized
总结一句话:
小系统用 Token、大系统用 JWT,复杂授权用 OAuth2,开放接口用签名!
3894

被折叠的 条评论
为什么被折叠?



