完整系统

完整的用户认证与会话系统可以拆成四层:

身份入口层 -> 凭证与会话层 -> 联邦身份层 -> 风险与审计层

身份入口层处理登录、注册、找回密码;凭证与会话层管理 Token、Session、刷新和撤销;联邦身份层接入 SSO 和 OAuth;风险与审计层处理 MFA、异常登录、登录日志和强制下线。

最终登录链路

一次典型登录可以这样发生:

  1. 用户提交账号密码或选择第三方登录。
  2. 认证服务验证凭证,检查账号状态和登录风险。
  3. 如果风险较高,触发 MFA。
  4. 登录成功后创建会话,签发 Access Token 和 Refresh Token。
  5. 客户端后续请求携带 Access Token。
  6. Access Token 过期后,使用 Refresh Token 换新令牌。
  7. 修改密码、冻结账号或异常检测时,撤销相关会话。
  8. 所有登录、刷新、撤销和 MFA 操作写入审计日志。

这条链路让系统既能保持用户体验,又能在风险出现时收回信任。

核心数据

认证系统至少需要这些数据:

数据作用
user_account用户账号、状态、密码哈希、认证方式
session登录设备、过期时间、撤销状态、风险等级
refresh_token长期凭证、轮换状态、绑定设备
identity_bindingOAuth、SSO 等外部身份绑定
mfa_factor用户启用的 TOTP、WebAuthn、恢复码
auth_audit_log登录、失败、刷新、撤销、MFA、异常记录

密码、Refresh Token、MFA 备用码都属于高敏数据,必须加密或哈希存储。

关键决策

  1. JWT 还是不透明 Token:JWT 适合跨服务验证,不透明 Token 更容易撤销。高安全场景可以用短期 JWT + 服务端会话。
  2. Cookie 还是 Header:Cookie 适合浏览器但要处理 CSRF,Header 适合 API 和移动端但要防 XSS 或本地泄露。
  3. 会话多久过期:时间越长体验越好,风险窗口越大。应结合 Refresh Token 轮换和最长生命周期。
  4. MFA 每次都触发吗:不应该。应结合风险和操作敏感度触发。
  5. SSO 是否统一登出:安全要求越高,统一登出越重要,但实现复杂度也越高。

上线检查清单

  • 密码是否使用 bcrypt、scrypt 或 Argon2 等慢哈希?
  • 登录失败是否有账号、IP、设备维度的限流?
  • Access Token 是否短期有效,Refresh Token 是否可撤销和轮换?
  • 修改密码、冻结账号后是否撤销旧会话?
  • OAuth 回跳地址和 state 是否严格校验?
  • SSO 是否定义全局会话、本地会话和登出策略?
  • 高风险操作是否触发 MFA 或重新认证?
  • 登录、刷新、撤销、MFA 是否有审计日志?
  • 异常登录是否进入风控或告警系统?

课程总结

认证系统的本质是信任管理。用户通过凭证建立信任,系统通过会话延续信任,通过风控和 MFA 提升信任,通过撤销和审计收回或追踪信任。

当你设计认证系统时,不要只问“怎么登录”,还要问:

  • 登录态如何保存和撤销?
  • 凭证泄露后风险窗口多长?
  • 多设备和多系统之间身份如何同步?
  • 高风险操作如何重新确认身份?
  • 出现账号盗用时,能否追踪和恢复?

能回答这些问题,认证系统才具备生产级完整性。