
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~
【JWT】入门 *JWT*,并封装一个实用的 *JWT* 工具类
1. 什么是JSON Web Token(JWT)?
JSON Web 令牌(JWT):
JSON Web 令牌 (JWT) 是一种开放标准 (RFC 7519),它定义了一种紧凑且独立的方式,用于将信息作为 JSON 对象在各方之间安全地传输 。此信息可以被验证和信任,因为它是经过数字签名的。JWT 可以使用密钥(使用 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对进行签名。
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 claims、 private 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

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


最低0.47元/天 解锁文章
1674

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



