Skip to content

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 索引**

Knowledge4J — Java 知识库