JWT(JSON Web Token) 是一种轻量级的开放标准(RFC 7519),用于在各方之间安全传输 JSON 格式的信息。它通过数字签名(如 HMAC 或 RSA)确保数据的完整性和可信性,广泛应用于身份认证和授权场景。
传统会话管理的痛点:
JWT 的优势:
典型应用场景:
2.1 组成结构
JWT 由三部分组成,通过 .
分隔:
Header.Payload.Signature
HS256
)。{
"alg": "HS256",
"typ": "JWT"
}
sub
、iat
、exp
)。{
"sub": "user123",
"name": "Alice",
"iat": 1717030000,
"exp": 1717033600
}
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secretKey)
2.2 签名 vs 加密
2.3 无状态特性
服务端无需存储会话状态,适合分布式系统和水平扩展。
3.1 选择开发框架
本文以 Spring Boot(Java)和 Node.js 为例。
3.2 安装依赖
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwt-apiartifactId>
<version>0.11.5version>
dependency>
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwt-implartifactId>
<version>0.11.5version>
<scope>runtimescope>
dependency>
npm install jsonwebtoken
3.3 配置密钥
application.properties
):jwt.secret=MySuperSecretKey123!@#
jwt.expiration=86400000 # 24小时
.env
):JWT_SECRET=MySuperSecretKey123!@#
JWT_EXPIRES_IN=86400 # 24小时(秒)
4.1 生成令牌
public String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + expiration))
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
}
const token = jwt.sign(
{ userId: 123 },
process.env.JWT_SECRET,
{ expiresIn: process.env.JWT_EXPIRES_IN }
);
4.2 验证令牌
public boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token);
return true;
} catch (JwtException e) {
return false;
}
}
jwt.verify(token, process.env.JWT_SECRET, (err, decoded) => {
if (err) throw new Error("Invalid token");
});
4.3 解析令牌
public String getUsernameFromToken(String token) {
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(token)
.getBody()
.getSubject();
}
const decoded = jwt.decode(token);
console.log(decoded.userId); // 123
5.1 创建 JWT 工具类
完整代码参考第 4 节示例。
5.2 配置 Spring Security
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/api/login").permitAll()
.anyRequest().authenticated()
.and()
.addFilterBefore(jwtFilter(), UsernamePasswordAuthenticationFilter.class);
}
private Filter jwtFilter() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 从 Header 提取并验证令牌
String token = extractToken(request);
if (token != null && jwtUtils.validateToken(token)) {
// 设置认证信息
Authentication auth = new UsernamePasswordAuthenticationToken(
jwtUtils.getUsernameFromToken(token), null, Collections.emptyList());
SecurityContextHolder.getContext().setAuthentication(auth);
}
chain.doFilter(request, response);
}
};
}
}
5.3 登录接口返回 JWT
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest request) {
// 1. 验证用户名密码
if (authenticate(request.getUsername(), request.getPassword())) {
// 2. 生成 JWT
String token = jwtUtils.generateToken(request.getUsername());
return ResponseEntity.ok(new JwtResponse(token));
}
return ResponseEntity.status(401).body("认证失败");
}
6.1 令牌刷新机制
access_token
(短期有效)和 refresh_token
(长期有效)。access_token
过期后,使用 refresh_token
换取新令牌。6.2 权限控制
@GetMapping("/admin")
@PreAuthorize("hasRole('ADMIN')")
public String adminOnly() {
return "管理员专属内容";
}
6.3 异常处理
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = {ExpiredJwtException.class, SignatureException.class})
public ResponseEntity<String> handleJwtException(Exception ex) {
return ResponseEntity.status(401).body("令牌无效或已过期");
}
}
6.4 安全加固
HttpOnly Cookie
或 localStorage
+ CSRF 防护。问题1:令牌解析失败
jwt.io
调试令牌。问题2:跨域(CORS)
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
问题3:性能优化
局限性:
替代方案:
核心价值:
推荐资源:
流程图:JWT 认证流程
立即行动:
让安全与便捷并存,JWT 助您构建现代化 Web 应用!