JWT的介绍
JWT(JSON Web Token)是一种用于在网络应用间安全传输信息的开放标准(RFC 7519)。它使用 JSON 对象作为载荷(payload)来传输信息,并使用数字签名或加密方式对该 JSON 对象进行验证和保护。
JWT的组成
以下是Jwt的一个示例
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbGFpbXMiOnsidXNlck5hbWUiOiLlrZnlgaXmoIsiLCJ1c2VySWQiOiIxIn0sImV4cCI6MTcwNDQxMDcxM30.scTKqW9Z9WC-50ap31ps6QUzCHnVHx8KXDVxgjacRFc
jwt由三个部分组成,中间用’.'分隔
- 头部(Header):头部通常由两部分组成:令牌的类型(即 “JWT”)和所使用的签名算法(例如 HMAC、RSA 或者 ECDSA)。头部通常是一个 JSON 对象,经过 Base64 编码后与其他两部分使用点号连接在一起。
- 载荷(Payload):载荷是 JWT 的主要内容,也是存放实际信息的地方。它包含了一组称为声明(claims)的属性,声明可以是预定义的标准声明(例如 “iss” 表示签发者、“exp” 表示过期时间等),也可以是自定义的声明。载荷也是一个 JSON 对象,经过 Base64 编码后与头部和签名使用点号连接在一起。
- 签名(Signature):签名用于验证 JWT 的完整性和真实性。签名通常由头部、载荷和一个密钥组成,使用指定的签名算法进行计算。签名可以防止 JWT 被篡改或伪造。
JAVA代码的使用
1.带入jwt的依赖
<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
2.使用代码生成jwt与解析jwt
生成JWT
Map<String, String> data = new HashMap<>();
data.put("userId", "1");
data.put("userName", "张三");
String jwtToken = JWT.create()
.withClaim("claims", data)
.withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12))
.sign(Algorithm.HMAC256(JWT_SIGN));
System.out.println(jwtToken);
其中生成jwt主要包含三个信息,信息体,过期时间与签名
注 : 信息体不能存放敏感信息,这是可以被解析的
使用base64可以解析出信息体,所以不存放敏感信息
String[] jwtParts = jwtToken.split("\\.");
String decodedPayload = new String(Base64.decode(jwtParts[1]));
解析JWT
/**
* 验证失败的情况
* jwtToken无效 verify失败 SignatureVerificationException
* jwtToken过期 verify失败 TokenExpiredException
* sign签名错误 verify失败 SignatureVerificationException
*/
Map<String, Object> dataMap = JWT.require(Algorithm.HMAC256(JWT_SIGN))
.build()
.verify(jwtToken)
.getClaim("claims")
.asMap();
dataMap.forEach((key, value) -> {
System.out.println(key + "\t\t" + value);
});