vault backup: 2026-08-09 19:06:40

This commit is contained in:
2026-08-09 19:06:40 +08:00
parent e2975eb86b
commit 9d664545c9
46 changed files with 7287 additions and 0 deletions
+142
View File
@@ -0,0 +1,142 @@
---
tags: [test/review, auth, pattern, oauth2]
create time: 2026-08-09 12:00
---
# OAuth2 与 JWT — 测试题
## 概述
本测试覆盖 OAuth2 四种授权模式、JWT 结构(Header/Payload/Signature)、HS256 vs RS256、Refresh Token 轮换机制以及 Token 黑名单策略。共 10 道题目(6 选择 + 3 填空 + 1 简答)。
---
## 一、选择题(6道,由浅入深)
> **难度阶梯**: Q1-Q2 基础概念 → Q3-Q4 核心原理 → Q5-Q6 深入应用/边界场景
### Q1(基础)— 考察定义层面
OAuth2 中目前最推荐的安全授权模式是:
A. Authorization Code + PKCE
B. Implicit
C. Password
D. Client Credentials
### Q2(基础)→
以下哪种 OAuth2 授权模式**不需要用户参与**?
A. Authorization Code
B. Implicit
C. Password
D. Client Credentials
### Q3(进阶)— 核心原理
JWT 的 Header + Payload → Signature 的计算过程是:
A. base64UrlEncode(header) + "." + base64UrlEncode(payload),然后用 secret 或私钥签名
B. 直接将三个部分拼接后编码为 Base64
C. 将 payload 用私钥加密
D. 将 header 和 payload 分别签名后拼接
### Q4(进阶)— 比较/辨析
微服务架构为什么推荐 RS256(非对称)而不是 HS256(对称)?
A. RS256 性能更好
B. 每个微服务只需验证公钥而不需要持有签发私钥,即使某个服务被攻陷也无法伪造其他服务的 token
C. HS256 不支持自定义 claim
D. RS256 不需要设置 exp 过期时间
### Q5(深入)— 场景推理
在 Refresh Token 轮换机制中,如果同一个 Refresh Token RT1 被使用了两次(第一次正常刷新生成了 RT2+AT2,第二次攻击者重放了旧的 RT1),第二次的处理策略是什么?
A. 正常刷新生成新的 RT3+AT3
B. 忽略重复请求返回之前的 AT2
C. 级联销毁该用户的所有 token 并要求重新登录
D. 只冻结 RT1 但不影响其他 token
### Q6(深入)— 源码级/边界场景
关于 JWT 的使用,以下哪个做法是错误的?
A. Access Token 设置为短生命周期(如 5~15 分钟)
B. Refresh Token 存放在 HttpOnly Cookie 而非 localStorage
C. 把用户密码放在 JWT payload 中以方便验签时读取
D. RS256 模式下验证方只用公钥本地验签零网络调用
---
## 二、填空题(3道)
### F1 — 填空1
JWT 标准保留声明(Registered Claims)包括六个:`iss`(_____)、`sub`(主题/用户标识)、`aud`(_____)、`exp`(过期时间)、`iat`(签发时间)、`jti`(JWT ID 唯一标识支持撤销)。请填写其中两个中文名称。
> **提示**: iss = Issuer, aud = Audience。
### F2 — 填空2
Token 管理常用的混合策略是:**短生命周期 Access Token(5 分钟)** + 本地校验(无需网络查询);**Refresh Token 存储在_____**每次刷新做一次性校验;特殊场景下的**黑名单**用于主动登出和密码修改后的批量踢人。
> **提示**: 回忆原文 Token 管理混合策略的描述。
### F3 — 填空3
PKCE(Proof Key for Code Exchange)通过 `code_verifier` / `code_challenge` 对替代 `client_secret`,使 Authorization Code 对所有客户端类型(包括无法安全存储 client_secret 的_____ App 和 SPA)都是安全的。
> **提示**: PKCE 解决的问题是让没有秘密的客户端也能安全使用 Authorization Code 模式。
---
## 三、简答题(1道)
### S1
面试官问:"某系统的认证架构如下:前端收到 AT(Access Token)存在 localStorage 中,后端用 HS256 签名,RT(Refresh Token)也放在 localStorage 里每次刷新再生成新 RT。请指出这个设计中的至少三个安全问题并给出改进方案。"
> **答题框架提示**:
> 1. Token 存储位置的安全性
> 2. 签名算法的选择
> 3. Refresh Token 的轮换安全性
> 4. 补充:是否还有其他可改进之处
---
## 参考答案与解析
### 选择题答案
| 题号 | 正确答案 | 解析 |
|------|---------|------|
| Q1 | A | Authorization Code + PKCE 是当前最推荐的方案。Code 在后端交换(浏览器拿不到 token),PKCE 进一步解决了 SPA/Mobile 无法保护 client_secret 的问题。Implicit 已废弃,Password 仅限第一方应用。 |
| Q2 | D | Client Credentials 没有用户参与——客户端用自己的身份(client_id + client_secret)申请令牌。典型场景:后台定时任务、微服务间内部调用、CI/CD 流水线。 |
| Q3 | A | 标准的 JWT 签名计算流程:base64UrlEncode(header) + "." + base64UrlEncode(payload),然后 HMACSHA256 或用 RSA 私钥签名。Base64 是可逆编码不是加密。 |
| Q4 | B | RS256 的核心优势是每个服务只需公钥就能验证——即使某台服务被攻陷,攻击者只有公钥无法伪造 token(因为签名需要私钥)。HS256 要求所有服务共享同一个密钥,任何一台泄漏导致全局崩溃。 |
| Q5 | C | 原文明确:如果同一个 Refresh Token 出现两次,第二次判定为窃听攻击,同时**级联销毁该用户的所有 token 并要求重新登录**。这是最安全的防御策略。 |
| Q6 | C | JWT 只是 Base64 编码而非加密,任何人都可以解码阅读 payload。**绝对不要把敏感信息放在 JWT payload 中**。如果需要保密应使用 JWE(加密型 JWT)。 |
### 填空题答案
| 题号 | 答案 | 解析 |
|------|------|------|
| F1 | `Issuer(签发者)`;`Audience(接收方)` | 六大标准声明中,iss 标识谁签发的,aud 标识谁应该接收这个 token。配合 exp(过期时间)实现完整的生命周期控制。jti 提供撤销能力。 |
| F2 | `Redis` | 混合策略的三段论:① 短 AT 本地验证;② RT 存 Redis 单次校验防重放;③ 黑名单应对特殊情况。这种组合兼顾性能和安全性。 |
| F3 | `移动`(或"Mobile") | RFC 7636 定义的 PKCE 让 Authorization Code 模式适用于所有客户端类型——不仅是传统的有后端的服务,也包括无法安全存储 client_secret 的移动 App 和 SPA。 |
### 简答题参考答案
S1:**参考答案要点**:
1. **localStorage 安全风险**:AT 和 RT 都存在 localStorage 中容易被 XSS 窃取。改进:AT 可以放在内存变量中(页面刷新需重新登录),RT 必须放在 HttpOnly Cookie(JS 无法读取)。
2. **HS256 密钥泄露风险**:所有微服务共享同一个 secret,一旦某台服务器被攻陷全局信任崩溃。改进:改用 RS256,各服务用不同公钥独立验证。
3. **Refresh Token 未旋转**:虽然每次生成新 RT,但如果缺少"同一 RT 出现两次触发级联吊销"的检测,攻击者可以用旧 RT 无限次重放而不会被发现。改进:增加 RT 消费记录检查逻辑。
4. **补充 - 缺少 state 防护**:Authorization Code 回调时未校验 state 参数可能导致 CSRF 攻击。改进:生成随机 state 存 cookie 中,回调时比对。
5. **补充 - 无 token 黑名单**:用户登出或改密码后无法立即吊销已发出的 AT。改进:引入 Redis 黑名单或利用短生命周期 + RT 强制重新认证缓解。
**评分标准**:答出任意 2 个要点即可得满分;完全正确需覆盖全部要点。
## 关联笔记
- [[RBAC 权限模型]]
+142
View File
@@ -0,0 +1,142 @@
---
tags: [test/review, auth, pattern, rbac]
create time: 2026-08-09 12:00
---
# RBAC 权限模型 — 测试题
## 概述
本测试覆盖 RBAC 五张表设计、用户→角色→权限两层映射、超级管理员继承机制、互斥职责分离(SoD)以及动态权限加载流程。共 10 道题目(6 选择 + 3 填空 + 1 简答)。
---
## 一、选择题(6道,由浅入深)
> **难度阶梯**: Q1-Q2 基础概念 → Q3-Q4 核心原理 → Q5-Q6 深入应用/边界场景
### Q1(基础)— 考察定义层面
RBAC 的核心思想是:
A. 直接将用户与权限绑定
B. 将用户与角色关联,而非将用户与权限直接绑定
C. 根据用户的部门自动分配所有权限
D. 基于用户的行为模式动态生成权限
### Q2(基础)→
以下哪个表**不是**标准 RBAC 五张表中的一部分?
A. users(用户表)
B. roles(角色表)
C. user_roles(用户-角色关联表)
D. permissions(权限表)
E. role_hierarchy(角色层级表)
### Q3(进阶)— 核心原理
RBAC 引入角色层相比传统 ACL(Access Control List)的最大优势是什么?
A. 权限检查更快
B. 批量授权更简单——只需改角色的权限映射不影响用户
C. 支持更多种权限码格式
D. 不需要数据库支持
### Q4(进阶)— 比较/辨析
关于 RBAC 中的互斥职责分离(Separation of Duty),以下说法哪个是正确的?
A. 应该在每次鉴权时检查互斥约束
B. 应该在分配角色层校验,而不是每次鉴权时检查
C. 只在创建角色时检查一次就够了
D. SoD 只在财务系统中需要,其他系统不需要
### Q5(深入)— 场景推理
某中型业务系统有约 500 个用户、20 个角色、每种角色 10~30 个权限。以下哪种部署方案最合理?
A. 简单角色 + 硬编码判断即可
B. 标准五表 RBAC + Redis 缓存(O(1) 鉴权)
C. 平台型 SaaS 的每租户自定义角色
D. 只做 ACL 逐个绑定用户和权限
### Q6(深入)— 源码级/边界场景
在查询某用户全部权限并展开角色继承时,如果该用户有一个 `is_super = 1` 的角色,函数应该返回什么?
A. 空列表表示需要进一步展开
B. 该角色的直接权限码列表
C. `["*"]` 表示拥有所有权限
D. 报错"超级管理员不应直接查询权限"
---
## 二、填空题(3道)
### F1 — 填空1
RBAC 五张标准表的 ER 关系是:users 多对多通过 _____ 关联到 roles;roles 多对多通过 _____ 关联到 permissions。这两个关联表是 RBAC 灵活性的关键。
> **提示**: 回想五个表的名称。
### F2 — 填空2
登录时将完整权限树缓存在_____中,鉴权接口只需 O(1) 读取缓存。权限变更时主动删除对应用户的缓存条目实现最终一致。**不要每次都查库**。建议 TTL 设为 _____。
> **提示**: 第一个空填存储技术;第二个空填时间长度。
### F3 — 填空3
金融类强合规系统的 RBAC 部署应包含:标准五表 RBAC + SoD 互斥约束 + 完整的_____日志。审计日志记录每次权限操作以供合规审查。
> **提示**: 四个字的名词,描述安全相关的记录行为。
---
## 三、简答题(1道)
### S1
面试官问:"一个电商后台系统有以下角色需求:运营人员可以查看商品列表但不能编辑;编辑可以修改商品信息但不可删除;管理员拥有所有权限但受 SoD 限制——同一个人不能同时拥有'采购'和'审核'角色。请设计一套 RBAC 方案,包括表结构、权限码命名规范、互斥规则配置以及运行时鉴权流程。"
> **答题框架提示**:
> 1. 角色与权限码设计
> 2. 互斥约束的配置方式
> 3. 鉴权流程与缓存策略
> 4. 异常场景处理
---
## 参考答案与解析
### 选择题答案
| 题号 | 正确答案 | 解析 |
|------|---------|------|
| Q1 | B | RBAC 的核心是将用户与角色关联(而非直接绑定权限)。这层间接大幅降低管理复杂度——调整某个角色的权限只改一处映射,不需要遍历所有用户。 |
| Q2 | E | 标准五表是:users、roles、permissions、user_roles、role_permissions。role_hierarchy 不是独立表——原文用 parent_id 字段在 roles 表中实现层级关系。 |
| Q3 | B | ACL 的问题是批量授权需逐一修改每个用户;RBAC 只需改角色的权限映射。速度不是主要差异,灵活性才是核心价值。 |
| Q4 | B | 原文明确指出:互斥约束应在**分配角色层**校验,而不是每次鉴权时检查。前者是策略问题后者是执行问题——入口处挡住比到处拦击效率高得多。 |
| Q5 | B | 小型系统(<100 用户)可用硬编码;中型系统用标准五表+Redis 缓存;SaaS 需要租户隔离;ACL 不适合超过几个人的规模。500 用户属于中型。 |
| Q6 | C | 当 is_super=1 时直接返回 `["*"]` 表示拥有所有权限。这是递归展开权限时的短路优化——不需要再去查每条具体的权限记录。 |
### 填空题答案
| 题号 | 答案 | 解析 |
|------|------|------|
| F1 | `user_roles`;`role_permissions` | user_roles 是多对中间表(user_id + role_id 联合主键);role_permissions 也是联合主键。没有这两个表用户和权限之间的传递关联就无法建立。 |
| F2 | `Redis`;`2h` | 登录时将完整权限树写入 Redis(TTL=2h),之后每次鉴权 O(1) 读取。权限变更时主动删除对应缓存实现最终一致。不查库是关键性能优化。 |
| F3 | `审计` | 强合规系统必须完整记录所有权限相关操作(谁在什么时候获得了什么权限),审计日志不可篡改且长期保存,用于第三方合规审查。 |
### 简答题参考答案
S1:**参考答案要点**:
1. **角色与权限码设计**:定义三个角色 Admin/Edit/Ops。权限码采用 `{resource}:{action}` 格式,如 `product:read`、`product:update`、`product:delete`、`purchase:create`、`purchase:approve`。Admin 获得 product 全量权限,Edit 只有 update,Ops 只有 read。
2. **互斥约束**:在 conflict_roles 表中插入 `(purchase_role_id, approve_role_id)` 一条互斥规则。用户在分配角色时先查询冲突表,如果已持有其中一个就不能分配另一个。
3. **鉴权流程**:登录时查五表获取用户全部权限码(含角色继承展开),写入 Redis(TTL=2h)。后续请求通过 HTTP Middleware 从 Redis 读取做 O(1) 比对。权限变更时主动删除 Redis 缓存。
4. **异常处理**:SoD 冲突检测失败时返回明确错误信息告知用户哪两个角色互斥。Redis 宕机时 fallback 到查库但不作为常规路径。
**评分标准**:答出任意 2 个要点即可得满分;完全正确需覆盖全部要点。
## 关联笔记
- [[OAuth2 与 JWT]]