JWT Token生成与验证实战解析

需积分: 44 8 下载量 11 浏览量 更新于2024-09-05 收藏 667KB PDF 举报
"JWT生成Token实战验证.pdf" JWT(JSON Web Token)是一种广泛使用的轻量级身份认证和授权机制,适用于分布式系统中的安全信息传递。JWT标准(RFC7519)定义了一种紧凑的、自包含的方式来安全地在两个通信方之间传递信息,如用户的身份信息。由于JWT自身携带了必要的验证信息,它无需数据库查询即可完成验证,从而减少了服务器的处理负担。 JWT由三部分组成,用`.`分隔: 1. **Header(头部)**:包含了JWT的类型("typ"通常设置为"JWT")和使用的签名算法(如"HS256"或"RS256")。这部分内容通过Base64Url编码后作为JWT的第一部分。 2. **Payload(负载)**:这是JWT的核心,包含了一系列的声明(Claims),用来承载数据。声明分为三种类型: - **Reserved claims**:预定义的声明,如`iss`(issuer,签发者)、`exp`(expiration time,过期时间)、`sub`(subject,主题,通常指用户)、`aud`(audience,接收方)和`iat`(issued at,签发时间)。这些声明不是强制的,但推荐使用。 - **Public claims**:公开声明,允许用户自定义,但需确保与其他JWT实现不冲突。 - **Private claims**:私有声明,是两个通信方之间的定制信息,不具有通用性。 Payload同样会通过Base64Url编码成为JWT的第二部分。 3. **Signature(签名)**:签名由编码后的Header和Payload以及一个密钥(secret)生成,用于验证JWT的完整性和防止篡改。根据Header中指定的算法(如HMACSHA256),将编码后的Header和Payload连接起来,然后使用该算法和密钥计算签名。例如,对于HMACSHA256算法,签名的生成过程为:`HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)`。 在实际应用中,JWT通常用于验证用户身份,如登录状态。服务端在用户成功登录后生成一个JWT,包含用户的标识和权限信息,然后发送给客户端。客户端在后续请求中将JWT作为身份凭证,服务端解码并验证签名,确认其有效性后提供相应的服务。 总结来说,JWT通过其紧凑的结构和内置的验证机制,提供了安全、高效的身份验证解决方案,广泛应用于现代Web应用和API的认证授权流程中。在Java开发中,可以使用诸如jjwt等库来方便地生成和验证JWT。
2021-09-06 上传

try { //获取用户载荷 authorizationToken = authorizationToken.substring(7); //检查redis 只要有就继续 Long remainTime = redisUtils.getExpiredTime(BusinessConstant.JWT_REDIS_KEY.getKey() +authorizationToken, TimeUnit.SECONDS); if (remainTime <= 0) { throw new AuthorizationException(BusinessCode.NOT_AUTHORIZED.getCode(), BusinessCode.JWT_SIGNATURE_EXCEPTION.getMsg()); } //检查签名 JwtPayLoad<UserVo> payLoadFromJwt = JwtUtils.getPayLoadFromJwt(authorizationToken, publicKey, UserVo.class, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey()); //redis续期时间 min long now = System.currentTimeMillis(); long jwtExpiredTime = payLoadFromJwt.getExpiredTime().getTime(); long reNewTime = Long.parseLong(BusinessConstant.JWT_RENEW_TIME.getKey()) * 60 * 1000; //判断是否需要续期 if (jwtExpiredTime - now <= reNewTime) { //获取旧的用户属性 UserVo user = payLoadFromJwt.getPayLoadData(); //过期时间 int expiredTime = Integer.parseInt(BusinessConstant.JWT_EXPIRED_TIME.getKey()); String jwtTokenWithExpireTimeMinutes = JwtUtils.createJwtTokenWithExpireTimeMinutes(user, rsaProperties.getPrivateKey(), expiredTime, BusinessConstant.SYSTEM_JWT_PAYLOAD_KEY.getKey(), BusinessConstant.SYSTEM_JWT_ISS.getKey()); redisUtils.setNewAndDeleteOldWithExpiredTime(BusinessConstant.JWT_REDIS_KEY.getKey() + jwtTokenWithExpireTimeMinutes, user.getName() + ":" + user.getUserId(),BusinessConstant.JWT_REDIS_KEY.getKey() +authorizationToken, expiredTime, TimeUnit.MINUTES); response.setHeader(BusinessConstant.JWT_REQUEST_HEAD.getKey(), jwtTokenWithExpireTimeMinutes); log.info("====客户端:" + ipAddr + " 用户:" + user.getName() + " -- (" + user.getUserId() + ") token续期成功!!!!"); }

2023-06-05 上传