这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
完整系统
完整的用户认证与会话系统可以拆成四层:
身份入口层 -> 凭证与会话层 -> 联邦身份层 -> 风险与审计层身份入口层处理登录、注册、找回密码;凭证与会话层管理 Token、Session、刷新和撤销;联邦身份层接入 SSO 和 OAuth;风险与审计层处理 MFA、异常登录、登录日志和强制下线。
最终登录链路
一次典型登录可以这样发生:
- 用户提交账号密码或选择第三方登录。
- 认证服务验证凭证,检查账号状态和登录风险。
- 如果风险较高,触发 MFA。
- 登录成功后创建会话,签发 Access Token 和 Refresh Token。
- 客户端后续请求携带 Access Token。
- Access Token 过期后,使用 Refresh Token 换新令牌。
- 修改密码、冻结账号或异常检测时,撤销相关会话。
- 所有登录、刷新、撤销和 MFA 操作写入审计日志。
这条链路让系统既能保持用户体验,又能在风险出现时收回信任。
核心数据
认证系统至少需要这些数据:
| 数据 | 作用 |
|---|---|
| user_account | 用户账号、状态、密码哈希、认证方式 |
| session | 登录设备、过期时间、撤销状态、风险等级 |
| refresh_token | 长期凭证、轮换状态、绑定设备 |
| identity_binding | OAuth、SSO 等外部身份绑定 |
| mfa_factor | 用户启用的 TOTP、WebAuthn、恢复码 |
| auth_audit_log | 登录、失败、刷新、撤销、MFA、异常记录 |
密码、Refresh Token、MFA 备用码都属于高敏数据,必须加密或哈希存储。
关键决策
- JWT 还是不透明 Token:JWT 适合跨服务验证,不透明 Token 更容易撤销。高安全场景可以用短期 JWT + 服务端会话。
- Cookie 还是 Header:Cookie 适合浏览器但要处理 CSRF,Header 适合 API 和移动端但要防 XSS 或本地泄露。
- 会话多久过期:时间越长体验越好,风险窗口越大。应结合 Refresh Token 轮换和最长生命周期。
- MFA 每次都触发吗:不应该。应结合风险和操作敏感度触发。
- SSO 是否统一登出:安全要求越高,统一登出越重要,但实现复杂度也越高。
上线检查清单
- 密码是否使用 bcrypt、scrypt 或 Argon2 等慢哈希?
- 登录失败是否有账号、IP、设备维度的限流?
- Access Token 是否短期有效,Refresh Token 是否可撤销和轮换?
- 修改密码、冻结账号后是否撤销旧会话?
- OAuth 回跳地址和 state 是否严格校验?
- SSO 是否定义全局会话、本地会话和登出策略?
- 高风险操作是否触发 MFA 或重新认证?
- 登录、刷新、撤销、MFA 是否有审计日志?
- 异常登录是否进入风控或告警系统?
课程总结
认证系统的本质是信任管理。用户通过凭证建立信任,系统通过会话延续信任,通过风控和 MFA 提升信任,通过撤销和审计收回或追踪信任。
当你设计认证系统时,不要只问“怎么登录”,还要问:
- 登录态如何保存和撤销?
- 凭证泄露后风险窗口多长?
- 多设备和多系统之间身份如何同步?
- 高风险操作如何重新确认身份?
- 出现账号盗用时,能否追踪和恢复?
能回答这些问题,认证系统才具备生产级完整性。