网络安全指北之 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 要轮换

如果你用 cookie 做 session:

  • HttpOnly:不让 JS 读 cookie, 防一类 XSS 直接偷 cookie
  • Secure:只走 HTTPS
  • SameSite:降低 CSRF 风险(别滥用 None)

3) 登录态要轮换, 尤其是关键节点

这些场景要轮换或作废会话:

  • 登录成功(防 session fixation)
  • 改密码 / 重置密码
  • 角色/权限变化
  • 绑定/解绑 MFA
  • 主动登出

4) 认证要对"撞库/暴力破解"有基本免疫力

你不一定立刻上全套风控, 但至少要:

  • 限流 + 失败次数限制
  • MFA(对高价值账号/敏感动作)
  • 不要泄露过多错误信息(比如"账号存在但密码错")

Example:三段你可以直接抄的示例(Java/Go/Python)

下面示例都只想表达一个原则: 别把"登录态"当赠品, 更别让它永久有效

// 典型思路: 用 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
# Django 自带 session + auth, 默认就比"自己拼 cookie"稳很多
# 关键点:
# - 登录后 rotate session key
# - 配好 SESSION_COOKIE_SECURE / HTTPONLY / SAMESITE

明天就能做的 7 件事(Checklist)

  • [ ] 全库搜 token/cookie 打日志AuthorizationSet-Cookieaccess_tokenrefresh_token
  • [ ] 把 access token 过期时间改短:分钟级, 并把 refresh token 轮换做起来
  • [ ] 登录成功强制换 session id:避免 session fixation
  • [ ] 登出必须让 token/session 失效:别只删前端缓存
  • [ ] 改密码/权限变化后作废所有会话:别给旧 token 留后门
  • [ ] cookie 三属性补齐HttpOnly / Secure / SameSite
  • [ ] 登录加限流 + 失败次数限制:至少挡住暴力破解和撞库

延伸思考

你们现在的"登录态"更像哪一种?

  • 一把"短期通行证"(短、可撤销、可轮换)
  • 还是一张"终身会员卡"(发出去就收不回)

扩展阅读


思维导图

@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

Broken Auth & Session Management - 思维导图


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