目录
一:什么是JWT
JWT(JSON Web Token)一种开放的标准规范(RFC 7519),用于在网络上安全传输和验证信息,通常被用于登录验证。
二:JWT的组成
JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),从官方的图解也可以看到如下:(JWT官网:https://jwt.io/)

Header(头部):JWT头部通常由两部分组成,第一部分是声明类型,例如JWT,第二部分是声明所使用的算法,例如HMAC SHA256或者RSA等。
Payload(载荷):Payload是JWT的第二部分,它包含了具体的用户信息,例如用户ID、用户名、角色等,也可以包含自定义的其他信息。Payload中的数据是以JSON格式进行编码,并且经过Base64URL编码。JWT 官方规定了 7 个字段,供选用:
iss (Issuer):签发者。
sub (Subject):主题。
aud (Audience):接收者。
exp (Expiration time):过期时间。
nbf (Not Before):生效时间。
iat (Issued At):签发时间。
jti (JWT ID):编号。
Signature(签名):Signature是JWT的第三部分,它使用Header和Payload中的数据以及一个密钥来生成签名。签名的目的是保证消息没有被篡改,并且只能被服务器端识别和验证。
三:JWT的执行流程
JWT的大致流程如下图所示:

四:JWT的使用
在Java中可以使用众多的工具类来使用JWT,在这里我推荐使用HuTool工具框架:
官网:https://www.hutoo
l.cn/docs/#/,在官网搜索栏直接搜JWT即可看见详细的使用文档
4.1使用JWT生成Token
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());
4.2使用JWT解析Token
String rightToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiYWRtaW4iOnRydWUsIm5hbWUiOiJsb29seSJ9.U2aQkC2THYV9L0fTN-yBBI7gmo5xhmvMhATtu8v0zEA";
final JWT jwt = JWTUtil.parseToken(rightToken);
jwt.getHeader(JWTHeader.TYPE);
jwt.getPayload("sub");
4.3使用JWT验证Token
String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9." +"eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE2MjQwMDQ4MjIsInVzZXJJZCI6MSwiYXV0aG9yaXRpZXMiOlsiUk9MRV_op5LoibLkuozlj7ciLCJzeXNfbWVudV8xIiwiUk9MRV_op5LoibLkuIDlj7ciLCJzeXNfbWVudV8yIl0sImp0aSI6ImQ0YzVlYjgwLTA5ZTctNGU0ZC1hZTg3LTVkNGI5M2FhNmFiNiIsImNsaWVudF9pZCI6ImhhbmR5LXNob3AifQ." +"aixF1eKlAKS_k3ynFnStE7-IRGiD5YaqznvK2xEjBew";
JWTUtil.verify(token, "1234".getBytes());
4.4JWT的传输
JWT(Token)通常存储在客户端的 Cookie、LocalStorage、SessionStorage 等位置,客户端在每次请求时把 JWT(Token)放在 Header 请求头中传递给服务器端。
五:JWT的原理
5.1JWT的生成原理
在用户登录时,当服务器端验证了用户名和密码的正确性后,会根据用户的信息,如用户 ID 和用户名称,加上服务器端存储的 JWT 秘钥一起来生成一个 JWT 字符串,也就是我们所说的 Token,这个 Token 是 Encoded 编码过的,类似于:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Decoded 解码后会得到三部分内容:头部(Header)+载荷(Payload)+签名(Signature)。
-
头部(Header):包含了关于生成该 JWT 的信息以及所使用的算法类型。
-
载荷(Payload):包含了要传递的数据,例如身份信息和其他附属数据。
-
签名(Signature):使用密钥对头部和载荷进行签名,以验证其完整性。
5.2JWT传输原理
JWT 通常存储在客户端的 Cookie、LocalStorage、SessionStorage 等位置,客户端在每次请求时把 JWT 放在 Header 请求头中传递给服务器端。
5.3验证JWT
-
服务器端接收到 JWT 的 Token 后,会先将 Token Decoded 解码,之后会得到头部(Header)+载荷(Payload)+签名(Signature)。
-
然后服务器端会使用它本地存储的秘钥,以及头部(Header)中的加密算法和载荷(Payload)中的信息进行重新加密,得到一个新的签名。
-
最后会判断 Token 的真伪,用上一步新生成的签名和 Decoded 解码得到的签名(Signature)进行判断,如果二者一致,则说明当前的 Token 有效性的、完整的,可以执行后续的操作了,否则则返回 Token 错误。当然在这一步判断时,我们通常也要看载荷(Payload)中的过期时间是否有效,如果无效,则需要提示用户重新登录。
JWT 的本质是:秘钥存放在服务器端,并通过某种加密手段进行加密和验证的机制
1239

被折叠的 条评论
为什么被折叠?



