Contents

Web 身份鉴权技术方案

Web 身份鉴权是 Web 应用安全的第一道防线,也是所有需要验证用户身份、管理权限、保障数据完整性系统的必备能力。

这个领域最容易混淆的是两个概念:

  • Authentication(认证):你是谁,通常发生在登录与会话建立阶段
  • Authorization(授权):你能做什么,发生在每一次资源访问与操作之前

客户端在请求头携带账号与密码,服务端校验通过后返回资源。它胜在实现成本低,但缺点也很“硬”:

  • 必须依赖 HTTPS,否则等同明文传输
  • 不擅长会话控制:登出、踢下线、改密后强制失效都不优雅
  • 体验一般,且没有天然的防重放机制(通常需要额外设计)

适用场景往往是内部工具、短生命周期原型或低风险 API。即便如此,也不要把密码明文存库;应使用带盐的强哈希(如 bcrypt/Argon2)存储摘要,并配合限速与告警。

一个最小例子(请求头长这样):

Authorization: Basic base64(username:password)

落地时建议补齐两件事:对登录/鉴权接口做限速(防爆破),以及给每个账号设置“失败次数阈值 + 冷却时间”。

这是经典的“服务端有状态”方案:登录后服务端创建会话记录(Session),客户端通过 Cookie 携带 Session ID,后续请求据此识别用户。

优点是控制力强:可以随时失效会话、踢下线、做精细的风控与审计;缺点也很直接:

  • 需要存储与管理 Session,带来额外成本与复杂度
  • 分布式场景需要粘性会话或共享存储(如 Redis),一致性与故障处理更难

安全上,Cookie 相关风险通常集中在两类:

  • CSRF:对非幂等请求使用 CSRF Token;敏感 Cookie 设置 SameSite=Lax/Strict;必要时校验 Origin
  • XSS:以输出编码为主,配合 CSP;避免危险 API;敏感 Cookie 设置 HttpOnlySecure

一个更“像生产”的 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 里,请求时由客户端携带,服务端通过签名/有效期/权限声明等校验来放行或拒绝。它天然更适合分布式与微服务,因为服务端可以少存或不存会话状态。

一个常见的传输方式(Bearer Token):

Authorization: Bearer <access_token>

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 是用于授权的行业标准协议,本质也是基于 Token 来实现的

核心思路:第三方应用通过授权流程获取访问令牌(Access Token),用它代表用户访问受保护资源

20250425171712664

主要使用场景是第三方登录(如 Google 登录、微信登录)、API 开放平台等

Token 一旦泄露,攻击者拿到的就是“通行证”。落地时通常要回答这几个问题:

  1. Token 存在哪:浏览器场景优先考虑 HttpOnly Cookie;若必须用本地存储,至少配合严格的 XSS 防护与最小权限
  2. Token 怎么走:全站 HTTPS;避免把 Token 放到 URL;谨慎引入第三方脚本与跨域能力
  3. 过期与续期:短期 Access Token + 可控的 Refresh Token,配合旋转与撤销策略
  4. 主动管理:黑名单/版本号/会话绑定/设备绑定等手段,支持服务端强制失效
  5. 风控与二次验证:关键操作引入 2FA/MFA,异常行为检测与限速

一个常见且容易落地的组合是:

  • Access Token:短有效期(例如 5–15 分钟),用于频繁调用 API
  • Refresh Token:长有效期(例如 7–30 天),只用于换取新的 Access Token,要求“单次使用 + 旋转”(refresh 后旧 refresh 立刻作废)
  • 无密码化演进:FIDO2 标准(WebAuthn)逐步替代动态码,通过生物识别或硬件密钥实现无密码登录
  • AI 动态风控:结合行为分析,实时调整令牌权限(如异常登录触发二次验证)