认证、授权与会话:从密码哈希到 OAuth/PKCE 与 IDOR/CSRF 防御
0. 元信息
- 主题路径:
docs/topics/web-security/subtopics/web-security-auth-and-access/ - 父主题:
web-security - 主分类:安全与可靠性
- 辅助分类:Web 与后端
- 适合对象:写登录、API 鉴权、第三方集成的全栈开发者
- 建议周期:1.5~2 周(每周 8~10 小时)
- 前置知识:
network/rest-api-design;理解 HTTP、cookie、JSON - 最终目标:能为应用实现带密码哈希、MFA、Session 或 JWT、OAuth 2.0 + PKCE、对象级授权、CSRF token + SameSite 的完整认证与授权链路,能识别并修复 IDOR、垂直/水平越权、CORS 误配
1. 学习路线
密码哈希(Argon2 / bcrypt)
→ Session vs JWT 的取舍
→ OAuth 2.0 角色与流程
→ PKCE(公共客户端)
→ MFA(TOTP / WebAuthn)
→ 垂直与水平越权
→ IDOR(Insecure Direct Object Reference)
→ CSRF token + SameSite + Origin/Referer 验证
→ CORS 配置
→ JWT 风险(alg 攻击、密钥泄露、撤销)
2. 阶段周数分配
建议周期 8 周,每周 6 天、每天 1.5~2 小时(每周约 9~12 小时),第 7 天用于复盘和补测:第 1 周基础模型与威胁边界;第 2~3 周核心机制;第 4~5 周防御实现;第 6 周检测、测试与审计;第 7 周综合演练;第 8 周项目收尾、复盘与最终验收。
3. 九阶段表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1. 密码哈希 | Argon2id、bcrypt、salt、stretching、breach 检查 | 替换 MD5/SHA1 哈希;接 HIBP API | 同一密码两次哈希结果不同;密码永不明文落地 |
| 2. Session | 服务端 Session、Secure/HttpOnly/SameSite、固定攻击 | 服务端 Session 改造 | Session ID 重生于登录后;cookie 三属性齐全 |
| 3. JWT 风险 | alg=none、kid 注入、密钥混淆、撤销难题 | 安全签发与验签 | 强制算法白名单;服务端签名验证;密钥长度足够 |
| 4. OAuth 2.0 + PKCE | Authorization Code、PKCE S256、state | 客户端 + 服务端最小 OAuth 流 | 公共客户端也用 PKCE;redirect_uri 严格白名单 |
| 5. MFA | TOTP、WebAuthn/FIDO2、备份码 | TOTP 注册与登录 | 二次因子强制;恢复码一次性 |
| 6. 垂直越权 | RBAC、管理员路径保护 | 对象级授权中间件 | 普通用户访问 admin 返回 403 |
| 7. 水平越权 / IDOR | URL 改 ID 越权 | 所有对象访问走同一授权函数 | 跨用户读取返回 403 或 404 |
| 8. CSRF | token、SameSite、Origin/Referer 校验 | CSRF token 中间件 | 跨域 POST 必须 token + SameSite + Origin |
| 9. CORS | 简单/预检、Access-Control-Allow-Origin | CORS 中间件白名单 | 不出现 * + credentials;Vary: Origin |
关键陷阱:JWT 不是 Session 的替代;CSRF token 单独不够,需要配合 SameSite 与 Origin 校验;OAuth 公共客户端必须用 PKCE;对象级授权要”以属于当前用户为前提”。
4. 第一周:基础与威胁建模(每天 1.5~2 小时)
| Day | 任务 | 产出 | 自检 |
|---|---|---|---|
| 1 | 从 §1 首个知识点画信任边界,列出 5 个资产和 5 个攻击面 | notes/day1.md,含资产/攻击面表 | test -s notes/day1.md && grep -c "攻击面" notes/day1.md 输出 ≥1 |
| 2 | 阅读 §3 阶段 1,针对 3 个概念各写定义、前置条件和失败后果 | notes/day2.md,至少 3 个小节 | grep -c "失败" notes/day2.md 输出 ≥3 |
| 3 | 用本地最小示例复现一个不安全行为,再写修复前后差异 | notes/day3.md 与 notes/day3-output.txt | `test -s notes/day3-output.txt && grep -E “before |
| 4 | 依据 §3 阶段 2 写一张请求/数据流时序图 | notes/day4.md,含 Mermaid 图 | grep -q "mermaid" notes/day4.md |
| 5 | 为 3 个边界条件设计测试,并执行命令记录结果 | notes/day5.md,含输入/期望/实际 | grep -c "期望" notes/day5.md 输出 ≥3 |
| 6 | 将一条防御规则实现为可运行脚本或配置,并记录命令 | notes/day6.sh 或 notes/day6.json、notes/day6.md | test -s notes/day6.md && grep -q "运行" notes/day6.md |
| 7 | 回顾 Day 1~6,写 300 字复盘并列出 10 个自测问答 | notes/week1-retrospective.md | wc -w notes/week1-retrospective.md ≥300 且 grep -c "问:" ≥10 |
5. 阶段通用验收
- 阶段 1 验收:完成概念地图;提交威胁模型;能用 10 分钟解释核心资产、信任边界和主要攻击面。
- 阶段 2 验收:完成核心机制最小实现;提交 3 组正向与负向测试;测试输出包含成功和拒绝结果。
- 阶段 3 验收:完成防御实现;提交配置/代码审计清单;所有高风险输入均经过验证、编码或安全 API。
- 阶段 4 验收:完成检测或安全测试规则;提交日志/扫描/测试输出;能从证据定位触发点和影响范围。
- 阶段 5 验收:完成一次事件或攻击链演练;提交时间线、处置动作和恢复验证;复现者按 README 可独立运行。
- 阶段 6 验收:完成综合项目核心功能;边界测试全通过;README、
notes/design.md、notes/test.md、notes/retrospective.md均存在且非空。 - 阶段 7~8 验收:修复复盘发现的问题;重新执行全部命令;最终报告记录版本、命令和结果。
6. 最终验收
学完后应能完成威胁建模、选择合适的安全机制、实现最小防御链路、编写负面测试、读取日志或扫描证据,并向团队解释安全权衡和残余风险。
量化标准:
- 完成至少 24 道相关练习,其中 12 道基础、8 道中等、4 道综合/高难;每题保留测试或答案证据。
- 独立写出至少 4 个可运行 demo,每个包含成功路径和至少 3 个拒绝/异常测试。
- 完成 1 次 60 分钟攻击—防御演练,能在 15 分钟内讲清威胁模型、核心流程和修复理由。
- 综合项目的自动化检查通过率 100%,高危问题数 0,README 可让他人在 10 分钟内复现。
7. 综合项目
首选项目:安全 Web 服务实验室(本主题对应的 “)。实现一个最小 HTTP/API 服务,故意保留一条可控弱点,再用安全实现和自动化测试修复它。
备选项目:安全审计 CLI。读取请求、配置或依赖清单,输出风险、证据、严重性和修复建议。
必做要求:
- 输入:明确的 JSON/HTTP 请求、配置文件或依赖清单;拒绝缺失字段、超长值、非法编码和越权对象。
- 输出:机器可读 JSON 报告或 API 响应,并包含状态、错误码、证据、修复建议;日志不得泄露密码、令牌或密钥。
- 算法/工具:按 §3 选择标准库安全 API、参数化查询、策略匹配、哈希/签名、规则扫描或事件时间线;在 README 说明选择理由与复杂度/局限。
- 验收标准:成功路径通过;至少 10 个边界/负面测试通过;高风险输入被拒绝;运行静态检查或扫描无新增高危;输出可复现。
项目根目录必须包含 README.md、notes/design.md、notes/test.md、notes/retrospective.md。README 需写需求说明、数据结构/工具选择理由、核心流程、模块化实现、边界测试、编译/运行说明、目录结构和复盘记录;notes/design.md 写威胁模型与流程图,notes/test.md 写每组输入/期望/实际输出,notes/retrospective.md 写用时、难点、收获和下一步。
本主题贡献
- 职责 1(密码哈希 + MFA + 泄露检查):登录服务唯一用 Argon2id(
m=64MiB, t=3, p=1,§3 阶段 1)替换历史 MD5/SHA1;注册与改密路径强制走 HIBPk-Anonymity前缀查(§9.4 #8);TOTP 二次因子对“改密码 / 改支付 / 登出全部设备”强制启用(§3 阶段 5、§9.3.5)。 - 职责 2(OAuth 2.0 + PKCE 公共客户端):对外的第三方登录(GitHub / Google)走 Authorization Code + PKCE S256,
code_verifier ≥ 43字符随机;redirect_uri走服务端硬编码白名单(§9.4 #4);access token 短 TTL + refresh token + 服务端撤销列表,敏感操作重新认证。 - 职责 3(对象级授权 + CSRF + CORS):所有
GET/PUT/DELETE /resource/:id走同一authorize(user, resource)中间件——跨用户读返回 403/404(不泄露存在性,§9.4 #3);CSRF 防御叠加 token +SameSite=Lax/Strict+ Origin/Referer 校验(§9.4 #5);CORS 白名单显式Access-Control-Allow-Origin,禁止*+credentials: true(§9.4 #6、§10 误区)。 - 交付物 1:可运行 demo
apps/auth-lab/提供“注册 → 登录 → MFA 注册 → 改密 → OAuth+PKCE 登录”完整 happy path + 10 个负面用例(含 alg=none JWT、IDOR、CSRF、CORS*+credentials、Session 固定等,对应 §9.4 表)。 - 交付物 2:
packages/auth暴露hashPassword/verifyPassword/signJWT/verifyJWT/authorize/requireRole六个 API;verifyJWT强制算法白名单(HS256/RS256,禁none,§9.4 #2)。 - 交付物 3:
notes/test.md至少 12 条测试用例覆盖 §9.4 表 #1~#10;notes/design.md含威胁模型 + 时序图(mermaid)。 - 交付物 4:CI 中跑
npm audit+ 自写脚本扫描 JWT 头(alg、kid注入)、CORS 配置(Access-Control-Allow-Origin: *与 credentials 共存即失败)、cookie 属性(Set-Cookie必须含Secure; HttpOnly; SameSite)。 - 指标 1:JWT 验签 100% 拒绝
alg=none与错误算法(CI 用 100 个恶意 token 样本断言零通过);Argon2id 在中端 CI 单次 hash ≤300ms。 - 指标 2:对象级授权中间件覆盖率 100%——所有
GET/PUT/DELETE /resource/:id必须 importauthorize,CI 用ast-grep规则扫缺失即红。 - 指标 3:CORS 配置零容忍——
Access-Control-Allow-Origin: *与credentials: true共存 0 次(CI 静态扫描强制),OAuthredirect_uri命中率 100%(白名单匹配才放行)。
8. 推荐开源资料
| 阶段 | 角色 | 资料名 | 链接 | 用法 |
|---|---|---|---|---|
| 1 | 入门 | OWASP Web Security Testing Guide | https://owasp.org/www-project-web-security-testing-guide/ | 按主题阅读测试方法并转成自己的检查项 |
| 2 | 官方文档 | MDN Web Security | https://developer.mozilla.org/en-US/docs/Web/Security | 查阅浏览器安全机制、Cookie、CORS、CSP |
| 3 | 规范/标准 | OWASP Cheat Sheet Series | https://cheatsheetseries.owasp.org/ | 实现前逐条对照防御清单 |
| 4 | 工具/源码 | OWASP ZAP | https://www.zaproxy.org/ | 对本地项目做代理扫描,保存报告 |
| 5 | 练习平台 | PortSwigger Web Security Academy | https://portswigger.net/web-security | 完成对应实验并记录请求、漏洞和修复 |
| 6 | 参考标准 | NIST Cybersecurity Framework | https://www.nist.gov/cyberframework | 将检测、响应和恢复动作映射到流程 |
许可证提示:使用 OWASP、ZAP 或其他开源资料与源码前,先打开仓库或页面的 LICENSE/版权说明;默认只引用链接和思路,复制代码时保留版权与许可证文本。
默认使用顺序:先读 §1 与 OWASP 入门资料建立模型 → 用 MDN/规范查 API 和约束 → 在本地项目实现 → 用 ZAP 或对应扫描工具验证 → 到 PortSwigger 做练习 → 将证据和复盘写入
notes/。
9. 学习资料汇聚(v0.3 自包含)
9.1 背景与动机
OWASP Top 10 2021 把”A07 Identification and Authentication Failures”与”A01 Broken Access Control”列为前两位。它们覆盖了”你是谁”和”你能做什么”两个核心问题。
历史上踩过的坑:
- 2012 LinkedIn:650 万 SHA1 哈希无 salt 泄露,几天内被破;
- 2017 Equifax:管理后台越权访问 1.4 亿用户;
- 2018 Facebook Access Token 大规模泄露:View As 漏洞;
- 2019 Capital One:SSRF 到 AWS 元数据 + IAM 角色越权;
- 2023 Okta 客户支持系统:HAR 文件含 session token 泄露。
这些事件的共同点:密码弱哈希、对象授权缺失、token 管理失误、CORS/CSRF 配置松。本子主题逐一拆解。
9.2 概念地图
flowchart LR
AuthN[认证 AuthN] --> Pwd[密码哈希]
AuthN --> Session[Session]
AuthN --> JWT
AuthN --> OAuth[OAuth 2.0]
AuthN --> MFA[TOTP / WebAuthn]
Pwd --> Argon2[Argon2id]
Pwd --> Bcrypt[bcrypt]
Pwd --> Breach[泄露检查 HIBP]
Session --> Cookie[Cookie: Secure/HttpOnly/SameSite]
JWT --> Alg[alg 白名单]
JWT --> Kid[kid 注入]
JWT --> Revoke[撤销与黑名单]
OAuth --> Code[Authorization Code]
OAuth --> PKCE
OAuth --> State
OAuth --> Scope
OAuth --> Redirect[redirect_uri 白名单]
AuthZ[授权 AuthZ] --> RBAC
AuthZ --> ABAC
AuthZ --> ObjectAuth[对象级授权]
AccessCtrl[访问控制] --> Vertical[垂直越权]
AccessCtrl --> Horizontal[水平越权/IDOR]
CSRF[CSRF] --> Token[CSRF token]
CSRF --> SameSite
CSRF --> Origin[Origin/Referer 校验]
CORS[CORS] --> Simple[简单请求]
CORS --> Preflight[预检 OPTIONS]
CORS --> AllowOrigin[Allow-Origin 白名单]
CORS --> Credentials[credentials]
关系说明:认证回答”你是谁”;授权回答”你能做什么”;对象级授权覆盖单条资源;CSRF 与 CORS 处理跨域身份传递。OAuth 解决”代用户授权第三方”,不是认证协议本身。
9.3 基础知识讲解
9.3.1 经典论文 / 标准
主推:OWASP Auth/AuthZ/CSRF Cheat Sheet + RFC 6749/7636。备查:JWT Cheat Sheet、TOTP RFC、WebAuthn。
9.3.2 经典书籍
| 资料 | 角色 | 评分 | 链接 |
|---|---|---|---|
| OAuth 2.0 in Action (Justin Richer) | OAuth 协议实战 | 5 | https://www.manning.com/books/oauth-2-in-action |
| API Security in Action (Neil Madden) | API 安全全景 | 4 | https://www.manning.com/books/api-security-in-action |
| Iron-Clad JavaScript (Jim Manico) | JS 安全编码 | 4 | https://web.archive.org/web/2024*/manning.com/books/iron-clad-javascript |
| Cryptography Engineering (Ferguson 等) | 加密工程(含认证) | 4 | https://www.schneier.com/books/cryptography-engineering/ |
主推:Richer《OAuth 2.0 in Action》。备查:Madden《API Security in Action》、Manico《Iron-Clad JavaScript》。
9.3.3 优秀博客 / 文档
| 资料 | 角色 | 评分 | 链接 |
|---|---|---|---|
| PortSwigger Web Security Academy — Access Control | 互动实验 | 5 | https://portswigger.net/web-security/access-control |
| PortSwigger Web Security Academy — CSRF | 互动实验 | 5 | https://portswigger.net/web-security/access-control |
| Auth0 Docs | OAuth/JWT 实战 | 4 | https://auth0.com/docs |
| Okta Developer — OAuth 2.0 | OAuth 实战 | 4 | https://developer.okta.com/docs/reference/api/oidc/ |
| OWASP OAuth 2.0 Cheat Sheet | OAuth 修复模式 | 4 | https://cheatsheetseries.owasp.org/cheatsheets/OAuth2_Cheat_Sheet.html |
| Have I Been Pwned (HIBP) | 密码泄露检查 | 4 | https://haveibeenpwned.com/ |
| Mozilla MDN — SameSite cookies | SameSite 行为 | 4 | https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite |
主推:PortSwigger Academy(Access Control + CSRF)+ Auth0 Docs。备查:Okta、OWASP OAuth Cheat Sheet、MDN SameSite。
9.3.4 核心人物
| 人物 | 贡献 | 关键出处 |
|---|---|---|
| Justin Richer | OAuth 2.0 in Action、IETF OAuth WG | apisyouwonthate.com |
| Dick Hardt | OAuth 2.0 推动者 | OAuth 历史演讲 |
| Nat Sakimura | OAuth / JWT 推广 | sakimura.org |
| John Bradley | OAuth / WebAuthn 推动 | RFC 6749、7636 |
| Jim Manico | OWASP 联合创始人、Iron-Clad JavaScript | manico.net |
| Neil Madden | API Security in Action | neilmadden.blog |
主推:Justin Richer、Jim Manico。备查:Nat Sakimura、John Bradley、Neil Madden。
9.3.5 开发方法
| 方法 | 适用 | 关键点 |
|---|---|---|
| Hash with Argon2id | 密码 | t ≥ 3, m ≥ 64 MiB, p ≥ 1;或 bcrypt cost ≥ 12 |
| Session regeneration | 防 Session 固定 | 登录后换 ID;登出销毁 |
| JWT verify strict | 防 alg 攻击 | 强制算法白名单;服务端签发;密钥长度足够 |
| PKCE S256 | 公共客户端 | code_challenge_method=S256;code_verifier ≥ 43 字符 |
| Object auth in one function | 防 IDOR | 所有 GET/PUT/DELETE /resource/:id 走同一 authorize(user, resource) |
| SameSite=Lax + token | 防 CSRF | 表单 POST 同时验证 token 与 Origin/Referer |
| CORS allowlist | 防跨域窃取 | 不写 *;用 Vary: Origin;credentials 必须显式 origin |
| MFA optional but enforced for sensitive ops | 提升安全 | 改密码、改支付、登出全部设备等敏感操作强制 MFA |
9.4 经典问题与经典案例
| # | 问题 | 为什么重要 | 最简答案或证据 |
|---|---|---|---|
| 1 | LinkedIn SHA1 无 salt | 650 万密码几天内被破 | 用 Argon2id/bcrypt + 强制 salting;落 HIBP 检查 |
| 2 | JWT alg: none 与密钥混淆 | 攻击者伪造 token | 强制 alg 白名单;服务端签发 + 验证 |
| 3 | IDOR 越权读他人订单 | 改 ID 就越权 | 对象级授权中间件;返回 403/404 而非泄露存在性 |
| 4 | OAuth 公共客户端无 PKCE | authorization code 被截获 | 强制 PKCE S256;code_verifier 一次性 |
| 5 | CSRF 借表单自动提交 | 登录态下被诱骗转账 | CSRF token + SameSite=Strict/Lax + Origin/Referer 校验 |
| 6 | CORS * + credentials | 跨域任意源读敏感响应 | 不允许 * 与 credentials 同存;用白名单 origin |
| 7 | Session 固定 | 攻击者预置 session ID 诱骗登录 | 登录后重新生成 session ID;旧 ID 失效 |
| 8 | 弱密码策略 | 123456 / password 进入系统 | 最小长度 12 + 常见密码列表拦截 + 泄露检查 |
| 9 | TOTP seed 明文存数据库 | 数据库泄露后 2FA 也失效 | seed 用 KMS 加密;服务端能重新签发 |
| 10 | Facebook View As token 泄露 | 1 亿用户 access token 外泄 | 每次发 token 走授权中间件;区分”谁能拿到什么” |
9.5 学习难点
概念难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| Session vs JWT | 各有取舍 | Session:服务端可撤销;JWT:跨服务但难撤销;选场景匹配 |
| OAuth 不是认证协议 | 经常被当 OIDC | OAuth 授权;OIDC 在 OAuth 上加 ID Token |
| CSRF 与 CORS 混 | 都涉及”跨域” | CSRF:身份被借;CORS:资源被借;目标不同 |
思维难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| “我们已经登录了,安全了” | 没区分认证与授权 | 每个对象都过授权函数;区分”我是谁”和”我能拿这个资源吗” |
| “JWT 永不过期方便” | 难撤销 | 短 TTL + refresh token + 黑名单;敏感操作重新认证 |
| “前端隐藏就算防了” | API 自己也要鉴权 | 后端独立校验;前端仅做 UX |
工程难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 旧系统密码哈希升级 | 历史用户密码无法改 | 登录时检测哈希算法;下次登录升级;强制重置触发升级 |
| OAuth 集成兼容 | 第三方库 bug | 用成熟库(Auth0 SDK、NextAuth);自己写最少代码;写集成测试 |
| MFA 强制执行难 | 用户抱怨 | 风险分层:敏感操作强制;非敏感场景给恢复码 |
| CORS 调试 | 浏览器缓存 / 预检失败 | 显式 Vary: Origin;抓 OPTIONS 请求;服务器日志 |
9.6 技术标准与接口
9.6.1 Entity
| 名称 | 版本 | 组织 | 状态 | 许可证 |
|---|---|---|---|---|
| OWASP Top 10 | 2021 | OWASP | 现行 | CC BY-SA 4.0 |
| OWASP ASVS | 4.0.3 | OWASP | 现行 | CC BY-SA 4.0 |
| RFC 6749 — OAuth 2.0 | 2012 | IETF | 现行 | 公开 |
| RFC 7636 — PKCE | 2015 | IETF | 现行 | 公开 |
| RFC 6750 — Bearer Token | 2012 | IETF | 现行 | 公开 |
| RFC 6235 — SameSite | draft | IETF | 草案 | 公开 |
| RFC 6265 — Cookies | 2011 | IETF | 现行 | 公开 |
| RFC 6238 — TOTP | 2011 | IETF | 现行 | 公开 |
| WebAuthn Level 2 | 2024 | W3C | 推荐 | 公开 |
| FIDO2 / CTAP2 | 持续 | FIDO Alliance | 现行 | 公开 |
| Argon2 | RFC 9106 | IETF | 现行 | CC BY 4.0(参考实现) |
| bcrypt | Niels Provos | - | 事实标准 | 公开 |
| JWT | RFC 7519 | IETF | 现行 | 公开 |
9.6.2 Scope
- OAuth 2.0:授权框架,不定义认证;
- OIDC:在 OAuth 上加 ID Token 与 UserInfo,提供认证;
- PKCE:公共客户端防截获 authorization code;
- JWT:自包含令牌,撤销是难题;
- Session:服务端状态,撤销容易但跨服务麻烦;
- WebAuthn:浏览器侧 FIDO2,强认证;
- SameSite cookie:浏览器侧限制第三方 cookie,CSRF 防线之一。
9.6.3 Structure
必会字段、接口、API:
- HTTP 头:
Set-Cookie: __Host-id=...; Secure; HttpOnly; SameSite=Strict; Path=/; - OAuth:
response_type=code、code_challenge、code_challenge_method=S256、scope、state、redirect_uri; - JWT:
alg、kid、exp、iat、nbf、aud、iss; - Argon2id 参数:t、m、p;
- bcrypt cost factor;
- TOTP:secret(base32)、period、digits;
- WebAuthn:challenge、rpId、user verification。
9.6.4 Ecosystem
- 认证库:Auth0、NextAuth、Passport.js(Node)、Spring Security、Spring Authorization Server、Keycloak、ORY Hydra;
- OAuth 服务:Okta、Auth0、AWS Cognito、Keycloak;
- 密码哈希:argon2(Node/Python/Rust)、bcrypt、libsodium;
- JWT:jsonwebtoken、jose、PyJWT、go-jwt;
- MFA:otplib(TOTP)、SimpleWebAuthn、WebAuthn 库;
- CORS:cors(Express)、Django CORS、Spring CORS;
- 事实标准 vs 标准本身:浏览器 SameSite 默认值、CORS preflight 行为;这些不是 RFC 但部署时要考虑。
9.6.5 Depth Tiers
| 层级 | 能力 |
|---|---|
| L0 | 知道密码哈希、Session、JWT、OAuth、CSRF、CORS 是什么 |
| L1 | 看懂一段含 PKCE、SameSite、CORS 的代码 |
| L2 | 能为新功能实现 Argon2id、Session、MFA、对象授权、CSRF 防护 |
| L3 | 能解释 JWT 撤销难题、OAuth PKCE 必要性、IDOR 修法、CORS 与 credentials 互斥 |
| L4 | 能设计企业级身份治理、S-SDLC 与零信任访问 |
本计划目标:L3。
9.6.6 Source
- OWASP 仓库:https://github.com/OWASP/
- IETF RFC Editor:https://www.rfc-editor.org/
- W3C WebAuthn:https://www.w3.org/TR/webauthn-2/
- Auth0 文档:https://auth0.com/docs
- 引用版本快照日期:2026-07-30。
10. 常见误区
- 用 MD5 / SHA1 哈希密码;
- 密码明文写日志;
- JWT
alg: none接受; - 不区分 access token 与 refresh token;
- refresh token 永不过期;
- OAuth 公共客户端不用 PKCE;
- redirect_uri 不做白名单(
https://attacker.com也能拿 code); - 认证后不做对象级授权(任何登录用户都能改任何资源);
- CSRF 只靠 SameSite;token + Origin 校验仍必要;
- CORS
*+credentials: true; - “前端已经隐藏就算安全”;
- 用 GET 请求做状态变更;
- TOTP secret 明文存数据库;
- 强制 MFA 但提供弱恢复路径;
- WebAuthn 不验证 challenge 一次性。
11. 所有知识点分类(统一规则)
- 编程语言
- 数据结构与算法
- 计算机基础
- 工程技术
- Web 与后端
- 前端与客户端
- 数据与人工智能
- 项目与职业能力
- 安全与可靠性
本计划归属:安全与可靠性 主 + Web 与后端 辅。