本文最后更新于2 分钟前,文中所描述的信息可能已发生改变。
JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为 JSON 对象。JWT 可以通过数字签名进行验证,这样就可以确保在传输过程中的数据不被篡改。
JWT的组成
- Header(头部): 头部通常由两部分组成,令牌的类型("typ")和所使用的签名算法("alg")。例如:
{"alg": "HS256", "typ": "JWT"}
。 - Payload(载荷): 载荷包含了被加密的信息,例如用户的身份信息。此外,载荷也可以包含一些额外的元数据。例如:
{"sub": "1234567890", "name": "John Doe", "admin": true}
。 - Signature(签名): 签名是头部和载荷的组合的加密结果,用于验证令牌的真实性和完整性。签名的生成通常使用头部中指定的算法以及一个密钥。例如:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
。
JWT应用场景
- 身份认证
- 单点登录
- 授权 等等
在springboot中使用
java
public class JwtUtil{
/**
* 生成一个jwt令牌
* @param secretKey 签证的密钥
* @param ttlMillis 过期时间
* @param claims 设置的自定义信息
* @return
*/
public static String createJwt(String secretKey, Long ttlMillis, Map<String,Object> claims){
SignatureAlgorithm hs256 = SignatureAlgorithm.HS256;
String token = Jwts.builder()
//设置自定义信息
.setClaims(claims)
//设置加密算法与密钥
.signWith(hs256, secretKey.getBytes(StandardCharsets.UTF_8))
//设置过期时间
.setExpiration(new Date(System.currentTimeMillis()+ttlMillis))
//生成令牌
.compact();
return token;
}
/**
* 解析一个jwt令牌
* @param token 令牌
* @param secretKey 自定义密钥
* @return
*/
public static Claims parseJwt(String token,String secretKey){
Claims claims = Jwts.parser()
//设置解密用的密钥,与加密时的需为同一个
.setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))
//设置要解密的令牌,注意方法名是Jws
.parseClaimsJws(token)
//生成内容,格式为xxx.xxx.xxx
.getBody();
return claims;
}
}