Web 身份鉴权技术方案
Web 身份鉴权是 Web 应用安全的第一道防线,也是所有需要验证用户身份、管理权限、保障数据完整性系统的必备能力。
这个领域最容易混淆的是两个概念:
- Authentication(认证):你是谁,通常发生在登录与会话建立阶段
- Authorization(授权):你能做什么,发生在每一次资源访问与操作之前
主流 Web 鉴权方案
HTTP Basic Authentication
客户端在请求头携带账号与密码,服务端校验通过后返回资源。它胜在实现成本低,但缺点也很“硬”:
- 必须依赖 HTTPS,否则等同明文传输
- 不擅长会话控制:登出、踢下线、改密后强制失效都不优雅
- 体验一般,且没有天然的防重放机制(通常需要额外设计)
适用场景往往是内部工具、短生命周期原型或低风险 API。即便如此,也不要把密码明文存库;应使用带盐的强哈希(如 bcrypt/Argon2)存储摘要,并配合限速与告警。
一个最小例子(请求头长这样):
Authorization: Basic base64(username:password)
落地时建议补齐两件事:对登录/鉴权接口做限速(防爆破),以及给每个账号设置“失败次数阈值 + 冷却时间”。
Cookie/Session 机制
这是经典的“服务端有状态”方案:登录后服务端创建会话记录(Session),客户端通过 Cookie 携带 Session ID,后续请求据此识别用户。
优点是控制力强:可以随时失效会话、踢下线、做精细的风控与审计;缺点也很直接:
- 需要存储与管理 Session,带来额外成本与复杂度
- 分布式场景需要粘性会话或共享存储(如 Redis),一致性与故障处理更难
安全上,Cookie 相关风险通常集中在两类:
- CSRF:对非幂等请求使用 CSRF Token;敏感 Cookie 设置
SameSite=Lax/Strict;必要时校验Origin - XSS:以输出编码为主,配合 CSP;避免危险 API;敏感 Cookie 设置
HttpOnly与Secure
一个更“像生产”的 Cookie 设置示例:
Set-Cookie: sid=...; Path=/; HttpOnly; Secure; SameSite=Lax
一个最小 CSRF Token 思路(双提交或 Session 存储都行):服务端下发 token,客户端在非幂等请求里同时带 Cookie 与 token,服务端做比对:
X-CSRF-Token: <random>
如果你采用前后端分离并且跨站请求不可避免,SameSite=None; Secure 是常见选择,但这会放大 CSRF 风险,CSRF Token 反而更不能省。
Token 鉴权
Token 方案把身份与授权信息编码到 Token 里,请求时由客户端携带,服务端通过签名/有效期/权限声明等校验来放行或拒绝。它天然更适合分布式与微服务,因为服务端可以少存或不存会话状态。
一个常见的传输方式(Bearer Token):
Authorization: Bearer <access_token>
JWT
JWT(JSON Web Token)是最常见的 Token 载体之一,结构是 Header.Payload.Signature:
- Header:算法与类型
- Payload:声明(如用户 ID、角色、过期时间)
- Signature:用密钥签名,防篡改
工程上记住两句话基本够用:
- Payload 可被解码阅读,别放敏感信息
- JWT 擅长“自包含校验”,不擅长“强撤销”;想要登出/踢下线/改密后立刻全端失效,通常需要配合服务端状态(黑名单、版本号、会话绑定或短期 Access Token + Refresh Token)
一个更贴近实践的 claims 示例(只示意字段,不要把权限列表做得过细):
{
"sub": "user_123",
"roles": ["admin"],
"ver": 7,
"iat": 1730000000,
"exp": 1730003600,
"iss": "snowsblog",
"aud": "web"
}
其中 ver(tokenVersion)是常用的“强撤销”手段:用户改密/登出/风险事件时把服务端记录的版本号 +1,校验时要求 ver 匹配即可让旧 token 全部失效。
OAuth 2.0
OAuth 2.0 是用于授权的行业标准协议,本质也是基于 Token 来实现的
核心思路:第三方应用通过授权流程获取访问令牌(Access Token),用它代表用户访问受保护资源

主要使用场景是第三方登录(如 Google 登录、微信登录)、API 开放平台等
安全性要点(Token 方案)
Token 一旦泄露,攻击者拿到的就是“通行证”。落地时通常要回答这几个问题:
- Token 存在哪:浏览器场景优先考虑
HttpOnlyCookie;若必须用本地存储,至少配合严格的 XSS 防护与最小权限 - Token 怎么走:全站 HTTPS;避免把 Token 放到 URL;谨慎引入第三方脚本与跨域能力
- 过期与续期:短期 Access Token + 可控的 Refresh Token,配合旋转与撤销策略
- 主动管理:黑名单/版本号/会话绑定/设备绑定等手段,支持服务端强制失效
- 风控与二次验证:关键操作引入 2FA/MFA,异常行为检测与限速
一个常见且容易落地的组合是:
- Access Token:短有效期(例如 5–15 分钟),用于频繁调用 API
- Refresh Token:长有效期(例如 7–30 天),只用于换取新的 Access Token,要求“单次使用 + 旋转”(refresh 后旧 refresh 立刻作废)
未来趋势
- 无密码化演进:FIDO2 标准(WebAuthn)逐步替代动态码,通过生物识别或硬件密钥实现无密码登录
- AI 动态风控:结合行为分析,实时调整令牌权限(如异常登录触发二次验证)