【JWT】入门 *JWT*,并封装一个实用的 *JWT* 工具类

本文介绍了JSONWebToken(JWT)的基础概念、使用场景、结构以及在SpringBoot项目中的具体实现,包括如何生成、解密JWT并创建一个实用的JWT工具类。

在这里插入图片描述

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~

在这里插入图片描述


1. 什么是JSON Web Token(JWT)?

JSON Web 令牌(JWT)

JSON Web 令牌 (JWT) 是一种开放标准 (RFC 7519),它定义了一种紧凑且独立的方式,用于将信息作为 JSON 对象在各方之间安全地传输 。此信息可以被验证和信任,因为它是经过数字签名的。JWT 可以使用密钥(使用 HMAC 算法)或使用 RSAECDSA 的公钥/私钥对进行签名。



2. JWT使用场景

JWT使用场景

  • 授权:这是使用 JWT 的最常见方案。用户登录后,每个后续请求都将包含 JWT,从而允许用户访问该令牌允许的路由、服务和资源。单点登录是当今广泛使用 JWT 的一项功能,因为它的开销很小,并且能够轻松地跨不同域使用。
  • 信息交换:JSON Web 令牌是在各方之间安全传输信息的好方法。由于 JWT 可以签名(例如,使用公钥/私钥对),因此您可以确定发件人是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否未被篡改。



3. JWT结构

JSON Web Token 结构

JWT由三部分组成,分别是页眉(Header)、有效载荷(Payload)、签名(Signature) ,他们之间由符号.进行分割。

  • Header
  • Payload
  • Signature

因此,我们可知,JWT通常是这样的:ddddd.hhhhh.jjjjj


⚪页眉 Header


  • Header通常由两部分组成:令牌类型typ、使用的签名算法alg;
{
   
   
  "alg": "HS256",
  "typ": "JWT"
}

然后,这条JSON数据会经过Base64Url编码,组成JWT的第一部分(Header)



⚪有效载荷 Payload


JWT的第二部分是Payload,其中包含的是 Claims(声明), Claims是关于用户实体和其他数据的陈述。

有三种类型的Claims:registered claims public claimsprivate claims

  • **已注册的声明(registered claims):**是一组预定义的声明,这些声明不是强制性的,但建议提供一组有用的、可互操作的声明。比如:iss(发行人)、exp(到期时间)、sub(主题)、aud(受众)等…

    注意,上述提到的声明,名称的长度都是简短的几个字符,因为 JWT 应该是紧凑的。

  • 公共声明(public claims):这些声明可以由使用 JWT 的人随意定义。但为了避免冲突,应在 IANA JSON Web Token注册表中定义它们,或者将其定义为包含抗冲突命名空间的 URI。

  • 私人声明(private claims):这些声明是为了让同意使用它们的各方之间共享信息而创建的自定义声明,既不是 已注册 声明,也不是 公共 声明。


例如

{
   
   
  "sub": "123456789",
  "name": ".29.",
  "admin": true
}

接下来,这条JSON数据会经过Base64Url编码,组成JWT的第二部分(Payload)

请注意,对于已签名的令牌,此信息虽然受到保护,但任何人都可以读取。不要将机密信息放在 JWT 的有效负载或标头元素中,除非它是加密的。



⚪签名 Signature


要创建签名部分,必须获取经过Base64Url编码后的标头、经过Base64Url编码后的有效负载、密钥、标头中指定的算法,并对其进行签名。

例如,如果要使用 HMAC SHA256 算法,将按以下方式创建签名:

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)



一个完整的JWT长什么样?

  • 下述JWT对Header 和 Payload 进行了Base64Url编码,并使用密钥进行了签名,三个三个 Base64-URL 字符串,由点.进行分隔。
  • 它可以在 HTML 和 HTTP 环境中轻松传递,同时与基于 XML 的标准(如 SAML)相比更紧凑。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkiLCJuYW1lIjoiLjI5LiIsImFkbWluIjp0cnVlfQ.1M3o41CutZL1fTjEftuxs6g5ug5M-j6GcP_K61nAIjM

在这里插入图片描述




4. JWT基本使用(SpringBoot项目中)

导入maven坐标

        <!-- jjwt -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
        <!-- jaxb-api -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.29.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值