2026/5/21 20:06:47
网站建设
项目流程
网站建设宗旨怎么写,建筑工人招聘平台,wordpress设置会员时效,国外的网站建设JWT#xff08;JSON Web Token#xff09; 是一种开放标准#xff08;RFC 7519#xff09;#xff0c;用于在网络应用间安全地传输信息。它特别适用于 身份验证 和 授权 场景。#x1f3af; JWT 的核心组成JWT 由三部分组成#xff0c;格式为#xff1a;Header.Payload…JWTJSON Web Token是一种开放标准RFC 7519用于在网络应用间安全地传输信息。它特别适用于身份验证和授权场景。JWT 的核心组成JWT 由三部分组成格式为Header.Payload.Signature1. Header头部{ alg: HS256, // 签名算法HMAC SHA256 typ: JWT // 令牌类型 }Base64Url 编码后形成第一部分2. Payload负载/声明包含实际的用户数据和其他信息{ sub: 1234567890, // 主题用户ID name: John Doe, // 自定义声明 iat: 1516239022, // 签发时间 exp: 1516242622 // 过期时间 }3. Signature签名HMACSHA256( base64UrlEncode(header) . base64UrlEncode(payload), secret )防止数据被篡改一个完整的 JWT 示例eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. // Header eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ. // Payload SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c // Signature⚡JWT 在 Java 中的使用常用 Java JWT 库jjwt最流行Java JWT(Auth0)Nimbus JWTMaven 依赖jjwt 示例dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-api/artifactId version0.11.5/version /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-impl/artifactId version0.11.5/version scoperuntime/scope /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-jackson/artifactId version0.11.5/version scoperuntime/scope /dependencyJava 代码示例1. 创建 JWTimport io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; public class JwtUtil { private static final String SECRET_KEY mySecretKey123!#; private static final long EXPIRATION_TIME 86400000; // 24小时 public static String generateToken(String username) { return Jwts.builder() .setSubject(username) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } }2. 验证和解析 JWTpublic static boolean validateToken(String token) { try { Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token); return true; } catch (Exception e) { return false; } } public static String getUsernameFromToken(String token) { return Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody() .getSubject(); }JWT 在 Web 应用中的典型流程客户端 → 登录请求 → 服务器 ↓ 验证用户名密码 ↓ 生成JWT返回给客户端 ↓ 客户端 → 后续请求携带JWTAuthorization头 ↓ 服务器验证JWT ↓ 返回受保护资源HTTP 请求头示例Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...✅JWT 的优点优点说明无状态服务器不需要存储session适合分布式系统跨域友好适合前后端分离、微服务架构自包含令牌包含所有必要信息减少数据库查询标准化行业标准各种语言都有成熟库⚠️JWT 的注意事项安全问题不要存储敏感信息密码等设置合理的过期时间使用 HTTPS防止令牌被截获签名密钥要足够复杂性能考虑// JWT 一旦签发就不可撤销 // 如果需要即时失效需要额外方案 // 1. 短过期时间 刷新令牌 // 2. 黑名单机制 // 3. 每次验证查库会失去无状态优势JWT vs Session对比项JWTSession存储位置客户端服务器端跨域支持好需要额外配置扩展性好无状态一般需要共享session安全性依赖签名依赖session管理撤销机制复杂简单实际应用场景Spring Boot 集成示例Configuration public class JwtConfig { Bean public JwtUtil jwtUtil() { return new JwtUtil(); } } RestController RequestMapping(/api/auth) public class AuthController { PostMapping(/login) public ResponseEntity? login(RequestBody LoginRequest request) { // 验证用户 if (authenticate(request)) { String token jwtUtil.generateToken(request.getUsername()); return ResponseEntity.ok(new AuthResponse(token)); } return ResponseEntity.status(401).build(); } }拦截器验证Component public class JwtInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String token request.getHeader(Authorization); if (token ! null token.startsWith(Bearer )) { token token.substring(7); if (jwtUtil.validateToken(token)) { request.setAttribute(username, jwtUtil.getUsernameFromToken(token)); return true; } } response.setStatus(401); return false; } }最佳实践总结使用安全的签名算法HS256, RS256令牌有效期尽量短15-30分钟为佳实现刷新令牌机制存储在安全的地方HttpOnly cookies处理令牌泄露黑名单或短有效期避免在URL中传递防止日志泄露