news 2026/2/18 20:15:11

JWT的概念

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JWT的概念

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用间安全地传输信息。它特别适用于身份验证授权场景。


🎯JWT 的核心组成

JWT 由三部分组成,格式为:Header.Payload.Signature

1. 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 库

  1. jjwt(最流行)
  2. Java JWT(Auth0)
  3. Nimbus JWT

Maven 依赖(jjwt 示例)

<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.5</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.11.5</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.11.5</version> <scope>runtime</scope> </dependency>

💻Java 代码示例

1. 创建 JWT

import 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. 验证和解析 JWT

public 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返回给客户端 ↓ 客户端 → 后续请求携带JWT(Authorization头) ↓ 服务器验证JWT ↓ 返回受保护资源

HTTP 请求头示例

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

JWT 的优点

优点说明
无状态服务器不需要存储session,适合分布式系统
跨域友好适合前后端分离、微服务架构
自包含令牌包含所有必要信息,减少数据库查询
标准化行业标准,各种语言都有成熟库

⚠️JWT 的注意事项

安全问题

  1. 不要存储敏感信息(密码等)
  2. 设置合理的过期时间
  3. 使用 HTTPS防止令牌被截获
  4. 签名密钥要足够复杂

性能考虑

// 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; } }

📚最佳实践总结

  1. 使用安全的签名算法(HS256, RS256)
  2. 令牌有效期尽量短(15-30分钟为佳)
  3. 实现刷新令牌机制
  4. 存储在安全的地方(HttpOnly cookies)
  5. 处理令牌泄露(黑名单或短有效期)
  6. 避免在URL中传递(防止日志泄露)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/17 6:53:43

强烈安利9个AI论文软件,专科生搞定毕业论文不求人!

强烈安利9个AI论文软件&#xff0c;专科生搞定毕业论文不求人&#xff01; AI 工具如何让论文写作变得轻松高效 对于专科生来说&#xff0c;毕业论文往往是一道难以逾越的门槛。从选题到撰写&#xff0c;再到查重降重&#xff0c;每一个环节都可能让人感到焦虑和压力。而随着…

作者头像 李华
网站建设 2026/2/18 2:23:32

【课程设计/毕业设计】基于SpringBoot+Vue的企业内部知识产权管理系统基于springboot的企业内部知识产权管理系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/16 1:13:22

突发,Deepseek新模型MODEL1曝光!

作为明星产品&#xff0c;必须得用放大镜看&#xff01;正值DeepSeek-R1 发布一周年之际&#xff0c;DeepSeek 在 GitHub 上悄悄更新了一波代码。结果&#xff0c;眼尖的开发者在 DeepSeek 核心的推理优化库 FlashMLA 中&#xff0c;发现了一个此前从未公开过的神秘代号&#x…

作者头像 李华
网站建设 2026/2/16 8:15:12

AI代码质检员:如何用大模型提前揪出软件缺陷?

深夜两点,某大型电商平台的代码仓库悄悄合入了一个看似普通的促销模块更新。三天后的618大促当天,系统却在订单峰值时意外崩溃——事后发现,原来是一个边界条件检查遗漏造成的并发问题。这种故事在软件工程领域反复上演,直到AI开始介入这个传统上依赖人工经验的领域。 想象…

作者头像 李华
网站建设 2026/2/17 7:11:14

IP地址与端口号

IP地址及编址方式 IP地址基础概念 IP地址的本质 定义&#xff1a;用于唯一标识互联网上设备的逻辑地址结构&#xff1a;采用两级结构&#xff08;网络号 主机号&#xff09;唯一性&#xff1a;在整个互联网范围内是唯一的表示方法&#xff1a;点分十进制记法&#xff08;如…

作者头像 李华
网站建设 2026/2/18 14:17:55

(新卷,200分)- 任务调度(Java JS Python)

(新卷,200分)- 任务调度&#xff08;Java & JS & Python&#xff09;题目描述现有一个CPU和一些任务需要处理&#xff0c;已提前获知每个任务的任务ID、优先级、所需执行时间和到达时间。 CPU同时只能运行一个任务&#xff0c;请编写一个任务调度程序&#xff0c;采用“…

作者头像 李华