当前位置: 首页 > news >正文

JWT令牌安全实践详解

JWT令牌安全实践详解一、JWT概述JSON Web TokenJWT是一种用于安全传输信息的开放标准RFC 7519。1.1 JWT结构┌─────────────────────────────────────────────────────────────┐ │ JWT Token │ ├─────────────────────────────────────────────────────────────┤ │ Header.Payload.Signature │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ {alg:HS256, {sub:123, HMACSHA256( │ │ typ:JWT} name:John, base64Url(header). │ │ exp:1704067200) . │ │ base64Url(payload),│ │ secret) │ └─────────────────────────────────────────────────────────────┘1.2 JWT组成部分部分说明编码方式Header算法和类型Base64UrlPayload声明信息Base64UrlSignature签名HMAC/RSA二、JWT实现2.1 创建JWTimport io.jsonwebtoken.*; import java.util.Date; public class JwtUtil { private static final String SECRET_KEY your-256-bit-secret-key; private static final long EXPIRATION_TIME 86400000; // 24小时 public static String generateToken(String userId, String username) { return Jwts.builder() .setSubject(userId) .claim(username, username) .claim(role, admin) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } }2.2 验证JWTpublic static Claims validateToken(String token) { try { return Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody(); } catch (JwtException | IllegalArgumentException e) { throw new RuntimeException(Invalid token, e); } }2.3 刷新Tokenpublic static String refreshToken(String token) { Claims claims validateToken(token); claims.setIssuedAt(new Date()); claims.setExpiration(new Date(System.currentTimeMillis() EXPIRATION_TIME)); return Jwts.builder() .setClaims(claims) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); }三、JWT安全配置3.1 密钥管理// 使用256位以上的密钥 private static final String SECRET_KEY generateSecureKey(); private static String generateSecureKey() { SecureRandom random new SecureRandom(); byte[] key new byte[32]; // 256 bits random.nextBytes(key); return Base64.getEncoder().encodeToString(key); }3.2 使用RSA非对称加密// 生成RSA密钥对 KeyPairGenerator keyGen KeyPairGenerator.getInstance(RSA); keyGen.initialize(2048); KeyPair keyPair keyGen.generateKeyPair(); // 使用私钥签名 String token Jwts.builder() .setSubject(user123) .signWith(keyPair.getPrivate(), SignatureAlgorithm.RS256) .compact(); // 使用公钥验证 Claims claims Jwts.parser() .setSigningKey(keyPair.getPublic()) .parseClaimsJws(token) .getBody();3.3 设置合理的过期时间// 访问Token短过期时间 private static final long ACCESS_TOKEN_EXPIRE 15 * 60 * 1000; // 15分钟 // 刷新Token长过期时间 private static final long REFRESH_TOKEN_EXPIRE 7 * 24 * 60 * 60 * 1000; // 7天四、安全最佳实践4.1 Token存储策略存储位置优点缺点适用场景LocalStorage方便访问XSS风险单页应用SessionStorage会话级存储页面切换丢失临时数据HttpOnly CookieXSS安全CSRF风险传统WebMemory最安全页面刷新丢失高安全场景4.2 CSRF防护// Spring Security配置 http.csrf(csrf - csrf .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .ignoringRequestMatchers(/api/**) );4.3 XSS防护!-- 设置HttpOnly和Secure标志 -- Set-Cookie: JWTtoken; HttpOnly; Secure; SameSiteStrict五、Token黑名单机制5.1 基于Redis的黑名单public class TokenBlacklist { private final StringRedisTemplate redisTemplate; private static final String PREFIX blacklist:; public void invalidateToken(String token, long expireSeconds) { String key PREFIX token; redisTemplate.opsForValue().set(key, true, expireSeconds, TimeUnit.SECONDS); } public boolean isBlacklisted(String token) { String key PREFIX token; return Boolean.TRUE.equals(redisTemplate.hasKey(key)); } }5.2 拦截器验证public class JwtInterceptor implements HandlerInterceptor { private final TokenBlacklist blacklist; Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String token extractToken(request); if (blacklist.isBlacklisted(token)) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return false; } // 继续验证token return true; } }六、JWT vs Session对比特性JWTSession状态无状态有状态存储客户端服务端扩展性好差安全性需额外处理相对安全性能网络传输大服务器内存七、安全检查清单7.1 必做检查检查项说明使用HTTPS防止Token被窃取设置过期时间限制Token有效期避免敏感信息Payload是Base64编码不是加密使用强密钥256位以上密钥验证签名防止Token被篡改7.2 推荐检查检查项说明实现刷新机制定期轮换Token实现黑名单支持主动注销限制Token大小避免过大Payload监控异常行为检测暴力破解八、总结JWT是一种强大的身份认证机制但需要正确使用才能保证安全使用HTTPS始终通过HTTPS传输Token合理设置过期时间访问Token短刷新Token长使用非对称加密避免密钥泄露风险实现黑名单机制支持主动注销存储在安全位置根据场景选择存储方式通过以上措施可以构建安全可靠的JWT认证系统。
http://www.zskr.cn/news/1361890.html

相关文章:

  • Go语言错误处理:最佳实践
  • Go语言注释规范:代码即文档
  • 某聘 app sig/sp/响应体 unidbg分析
  • 3分钟解决Mac与Windows文件交换难题:Nigate免费NTFS读写工具完全指南
  • 2026年当前,如何甄选优质自行车厂家?以途锐达为例深度解析 - 2026年企业推荐榜
  • 一体化压铸:概念满天飞,真正能量产大铸件的厂到底有几家
  • 企业级条码处理方案:ZXing.Net在.NET生态中的架构实践与性能优化
  • 2026年国内可靠消泡剂供应商TOP5盘点:反渗透清洗剂/反渗透絮凝剂/反渗透药剂/反渗透还原剂/反渗透阻垢剂/选择指南 - 优质品牌商家
  • 【深度解析】用行为约束提升 AI Coding Agent:从 nine arm skills 看工程化智能体工作流设计
  • 构建可持续的阅读书源生态:从基础导入到高级管理策略
  • 分布式系统测试:验证分布式系统的正确性和性能
  • SenseNova-U1多模态模型深度解析:NEO-unify架构如何颠覆传统
  • 神经网络从入门到精通:10个核心概念+8个实战代码,小白也能懂
  • 2026年5月更新:浙江白油供应商深度,顶鑫润滑油为何脱颖而出? - 2026年企业推荐榜
  • Claude+Query Store双引擎协同优化(仅限AWS RDS与Azure SQL托管实例的私有API调用指南)
  • 【独家首发】Claude代码生成能力黄金分级标准(L1-L5):附赠可落地的团队接入评估清单(限前500名下载)
  • DOM 导航
  • 毕业论文必备AI论文平台排行榜(2026 深度测评)
  • 本周 AI 大事件速览| DeepSeek Code / Anthropic 盈利 / 千问3.7
  • boss 直聘web zp_stoken/app sp/sig unidbg分析
  • 哪家北京装修设计公司专业?2026年5月推荐TOP5对比施工质量评测案例适用场景 - 品牌推荐
  • Harness的配置漂移检测与自动修复
  • 如何选择北京家装公司?2026年5月推荐TOP5对比老房翻新防超支评测注意事项 - 品牌推荐
  • 3步彻底解决RDP Wrapper [not supported]问题:实战修复指南
  • PHP 面向对象编程(OOP)深入解析
  • WebPages WebGrid:下一代网页数据展示与交互平台
  • Eclipse 快捷键
  • 2026年Q2昆明ETFE遮阳天幕专业服务商选择指南 - 2026年企业推荐榜
  • 歌词滚动姬:重新定义你的歌词制作体验,让每一句歌词都完美同步
  • 跑了深圳6家全屋定制,终于找到一家不跑路、不增项、环保还耐看的宝藏老店! - 产品测评官