07.2 — JWT 与 OAuth2
定位: 无状态 JWT 认证集成和 OAuth2 授权模式 面试高频度: ⭐⭐⭐⭐⭐ 考查方式: JWT 过滤器实现、Token 续期/失效、OAuth2 模式选择
一、这是什么?为什么需要它?
JWT(JSON Web Token)实现无状态认证,服务器不需要存储 Session 信息。OAuth2 是开放授权标准,允许第三方应用获取有限的资源访问权限。
二、原理拆解
2.1 JWT 过滤器(OncePerRequestFilter)
java
@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) {
String token = extractToken(request);
if (token != null && validateToken(token)) {
String username = parseUsername(token);
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities());
authentication.setDetails(
new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(request, response);
}
private String extractToken(HttpServletRequest request) {
String bearer = request.getHeader("Authorization");
if (bearer != null && bearer.startsWith("Bearer ")) {
return bearer.substring(7);
}
return null;
}
}2.2 Token 续期策略
| 策略 | 说明 | 优缺点 |
|---|---|---|
| Refresh Token | 短生命周期 Access Token + 长生命周期 Refresh Token | 安全,实现复杂 |
| 滑动过期 | 每次请求时,剩余时间 < 阈值则重新签发 | 减少刷新频率 |
| 双 Token 无状态 | Access Token 短期 + 黑名单机制 | 无刷新令牌,需维护黑名单 |
2.3 Token 失效方案
| 方案 | 说明 |
|---|---|
| 黑名单(Redis) | 登出时将 Token 加入 Redis 黑名单 |
| 短有效期 + 频繁刷新 | 有效期 5-15 分钟,配合 Refresh Token |
| 版本号 | 用户密码变更时递增版本号,Token 中包含 |
2.4 OAuth2 授权模式
| 模式 | 适用场景 | 说明 |
|---|---|---|
| 授权码模式 | 第三方 Web 应用 | 最安全,配合 PKCE |
| 客户端凭证模式 | 服务间调用(M2M) | 无需用户参与 |
| 密码模式 | 第一方应用(已淘汰) | 已不推荐 |
| 隐式模式 | SPA(已淘汰) | 改用授权码 + PKCE |
| 设备授权 | 无浏览器设备 | TV、IoT 设备 |
三、面试视角
| 追问 | 答案要点 |
|---|---|
| 无状态 JWT 方案 Spring Security 如何集成? | 自定义 OncePerRequestFilter,解析 Token 后设置 SecurityContext |
| JWT token 如何续期? | Refresh Token 模式或滑动过期 |
| 如何让 token 及时失效? | Redis 黑名单 + 短有效期 |
| 授权码模式和 PKCE 的完整流程? | 请求授权码 -> 授权码换 Token -> Token 访问资源 |
📚 相关链接
- **认证流程与过滤器链** — 过滤器链基础和认证流程
- **方法安全与CSRF** — 方法级 + CSRF
- ← 返回 **返回 Spring Security 索引**