网络安全指北之 Broken Auth and Session Management:登录与会话管理翻车指南
Posted on Fri 06 March 2026 in Tech • 2 min read
| Abstract | Broken Auth and Session Management:登录与会话管理翻车指南 |
|---|---|
| Authors | Walter Fan |
| Category | tech note |
| Status | v1.0 |
| Updated | 2026-03-06 |
| License | CC-BY-NC-ND 4.0 |
Broken Auth and Session Management:登录与会话管理翻车指南
一句话版:你以为你在"做登录", 攻击者在"捡你的登录态"。
很多安全事故听起来像大片: "黑客攻破系统"、"0day 横扫全网"。但落到 Auth/Session 这摊事, 更多时候是另一种尴尬:
- 你把 token 放在了最容易被偷的地方
- 你把 cookie 当成了默认安全
- 你把"登出"做成了心理安慰
- 你把"短期会话"用成了"永久通行证"
这类问题在 OWASP Top 10 里来来回回换名字: 2017 年叫 "Broken Authentication and Session Management", 2021 年合并为 A07 "Identification and Authentication Failures"。名字变了, 事故没变。
What:到底什么算 Broken Auth / Broken Session
🟢 小白提示:先分清两个词, 不然越聊越乱。
- Authentication(认证):你是谁, 你能不能证明你是你
- Session(会话/登录态):你登录之后, 服务器怎么"记住你"
所谓 Broken Auth / Broken Session, 常见是这些翻车形态:
- 弱口令/暴力破解:没限流、没锁定、没 MFA, 还把错误提示写得像教学视频
- 凭证泄露:token/cookie 出现在日志、前端存储、URL 参数、埋点里
- 会话固定(session fixation):登录后不换 session id, 攻击者提前种一个 id 等你登录
- 会话不失效:登出不作废、改密码不作废、权限变化不作废、长期不旋转
- cookie 配置不当:没
HttpOnly、没Secure、SameSite 乱设 - JWT 乱用:把 JWT 当 session 用, 还不设过期, 或者撤销做不起来
Why:它为什么总能翻车(而且翻得很安静)
1) "登录"让人产生错觉
用户一登录, 开发者就容易默认: "既然登录了, 那后面应该都安全"。
但登录解决的是"你是谁", 没解决的是:
- token/cookie 会不会被偷
- 被偷了以后你能不能让它失效
- 失效后你有没有退路(比如重新登录、二次验证)
2) 会话是跨边界流动的
浏览器、网关、服务端、日志、APM、第三方 SDK, 每个环节都可能"顺手记录一下"。
只要其中一环把 token 当普通字符串处理, 你的登录态就变成了"可复制粘贴的钥匙"。
3) 你没把"撤销"当成一等公民
很多系统做了签发, 没做撤销。
于是你只能祈祷:
- token 别泄露
- 泄露了别被用
- 被用了别造成损失
这套祈祷链路, 通常不太灵。
🔵 老手自查:你们能回答这三个问题吗?
- 我们的 access token 泄露后, 多久能彻底失效?
- 用户改密码/解绑 MFA/角色变化后, 旧 token 会不会立刻作废?
- 我们能不能查到"这个 token 在哪里被用过"(IP/UA/设备指纹/trace_id)?
How:把 Auth/Session 做稳, 先记住四条底线
1) token 只做两件事: "短" 和 "可撤销"
- 短:access token 尽量短(分钟级), refresh token 才能长(天级)
- 可撤销:refresh token 必须可撤销(可存储、可轮换、可失效)
🟢 小白提示:为什么 JWT 常被骂?
JWT 本身没错, 错在很多人把它当"无需存储的永久会话"。你只要撤销做不好, JWT 就会变成"发出去就收不回的通行证"。
🟢 小白提示:那 JWT 应该怎么做才算"能用且能收回"?
把下面四件事做对, 你就把"撤销"从口号变成机制:
- access token 短命(分钟级):泄露了也只能用一小会儿
- refresh token 可撤销:需要有状态(落库/缓存都行), 登出/改密/解绑 MFA/权限变化时直接吊销
- refresh token 轮换(rotate):每次刷新都换新 refresh token, 旧的立刻作废, 防止被偷后反复用
- JWT 别当永久身份证:要有过期时间, 签名 key 要轮换
2) cookie 不是默认安全, 该上的属性一个都别省
如果你用 cookie 做 session:
HttpOnly:不让 JS 读 cookie, 防一类 XSS 直接偷 cookieSecure:只走 HTTPSSameSite:降低 CSRF 风险(别滥用None)
3) 登录态要轮换, 尤其是关键节点
这些场景要轮换或作废会话:
- 登录成功(防 session fixation)
- 改密码 / 重置密码
- 角色/权限变化
- 绑定/解绑 MFA
- 主动登出
4) 认证要对"撞库/暴力破解"有基本免疫力
你不一定立刻上全套风控, 但至少要:
- 限流 + 失败次数限制
- MFA(对高价值账号/敏感动作)
- 不要泄露过多错误信息(比如"账号存在但密码错")
Example:三段你可以直接抄的示例(Java/Go/Python)
下面示例都只想表达一个原则: 别把"登录态"当赠品, 更别让它永久有效。
Java (Spring Security):会话 cookie 的三件套
// 典型思路: 用 Spring Security 的默认能力, 别自己造轮子
// 重点在 cookie 属性(具体配置方式会随版本略有差异)
//
// 你至少要保证:
// - Secure
// - HttpOnly
// - SameSite=Lax/Strict (按业务取舍)
给你一个“能直接抄”的例子(示意用, 不是唯一解)。
如果你用的是 Session Cookie,我一般会先把 cookie 三属性立规矩(尤其是测试环境也别裸奔):
# application.yml (示例)
server:
servlet:
session:
cookie:
http-only: true
secure: true
same-site: Lax # 能用 Lax 就别上 None; 真跨站再评估
如果你用的是 JWT + Refresh Token,关键不是“JWT 发出去”,而是“refresh token 收得回来”:
- access token:10-15 分钟过期
- refresh token:落库/缓存保存状态(是否吊销、过期、是否已被轮换替换)
- 登出/改密/解绑 MFA/权限变化:直接把该用户(或该设备)的 refresh token 标记为 revoked
- 刷新时 rotate:返回新 refresh token,同时把旧的标记为 used/replaced,旧的再来刷新就直接拒绝
Go:refresh token 轮换 + 撤销(别只发 access token)
// 思路示意:
// 1) access token 短期(比如 15 分钟)
// 2) refresh token 长期(比如 7 天), 存 DB, 每次刷新都轮换
// 3) 登出/改密码/风控触发 -> 直接 revoke refresh token
Python (Django):用内置会话机制, 别手写 cookie
# Django 自带 session + auth, 默认就比"自己拼 cookie"稳很多
# 关键点:
# - 登录后 rotate session key
# - 配好 SESSION_COOKIE_SECURE / HTTPONLY / SAMESITE
明天就能做的 7 件事(Checklist)
- [ ] 全库搜 token/cookie 打日志:
Authorization、Set-Cookie、access_token、refresh_token - [ ] 把 access token 过期时间改短:分钟级, 并把 refresh token 轮换做起来
- [ ] 登录成功强制换 session id:避免 session fixation
- [ ] 登出必须让 token/session 失效:别只删前端缓存
- [ ] 改密码/权限变化后作废所有会话:别给旧 token 留后门
- [ ] cookie 三属性补齐:
HttpOnly/Secure/SameSite - [ ] 登录加限流 + 失败次数限制:至少挡住暴力破解和撞库
延伸思考
你们现在的"登录态"更像哪一种?
- 一把"短期通行证"(短、可撤销、可轮换)
- 还是一张"终身会员卡"(发出去就收不回)
扩展阅读
- OWASP ASVS (认证与会话的系统化检查表)
- OWASP Session Management Cheat Sheet (会话管理细节)
- OWASP Authentication Cheat Sheet (认证常见坑)
思维导图
@startmindmap
<style>
mindmapDiagram {
node { BackgroundColor #FAFAFA }
:depth(0) { BackgroundColor #FFD700 }
:depth(1) { BackgroundColor #E3F2FD }
:depth(2) { BackgroundColor #F5F5F5 }
}
</style>
title Broken Auth & Session Management
* Auth/Session 翻车
** What(形态)
*** 弱口令/暴破/无 MFA
*** 凭证泄露(token/cookie/URL/log)
*** session fixation
*** 会话不失效(登出/改密/权限变更)
*** cookie 属性缺失
*** JWT 乱用(不可撤销/过期过长)
** Why(根因)
*** 把"登录"当万能钥匙
*** 登录态跨边界流动
*** 撤销不是一等公民
** How(底线)
*** token 短 + 可撤销
*** cookie: HttpOnly/Secure/SameSite
*** 关键节点轮换/作废
*** 限流 + 失败次数 + MFA
** Action Checklist
*** 扫日志泄露
*** access token 变短
*** refresh token 轮换+撤销
*** 登出/改密/权限变更作废会话
@endmindmap

本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。