前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >什么是JWT

什么是JWT

作者头像
ma布
发布2024-11-15 08:26:49
发布2024-11-15 08:26:49
44600
代码可运行
举报
文章被收录于专栏:Java开发Java开发
运行总次数:0
代码可运行

一:什么是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

代码语言:javascript
代码运行次数:0
复制
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

代码语言:javascript
代码运行次数:0
复制
String rightToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiYWRtaW4iOnRydWUsIm5hbWUiOiJsb29seSJ9.U2aQkC2THYV9L0fTN-yBBI7gmo5xhmvMhATtu8v0zEA";
final JWT jwt = JWTUtil.parseToken(rightToken);
jwt.getHeader(JWTHeader.TYPE);
jwt.getPayload("sub");

4.3使用JWT验证Token

代码语言:javascript
代码运行次数:0
复制
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)。

  1. 头部(Header):包含了关于生成该 JWT 的信息以及所使用的算法类型。
  2. 载荷(Payload):包含了要传递的数据,例如身份信息和其他附属数据。
  3. 签名(Signature):使用密钥对头部和载荷进行签名,以验证其完整性。

5.2JWT传输原理

JWT 通常存储在客户端的 Cookie、LocalStorage、SessionStorage 等位置,客户端在每次请求时把 JWT 放在 Header 请求头中传递给服务器端。

5.3验证JWT

  1. 服务器端接收到 JWT 的 Token 后,会先将 Token Decoded 解码,之后会得到头部(Header)+载荷(Payload)+签名(Signature)。
  2. 然后服务器端会使用它本地存储的秘钥,以及头部(Header)中的加密算法和载荷(Payload)中的信息进行重新加密,得到一个新的签名。
  3. 最后会判断 Token 的真伪,用上一步新生成的签名和 Decoded 解码得到的签名(Signature)进行判断,如果二者一致,则说明当前的 Token 有效性的、完整的,可以执行后续的操作了,否则则返回 Token 错误。当然在这一步判断时,我们通常也要看载荷(Payload)中的过期时间是否有效,如果无效,则需要提示用户重新登录。

JWT 的本质是:秘钥存放在服务器端,并通过某种加密手段进行加密和验证的机制

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一:什么是JWT
  • 二:JWT的组成
  • 三:JWT的执行流程
  • 四:JWT的使用
    • 4.1使用JWT生成Token
    • 4.2使用JWT解析Token
    • 4.3使用JWT验证Token
    • 4.4JWT的传输
  • 五:JWT的原理
    • 5.1JWT的生成原理
    • 5.2JWT传输原理
    • 5.3验证JWT
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档