JWT(JSON Web Token)一种开放的标准规范(RFC 7519),用于在网络上安全传输和验证信息,通常被用于登录验证。
JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),从官方的图解也可以看到如下:(JWT官网:https://jwt.io/)
Header(头部):JWT头部通常由两部分组成,第一部分是声明类型,例如JWT,第二部分是声明所使用的算法,例如HMAC SHA256或者RSA等。
Payload(载荷):Payload是JWT的第二部分,它包含了具体的用户信息,例如用户ID、用户名、角色等,也可以包含自定义的其他信息。Payload中的数据是以JSON格式进行编码,并且经过Base64URL编码。JWT 官方规定了 7 个字段,供选用:
Signature(签名):Signature是JWT的第三部分,它使用Header和Payload中的数据以及一个密钥来生成签名。签名的目的是保证消息没有被篡改,并且只能被服务器端识别和验证。
JWT的大致流程如下图所示:
在Java中可以使用众多的工具类来使用JWT,在这里我推荐使用HuTool工具框架:
官网:https://www.hutoo l.cn/docs/#/,在官网搜索栏直接搜JWT即可看见详细的使用文档
Map<String, Object> map = new HashMap<String, Object>() {
{
put("uid", 123);
put("expire_time", System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 15);
}
};
JWTUtil.createToken(map, "1234".getBytes());
String rightToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiYWRtaW4iOnRydWUsIm5hbWUiOiJsb29seSJ9.U2aQkC2THYV9L0fTN-yBBI7gmo5xhmvMhATtu8v0zEA";
final JWT jwt = JWTUtil.parseToken(rightToken);
jwt.getHeader(JWTHeader.TYPE);
jwt.getPayload("sub");
String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9." +"eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE2MjQwMDQ4MjIsInVzZXJJZCI6MSwiYXV0aG9yaXRpZXMiOlsiUk9MRV_op5LoibLkuozlj7ciLCJzeXNfbWVudV8xIiwiUk9MRV_op5LoibLkuIDlj7ciLCJzeXNfbWVudV8yIl0sImp0aSI6ImQ0YzVlYjgwLTA5ZTctNGU0ZC1hZTg3LTVkNGI5M2FhNmFiNiIsImNsaWVudF9pZCI6ImhhbmR5LXNob3AifQ." +"aixF1eKlAKS_k3ynFnStE7-IRGiD5YaqznvK2xEjBew";
JWTUtil.verify(token, "1234".getBytes());
JWT(Token)通常存储在客户端的 Cookie、LocalStorage、SessionStorage 等位置,客户端在每次请求时把 JWT(Token)放在 Header 请求头中传递给服务器端。
在用户登录时,当服务器端验证了用户名和密码的正确性后,会根据用户的信息,如用户 ID 和用户名称,加上服务器端存储的 JWT 秘钥一起来生成一个 JWT 字符串,也就是我们所说的 Token,这个 Token 是 Encoded 编码过的,类似于:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Decoded 解码后会得到三部分内容:头部(Header)+载荷(Payload)+签名(Signature)。
JWT 通常存储在客户端的 Cookie、LocalStorage、SessionStorage 等位置,客户端在每次请求时把 JWT 放在 Header 请求头中传递给服务器端。
JWT 的本质是:秘钥存放在服务器端,并通过某种加密手段进行加密和验证的机制