前後端分離核心在於**後端無狀態化**:不再依賴 Session 儲存用戶狀態,而是簽發自包含的 JWT (JSON Web Token),前端攜帶 Token 請求,後端驗證解析即可識別用戶。本文基於 Spring Boot 2.x/3.x 實現完整認證流程:登入簽發 → 過濾器驗證 → 權限控制 → 跨域支援。
@Component
public class JwtUtil {
private final String secret = "base64EncodedSecretKeyAtLeast256BitsLongForHS256"; // 生產環境從配置讀取
private final long expirationMs = 3600_000; // 1小時
public String generateToken(String username, String roles) {
return Jwts.builder()
.setSubject(username)
.claim("roles", roles)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + expirationMs))
.signWith(Keys.hmacShaKeyFor(secret.getBytes()), SignatureAlgorithm.HS256)
.compact();
}
public Claims parseToken(String token) {
return Jwts.parserBuilder()
.setSigningKey(Keys.hmacShaKeyFor(secret.getBytes()))
.build()
.parseClaimsJws(token)
.getBody();
}
public boolean validateToken(String token) {
try { parseToken(token); return true; }
catch (JwtException | IllegalArgumentException e) { return false; }
}
}
login(@RequestParam String username, @RequestParam String password) {
// 實際應查詢資料庫驗證密碼 (BCrypt)
if (!"admin".equals(username) || !"1234".equals(password)) {
throw new BadCredentialsException("用戶名或密碼錯誤");
}
String token = jwtUtil.generateToken(username, "USER,ADMIN");
return Map.of("token", token);
}
}
5. Security 配置:啟用過濾器、保護路徑、CORS
6. 業務控制器:權限控制示例
7. 前端調用流程 (Vue/React 通用)
項目 建議 密鑰管理 生產環境使用 **RS256 非對稱加密** (私鑰簽發、公鑰驗證),密鑰輪換機制。 Token 過期 Access Token 短期 (15-30min) + Refresh Token 長期 (7-30天) 雙 Token 模式。 HTTPS 強制 全站 HTTPS,防止 Token 劫持。 撤銷機制 Redis 黑名單存儲已登出/撤銷 Token jti,過濾器檢查。 敏感操作二次驗證 修改密碼、綁定手機等需重新驗證密碼/OTP。 CORS 精確配置 僅允許受信任前端域名,禁止 *搭配AllowCredentials。總結
Spring Boot + Spring Security + JWT 實現了標準的前後端分離無狀態認證。**核心流程**:登入驗證 →
Jwts.builder()簽發 → 前端Authorization: Bearer <token>→OncePerRequestFilter解析驗證 →SecurityContextHolder注入Authentication→@PreAuthorize方法級權限。掌握此架構可輕鬆擴展 OAuth2、SSO、微服務網關統一鑑權等進階場景。