全称 JSON Web Token(JSON Web令牌)
就是一个 String 字符串,由三部分组成
1. Header
2. Pyload
3. Signature
Header
有令牌的类型和所使用的签名算法,如HMAC、SHA256、RSA;使用Base64编码组成;(Base64是一种编码,不是一种加密过程,可以被翻译成原来的样子)
alg 代表 加密方式
type 代表 格式,一般都写成 JWT
{
"alg" : "HS256",
"type" : "JWT"
}
可以看到里面是一个key-value格式,在开发中我们也可以自己在header中设置键值对,比如:
JwtBuilder jwtBuilder = Jwts.builder();
jwtBuilder.setHeaderParam("typ","JWT");
jwtBuilder.setHeaderParam("test","test");
Pyload
有效负载,包含声明;声明是有关实体(通常是用户)和其他数据的声明,不放用户敏感的信息,如密码。同样使用Base64编码
{
"sub" : "123",
"name" : "John Do",
"admin" : true
}
可以存放不敏感的用户信息用作登录信息读取,比如:
HashMap<String, Object> stringObjectHashMap = new HashMap<>();
stringObjectHashMap.put("userId",user.getUserId());
stringObjectHashMap.put("username",user.getUserName());
builder.setClaims(stringObjectHashMap);
Signature
前面两部分都使用Base64进行编码,前端可以解开知道里面的信息。Signature需要使用编码后的header和payload
加上我们提供的一个密钥,使用header中指定的签名算法(HS256)进行签名。签名的作用是保证JWT没有被篡改过
builder.signWith(SignatureAlgorithm.HS256,"自定义密钥");
生成token
String token = builder.compact();
pom依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>