JWT初识

JWT是JSON Web Token的缩写

这三个词拆开都是计算机网络中的重要的名词,

对于JSON是一种数据格式

对于Web是一种架构体系

对于Token是一种认证方式

把这三者合起来组成了一个新的名词JWT, 他也是一个重要的名词, 是一个开放的标准,HTTP也是一种开放的标准, 像这种开放的标准往往定义了一种宏大的体系或者结构,使得后续各种标准实现或者延伸可以保证规范性

对于JWT 它作为一种开放标准,定义了一种紧凑且自包含的方式, 在开发过程中传递的JSON对象可以安全传输, 鉴于安全性该方式 使用了数字签名获得了可验证可信任的特性

就像初学HTTP那样,我们直接先了解JWT的格式,从而可以由其格式得知它的各个用途

简洁一点: JWT由三个部分组成,中间用点隔开,分别是:

头部.有效载荷.签名

XXXXX.YYYYY.ZZZZZ

头部

对于头部来说通常又有两部分组成

1.JWT令牌类型

2.所使用的签名算法(了解即可HMAC SHA256或 RSA)

这部分是JWT的元数据,什么是元数据?对于一个文件来说其类型,存储位置,文件大小等都是其元数据

复制代码
{
  "alg": "HS256",
  "typ": "JWT"
}

可以看到他的构成是JSON的格式, 这个JSON对象被编码为Base64Url,构成了JWT的头部

这里需要注意的是,这部分是被编码为了某种格式,而并非是加密成了某种格式,不要混淆了加密和编码. 简单的理解就是:

  • 编码(Base64Url):只是 "换一种格式表示数据",可逆(任何人能解码),目的是让 JSON 能在 HTTP 中传输;
  • 加密:是 "把数据变成看不懂的密文",不可逆(只有有秘钥的人能解密);

有效载荷

部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。

iss issuer谁发的这个 Token填你的系统名称 / 域名(如https://your-app.com),便于跨系统识别 Token 来源

exp expiration timeToken 啥时候过期填时间戳(毫秒 / 秒),是 JWT 最核心的字段之一,防止 Token 永久有效

sub subjectToken 的主题通常填用户唯一标识(如用户 ID),是 Token 的核心业务标识

aud audienceToken 给谁用填接收方(如mobile-app/web-admin),防止 Token 被其他系统滥用

nbf Not BeforeToken 啥时候生效填时间戳,生效前即使拿到 Token 也无法使用(比如预约场景)

iat Issued AtToken 啥时候发的填签发时间戳,可用于计算 Token 已存活多久jtiJWT IDToken 的唯一编号用于防重放攻击(比如拉黑已注销的 Token)

除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子。

复制代码
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

注意,JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。

这个 JSON 对象也要使用 Base64URL 算法转成字符串。

Base64和Base64URL

一篇文章弄懂Base64编码原理_base64原理-CSDN博客

base64与base64url编码-CSDN博客

Base64 是将二进制 / 特殊文本转成可打印字符串的通用编码方式,Base64URL 是其为适配 URL/HTTP 传输的安全变种,仅把 Base64 里的 + 换成 -、/ 换成_并省略末尾 =,二者均为编码(非加密)。

很多人第一眼看到有效载荷会头晕脑转的一大堆字段

把整个JWT想象成一个快递, 头部就是快递单上的物流类型,有效载荷就是快递包里面物品,签名就是快递的方位封签

至于这些字段如何使用可以看后面的实战篇: JWT项目使用-CSDN博客

签名

Signature 部分是对前两部分的签名,防止数据篡改。

首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。

复制代码
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload) , secret
)

算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。

签名用于验证消息在过程中没有被更改,对于用私钥签名的令牌,它还可以验证JWT的发送者是否就是它所说的那个人。

把一切都放在一起

输出是三个 Base64-URL 字符串,中间用点分隔,可以在 HTML 和 HTTP 环境中轻松传递,同时与基于 XML 的标准如 SAML 相比更为紧凑。

以下展示了一个JWT,该JWT编码了之前的头部和有效载荷,并用一个秘密符号签名。

相关推荐
weixin_449173652 小时前
java使用poi保存表格和图片到word文件中
java·开发语言·word
好家伙VCC2 小时前
# 光计算驱动的编程范式革新:用Python实现光子神经网络模拟器在传统电子计算架构逼近物理极限的今天,**光计算**正
java·开发语言·python·神经网络
yqj2342 小时前
【无标题】
java·开发语言
Coder_Boy_2 小时前
JDK17_JDK21并发编程:资深架构常用模式+最佳实践
java·开发语言·spring boot·架构
最贪吃的虎2 小时前
windows上如何可视化访问并远程操作linux系统上运行的浏览器或者linux可视化桌面
java·linux·运维·windows·分布式·后端·架构
毕设源码-邱学长3 小时前
【开题答辩全过程】以 基于Java的通信运营商流量管理系统设计与实现为例,包含答辩的问题和答案
java·开发语言
曲莫终3 小时前
深度自定义jackson的JSON序列化日期时间类型
java
廋到被风吹走3 小时前
DDD领域驱动设计深度解析:从理论到代码实践
java·大数据·linux