# 简介
JWT(JSON Web Token)也就是通过 JSON 形式作为 Web 应用中的令牌,用于在各方之间安全地将信息作为 JSON 对象传输。在数据传输过程中还可以完成数据加密、签名等相关处理。
JSON Web Tokens - jwt.io
JWT 入门以及常见的登录问题_jwt 登录 - CSDN 博客
# 用途
# 授权
这是使用 JWT 的最常见方案。一旦用户登录,每个后续请求将包括 JWT,从而允允许的路由,服务和资源。单点登录是当今广泛使用 JWT 的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。
# 信息交换
JSON Web Token 是在各方之间安全地传输信息的好方法。因为可以对 JWT 进行签名(例如,使用公钥 / 私钥对),所以您可以确保发件人是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否遭到篡改。
注意:jwt 跟 session 不一样,jwt 存储在客户端(一般是浏览器本地),session 存储在服务器端,服务器断电后 session 就没了,而 jwt 因为存储在客户端,所以就不会被影响,只要 jwt 不过期,就可以继续使用。
# jwt 认证流程

# jwt 结构
# 令牌组成
- 标头 (Header)
- 有效载荷 (Payload)
- 签名 (Signature)
因此,JWT 通常如下所示: xxxxx.yyyyy.zzzzz Header.Payload.Signature
# Header 标头
Header 头信息主要声明加密算法。
- 标头通常由两部分组成:令牌的类型(即 JWT)和所使用的签名算法,例如 HMAC SHA256 或 RSA。它会使用 Base64 编码组成 JWT 结构的第一部分。
- 注意:Base64 是一种编码,也就是说,它是可以被翻译回原来的样子来的。它并不是一种加密过程。
{ | |
"alg": "HS256", | |
"typ": "JWT" | |
} |
# Payload
令牌的第二部分是有效负载,其中包含声明。声明是有关实体(通常是用户)和其他数据的声明。同样的,它会使用 Base64 编码组成 JWT 结构的第二部分。
{ | |
"sub": "1234567890", | |
"name": "John Doe", | |
"admin": true | |
} |
指定了七个默认字段供选择
iss:发行人 | |
exp:到期时间 | |
sub:主体 | |
aud:用户 | |
nbf:在此之前不可用 | |
iat:发布时间 | |
jti:JWT ID用于标识该JWT |
也可以自定义私有字段,但是不建议在此存放敏感信息,因为此部分可以解码还原出原始内容。虽然它可以解码,但是也不能修改这个内容。
{ | |
"username":"zhangsan", | |
"name":"张三", | |
} |
对其进行 base64 加密,得到 Jwt 的第二部分
# Signature
签证信息,此部分用于防止 jwt 内容被篡改。这个签证信息由三部分组成(由加密后的 Header,加密后的 PayLoad,加密后的签名三部分组成)header
(base64 后的)payload
(base64 后的)secret
base64 加密后的 header 和 base64 加密后的 payload 使用。连接组成的字符串,然后通过 header 中声明的加密方式进行加盐加密,然后就构成了 jwt 的第三部分,每个部分直接使用 .
来进行拼接。