Skip to content

模拟一面:SSO 与 Java 后端基础 ​

原创模拟题,不是真实公司面经。对应 项目 A,适合 1–3 年社招练习。项目尚未实现时,回答用“我的设计是”,不能声称处理过线上事故。

建议 45 分钟:项目介绍 5 分钟、协议 15 分钟、后端实现 15 分钟、反问与复盘 10 分钟。下面是答题要点,不是需要逐字背诵的答案。

1. 为什么两个应用可以只登录一次? ​

面试官: 你说接了 SSO,是两个应用共用一张 cookie 吗?

回答主线: 两个应用分别维护自己的会话;第二个应用跳转 IdP 时,IdP 已有用户登录状态,可以完成授权流程而不再要求输入密码。应用拿到自己的授权结果后创建会话,不需要把所有应用的 cookie 设置成同一域。

追问: A 退出后 B 会退出吗?浏览器退出和 IdP 退出一样吗?

进一步回答: 区分应用本地退出、IdP 会话终止和其他应用收到注销通知。说明本项目选择的退出语义、通知失败补偿及残留 token 窗口,不承诺一个删除 cookie 的动作能清掉所有凭证。

常见失分: “JWT 天然就是单点登录”“登录一次把 token 发给所有系统”。

应带证据: 两个应用的脱敏登录时序,分别标出浏览器、BFF、IdP 的会话。

2. state、nonce、PKCE 分别做什么? ​

面试官: 既然有 HTTPS,为什么还需要这些参数?

回答主线: state 关联浏览器发起的授权事务,防止回调被错接并参与 CSRF 防护;nonce 将 ID Token 绑定到登录请求、防止重放;PKCE 把授权码兑换绑定到持有 verifier 的客户端。HTTPS 保护传输,但不替代事务绑定。

服务端保存一次性登录事务、设置有效期,回调验证后消费;使用安全随机值和 PKCE S256。不能把“字段存在”当成“验证成功”。若使用框架,应说明框架做了什么、自己如何验证配置与失败路径。

追问: PKCE 的 verifier 能放在前端日志吗?同一 state 回调两次如何处理?

常见失分: 三个参数都只说“防重放”;把 client_secret 当成 PKCE 替代品。

应带证据: state 不匹配、过期、重复消费,以及 verifier 错误的拒绝测试。协议依据:OIDC Core、OAuth 安全 BCP。

3. ID Token 能当业务 API 的通行证吗? ​

回答主线: ID Token 面向客户端表达认证结果;资源服务器应按约定接受 access token。访问令牌也不保证一定是 JWT。JWT 场景除签名外,还要校验可信 issuer、目标 audience、有效期和允许算法,再做业务资源授权;opaque token 使用相应的服务端验证机制。

追问: token 签名正确,但 aud 是另一个服务,能不能放行?邮箱相同是不是同一个人?

进一步回答: 错 audience 拒绝;身份关联使用可信 issuer 与 subject,邮箱可能变化,也可能来自不同身份源。账号合并必须有明确验证流程。

常见失分: “能 Base64 解码就可信”“有 JWT 就不用查权限”。

应带证据: 错 aud/iss、过期 token 和同邮箱不同 issuer 的用例。

4. Spring Security 与业务权限如何分工? ​

回答主线: 过滤链处理认证与请求级规则;登录客户端与资源服务器是不同职责。业务层还要验证资源归属、租户成员关系和动作权限,不能只靠 URL 级 authenticated()。浏览器基于 cookie 的有状态接口需考虑 CSRF;CORS 不是 CSRF 防护,也不等于服务端授权。

追问: 请求里的 tenant_id 可以直接进入查询条件吗?把鉴权只做在前端有什么问题?

进一步回答: 先验证用户是否是该租户有效成员,再把受信上下文带入资源查询;返回结果与写入目标都受约束。前端隐藏按钮只影响展示,不能阻止直接发请求。

常见失分: “网关鉴权过了,业务服务就不用管资源权限”。

应带证据: 安全配置、服务方法和跨租户集成测试。参考:Spring Security OAuth2。

5. 刷新令牌遇到并发怎么办? ​

面试官: 两个实例同时发现 token 快过期,都去刷新,会发生什么?

回答主线: 依赖提供方的 rotation 语义,可能出现旧令牌失效、重用检测或响应覆盖。按会话协调刷新,配合数据库版本或 CAS 更新,避免旧响应覆盖新状态。Redis 锁只做协调,需要所有者标识、安全释放和超时处理;锁过期不证明旧请求已经停止。

追问: 上游已经刷新成功,响应却丢了,你能恢复 refresh token 吗?

进一步回答: 不能假设可恢复;按提供方语义决定是否可重试,不可确认时使会话进入重新认证流程。不要无限使用旧 refresh token,也不要承诺分布式锁解决网络不确定性。

常见失分: 只回答 synchronized;多实例时仍会竞争。

应带证据: 双实例竞争、锁过期、响应丢失测试及会话状态变化。

6. 数据库约束为什么不能只用代码判断? ​

回答主线: “先查再插”存在并发窗口。身份映射通过 (issuer, subject) 唯一约束维护不变量,幂等操作也有业务范围内唯一键。事务管理本地原子性,但无法让外部 HTTP 请求与数据库天然处于同一事务。

追问: 联合索引怎么设计?事务里调用 IdP 有什么风险?

进一步回答: 从实际查询的过滤与排序出发,结合执行计划和数据量选索引,不把所有字段都索引。外部调用延长事务与持锁时间,超时也不会撤回对方已执行动作;优先把本地状态机和外部调用分开设计。

常见失分: “加事务就能保证第三方接口只执行一次”。

应带证据: DDL、并发用例、查询计划;没有实际数据库就承认仍是设计。

练习评分与复盘 ​

每题 0–3 分:0 分概念错误;1 分能说名词;2 分讲清完整流程与边界;3 分有真实代码或实验支持。总分 18 仅用于自己的复盘,不是公司的录用门槛。

记录三列:我答错了什么、哪份原始资料可验证、下一次用什么测试证明。没有实做证据时,不通过背答案冒充 3 分。

下一轮:Agent 身份与委托授权。