Credential Change & Session Revocation
密码重置、邮箱/MFA 变更和账户恢复会改变认证信任边界,因此必须显式决定旧 Session、Refresh Token family、remembered device 与 Access Token 的撤销/降级语义;前端清 Cookie 不等于服务端撤销,短期 Access Token 可能存在可接受的 stale window。
[!info] related notes
- 所属 MOC: 安全 MOC
- Session: Server-side Session 鉴权, Redis Session Authority
- Refresh: Refresh Token
- Account Recovery: Password Reset & Account Recovery
- MFA Recovery: MFA Recovery Codes
- Email Change: Email Verification & Email Change Security
- Active Sessions / Trusted Device: Active Sessions & Device Management, Trusted Device & Remember MFA
Credential Change & Session Revocation
一句话关系
Credential change 是认证状态变化。
因此每次:
- password reset;
- email change;
- MFA reset;
- account recovery;
- security incident;
都必须回答:
旧 Session / Refresh Credential / trusted-device state 还能不能继续用?
前端 Logout 不等于 Revocation
浏览器删除 Cookie 或本地 Token,只删除当前客户端副本。
如果服务端 Session 仍有效,攻击者手里复制的同一个 credential 仍可继续使用。
所以真正 revoke 必须发生在服务端 authority。
Server-side Session
如果使用 opaque Session:
session store → revoked_at / delete
可以立即终止对应 Session。
“退出所有设备”:
user_id → enumerate/revoke all active sessions
需要有 user→sessions secondary index 或等价查询能力。
Refresh Token / Grant
Hybrid 模型:
Access Token → short-lived fast path
Refresh Token / Session Grant → long-lived authority
Password reset 后可以:
revoke all refresh families → no new Access Token can be minted
但当前已签发 Access Token 可能在 TTL 内仍可继续使用。
Access Token Stale Window
如果 Access Token 是自包含 JWT 且普通请求不查 server state:
password reset at T0 → old access JWT may remain valid until exp
这是明确的 stale window。
收口方式包括:
- very short access TTL;
- credential/security version claim + online check;
- denylist;
- session authority check;
- event-driven revocation cache。
选择取决于即时撤销要求和性能预算。
Credential Version / Security Stamp
可以维护:
user.security_version
Token/Session 创建时记录:
security_version = 7
Password reset / MFA reset: → increment to 8
请求或 refresh 时:
credential version mismatch → reject
它表达的是:
这个认证状态是在旧安全配置下签发的。
但如果普通 Access Token 完全离线验证,又不查询 version,仍然存在 stale window。
Password Change vs Password Reset
已认证用户主动 change password 与 forgot-password recovery 风险等级不同。
Normal Password Change
- require recent reauthentication;
- revoke other sessions;
- optionally keep current trusted session after rotating Session ID。
Recovery Reset
- assume higher compromise probability;
- revoke all Sessions / Refresh families;
- require fresh normal login。
没有唯一答案,但必须显式区分。
MFA Change
新增/删除 MFA authenticator 属于 security-critical event。
建议:
- recent strong reauthentication;
- revoke/step-down sessions that lack new assurance;
- update session assurance metadata;
- notify user;
- consider revoke remembered-device trust。
Email Change
Email 可能用于 recovery、login identifier 和 notification。
成功变更后,长期 Session 是否继续有效取决于产品模型。
高风险系统可以:
- regenerate Session ID;
- require reauth;
- invalidate recovery state;
- revoke risky sessions。
Remembered Device
“Remember this device” 本质上也是 credential / trust state。
Account recovery 后不应忘记评估:
- remembered-MFA bypass cookie;
- trusted-device token;
- device binding;
- long-lived browser grant。
否则 revoke Session 但保留 MFA bypass token,仍可能留下后门。
Notification
Credential change 后应记录并通知:
- password changed;
- email changed;
- MFA changed;
- recovery performed;
- sessions revoked。
通知属于 compromise detection,不替代 authorization。
Audit Event
至少记录:
- account;
- event type;
- time;
- actor/session;
- IP/device context;
- revoked session count;
- recovery method;
- reason/policy version。
不要记录 raw secret/token。
学习检查
- 为什么清浏览器 Cookie 不等于 server-side revocation?
- Hybrid 架构中 password reset 后为什么 Access Token 可能仍有 stale window?
- security_version 能解决什么,不能解决什么?
- normal password change 与 recovery reset 的 Session policy 为什么可以不同?
- MFA change 为什么要重新评估 Session assurance?
- remembered-device token 为什么也属于 credential revocation 范围?
- 设计一个“账户疑似被接管后 reset password + revoke all sessions”的完整状态转换。