JWT 基本概念详解
JWT 基本概念详解
- JWT 基本概念详解
- 什么是 JWT?
- JWT 由哪些部分组成?
- Header
- Payload
- Signature
- 如何基于 JWT 进行身份验证?
- 如何防止 JWT 被篡改?
- 如何加强 JWT 的安全性?
什么是 JWT?
JWT (JSON Web Token) 是目前最流行的跨域认证解决方案,是一种基于 Token 的认证授权机制。 从 JWT 的全称可以看出,JWT 本身也是 Token,一种规范化之后的 JSON 结构的 Token。
JWT 自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储 Session 信息。这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。
可以看出,JWT 更符合设计 RESTful API 时的「Stateless(无状态)」原则 。
并且, 使用 JWT 认证可以有效避免 CSRF 攻击,因为 JWT 一般是存在在 localStorage 中,使用 JWT 进行身份验证的过程中是不会涉及到 Cookie 的。
我在 JWT 优缺点分析这篇文章中有详细介绍到使用 JWT 做身份认证的优势和劣势。
下面是 RFC 7519open in new window 对 JWT 做的较为正式的定义。
JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted. ——JSON Web Token (JWT)open in new window
JWT 由哪些部分组成?
JWT 本质上就是一组字串,通过(.)切分成三个为 Base64 编码的部分:
- Header
- 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型。
- Payload
- 用来存放实际需要传递的数据
- Signature(签名) :服务器通过 Payload、Header 和一个密钥(Secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。
JWT 通常是这样的:xxxxx.yyyyy.zzzzz。
示例:
```plain text eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ. SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
你可以在 [jwt.ioopen in new window](https://jwt.io/) 这个网站上对其 JWT 进行解码,解码之后得到的就是 Header、Payload、Signature 这三部分。
Header 和 Payload 都是 JSON 格式的数据,Signature 由 Payload、Header 和 Secret(密钥)通过特定的计算公式和加密算法得到。

### Header
Header 通常由两部分组成:
- typ
(Type):令牌类型,也就是 JWT。
- alg
(Algorithm) :签名算法,比如 HS256。
示例:
```json
{
"alg": "HS256",
"typ": "JWT"
}
JSON 形式的 Header 被转换成 Base64 编码,成为 JWT 的第一部分。
Payload
Payload 也是 JSON 格式数据,其中包含了 Claims(声明,包含 JWT 的相关信息)。
Claims 分为三种类型:
- Registered Claims(注册声明) :预定义的一些声明,建议使用,但不是强制性的。
- Public Claims(公有声明)IANA JSON Web Token Registryopen in new window :JWT 签发方可以自定义的声明,但是为了避免冲突,应该在 中定义它们。
- Private Claims(私有声明) :JWT 签发方因为项目需要而自定义的声明,更符合实际项目场景使用。
下面是一些常见的注册声明:
- iss (issuer):JWT 签发方。
- iat (issued at time):JWT 签发时间。
- sub (subject):JWT 主题。
- aud (audience):JWT 接收方。
- exp (expiration time):JWT 的过期时间。
- nbf (not before time):JWT 生效时间,早于该定义的时间的 JWT 不能被接受处理。
- jti (JWT ID):JWT 唯一标识。
示例:
```plain text { “uid”: “ff1212f5-d8d1-4496-bf41-d2dda73de19a”, “sub”: “1234567890”, “name”: “John Doe”, “exp”: 15323232, “iat”: 1516239022, “scope”: [“admin”, “user”] }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Payload 部分默认是不加密的,**一定不要将隐私信息存放在 Payload 当中!!!**
JSON 形式的 Payload 被转换成 Base64 编码,成为 JWT 的第二部分。
### Signature
Signature 部分是对前两部分的签名,作用是防止 JWT(主要是 payload) 被篡改。
这个签名的生成需要用到:
- Header + Payload。
- 存放在服务端的密钥(一定不要泄露出去)。
- 签名算法。
签名的计算公式如下:
```plain text
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用”点”(.)分隔,这个字符串就是 JWT 。
如何基于 JWT 进行身份验证?
在基于 JWT 进行身份验证的的应用程序中,服务器通过 Payload、Header 和 Secret(密钥)创建 JWT 并将 JWT 发送给客户端。客户端接收到 JWT 之后,会将其保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。
简化后的步骤如下:
- 用户向服务器发送用户名、密码以及验证码用于登陆系统。
- 如果用户用户名、密码以及验证码校验正确的话,服务端会返回已经签名的 Token,也就是 JWT。
- 用户以后每次向后端发请求都在 Header 中带上这个 JWT 。
- 服务端检查 JWT 并从中获取用户相关信息。
两点建议:
- 建议将 JWT 存放在 localStorage 中,放在 Cookie 中会有 CSRF 风险。
- 请求服务端并携带 JWT 的常见做法是将其放在 HTTP Header 的 Authorization 字段中( Authorization: Bearer Token )。
spring-security-jwt-guideopen in new window 就是一个基于 JWT 来做身份认证的简单案例,感兴趣的可以看看。
如何防止 JWT 被篡改?
有了签名之后,即使 JWT 被泄露或者解惑,黑客也没办法同时篡改 Signature 、Header 、Payload。
这是为什么呢?因为服务端拿到 JWT 之后,会解析出其中包含的 Header、Payload 以及 Signature 。服务端会根据 Header、Payload、密钥再次生成一个 Signature。拿新生成的 Signature 和 JWT 中的 Signature 作对比,如果一样就说明 Header 和 Payload 没有被修改。
不过,如果服务端的秘钥也被泄露的话,黑客就可以同时篡改 Signature 、Header 、Payload 了。黑客直接修改了 Header 和 Payload 之后,再重新生成一个 Signature 就可以了。
密钥一定保管好,一定不要泄露出去。JWT 安全的核心在于签名,签名安全的核心在密钥。
如何加强 JWT 的安全性?
- 使用安全系数高的加密算法。
- 使用成熟的开源库,没必要造轮子。
- JWT 存放在 localStorage 中而不是 Cookie 中,避免 CSRF 风险。
- 一定不要将隐私信息存放在 Payload 当中。
- 密钥一定保管好,一定不要泄露出去。JWT 安全的核心在于签名,签名安全的核心在密钥。
- Payload 要加入 exp (JWT 的过期时间),永久有效的 JWT 不合理。并且,JWT 的过期时间不易过长。
%23%20JWT%20%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5%E8%AF%A6%E8%A7%A3%0A%0A%5Btoc%5D%0A%0A%23%23%20%E4%BB%80%E4%B9%88%E6%98%AF%20JWT%3F%0A%0AJWT%20%EF%BC%88JSON%20Web%20Token%EF%BC%89%20%E6%98%AF%E7%9B%AE%E5%89%8D%E6%9C%80%E6%B5%81%E8%A1%8C%E7%9A%84%E8%B7%A8%E5%9F%9F%E8%AE%A4%E8%AF%81%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E6%98%AF%E4%B8%80%E7%A7%8D%E5%9F%BA%E4%BA%8E%20Token%20%E7%9A%84%E8%AE%A4%E8%AF%81%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E3%80%82%20%E4%BB%8E%20JWT%20%E7%9A%84%E5%85%A8%E7%A7%B0%E5%8F%AF%E4%BB%A5%E7%9C%8B%E5%87%BA%EF%BC%8CJWT%20%E6%9C%AC%E8%BA%AB%E4%B9%9F%E6%98%AF%20Token%EF%BC%8C%E4%B8%80%E7%A7%8D%E8%A7%84%E8%8C%83%E5%8C%96%E4%B9%8B%E5%90%8E%E7%9A%84%20JSON%20%E7%BB%93%E6%9E%84%E7%9A%84%20Token%E3%80%82%0A%0AJWT%20%E8%87%AA%E8%BA%AB%E5%8C%85%E5%90%AB%E4%BA%86%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E6%89%80%E9%9C%80%E8%A6%81%E7%9A%84%E6%89%80%E6%9C%89%E4%BF%A1%E6%81%AF%EF%BC%8C%E5%9B%A0%E6%AD%A4%EF%BC%8C%E6%88%91%E4%BB%AC%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8D%E9%9C%80%E8%A6%81%E5%AD%98%E5%82%A8%20Session%20%E4%BF%A1%E6%81%AF%E3%80%82%E8%BF%99%E6%98%BE%E7%84%B6%E5%A2%9E%E5%8A%A0%E4%BA%86%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%8F%AF%E7%94%A8%E6%80%A7%E5%92%8C%E4%BC%B8%E7%BC%A9%E6%80%A7%EF%BC%8C%E5%A4%A7%E5%A4%A7%E5%87%8F%E8%BD%BB%E4%BA%86%E6%9C%8D%E5%8A%A1%E7%AB%AF%E7%9A%84%E5%8E%8B%E5%8A%9B%E3%80%82%0A%0A%E5%8F%AF%E4%BB%A5%E7%9C%8B%E5%87%BA%EF%BC%8CJWT%20%E6%9B%B4%E7%AC%A6%E5%90%88%E8%AE%BE%E8%AE%A1%20RESTful%20API%20%E6%97%B6%E7%9A%84%E3%80%8CStateless%EF%BC%88%E6%97%A0%E7%8A%B6%E6%80%81%EF%BC%89%E3%80%8D%E5%8E%9F%E5%88%99%20%E3%80%82%0A%0A%E5%B9%B6%E4%B8%94%EF%BC%8C%20%E4%BD%BF%E7%94%A8%20JWT%20%E8%AE%A4%E8%AF%81%E5%8F%AF%E4%BB%A5%E6%9C%89%E6%95%88%E9%81%BF%E5%85%8D%20CSRF%20%E6%94%BB%E5%87%BB%EF%BC%8C%E5%9B%A0%E4%B8%BA%20JWT%20%E4%B8%80%E8%88%AC%E6%98%AF%E5%AD%98%E5%9C%A8%E5%9C%A8%20localStorage%20%E4%B8%AD%EF%BC%8C%E4%BD%BF%E7%94%A8%20JWT%20%E8%BF%9B%E8%A1%8C%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E7%9A%84%E8%BF%87%E7%A8%8B%E4%B8%AD%E6%98%AF%E4%B8%8D%E4%BC%9A%E6%B6%89%E5%8F%8A%E5%88%B0%20Cookie%20%E7%9A%84%E3%80%82%0A%0A%E6%88%91%E5%9C%A8%20%5BJWT%20%E4%BC%98%E7%BC%BA%E7%82%B9%E5%88%86%E6%9E%90%5D(https%3A%2F%2Fjavaguide.cn%2Fsystem-design%2Fsecurity%2Fadvantages%26disadvantages-of-jwt.html)%E8%BF%99%E7%AF%87%E6%96%87%E7%AB%A0%E4%B8%AD%E6%9C%89%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D%E5%88%B0%E4%BD%BF%E7%94%A8%20JWT%20%E5%81%9A%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E7%9A%84%E4%BC%98%E5%8A%BF%E5%92%8C%E5%8A%A3%E5%8A%BF%E3%80%82%0A%0A%E4%B8%8B%E9%9D%A2%E6%98%AF%20%5BRFC%207519open%20in%20new%20window%5D(https%3A%2F%2Ftools.ietf.org%2Fhtml%2Frfc7519)%20%E5%AF%B9%20JWT%20%E5%81%9A%E7%9A%84%E8%BE%83%E4%B8%BA%E6%AD%A3%E5%BC%8F%E7%9A%84%E5%AE%9A%E4%B9%89%E3%80%82%0A%0A%3E%20JSON%20Web%20Token%20(JWT)%20is%20a%20compact%2C%20URL-safe%20means%20of%20representing%20claims%20to%20be%20transferred%20between%20two%20parties.%20The%20claims%20in%20a%20JWT%20are%20encoded%20as%20a%20JSON%20object%20that%20is%20used%20as%20the%20payload%20of%20a%20JSON%20Web%20Signature%20(JWS)%20structure%20or%20as%20the%20plaintext%20of%20a%20JSON%20Web%20Encryption%20(JWE)%20structure%2C%20enabling%20the%20claims%20to%20be%20digitally%20signed%20or%20integrity%20protected%20with%20a%20Message%20Authentication%20Code%20(MAC)%20and%2For%20encrypted.%20%E2%80%94%E2%80%94%5BJSON%20Web%20Token%20(JWT)open%20in%20new%20window%5D(https%3A%2F%2Ftools.ietf.org%2Fhtml%2Frfc7519)%0A%0A%23%23%20%20JWT%20%E7%94%B1%E5%93%AA%E4%BA%9B%E9%83%A8%E5%88%86%E7%BB%84%E6%88%90%EF%BC%9F%0A%0A!%5B%E6%AD%A4%E5%9B%BE%E7%89%87%E6%9D%A5%E6%BA%90%E4%BA%8E%EF%BC%9Ahttps%3A%2F%2Fsupertokens.com%2Fblog%2Foauth-vs-jwt%5D(https%3A%2F%2Fguide-blog-images.oss-cn-shenzhen.aliyuncs.com%2Fjavaguide%2Fsystem-design%2Fjwt%2Fjwt-composition.png)%0A%0AJWT%20%E6%9C%AC%E8%B4%A8%E4%B8%8A%E5%B0%B1%E6%98%AF%E4%B8%80%E7%BB%84%E5%AD%97%E4%B8%B2%EF%BC%8C%E9%80%9A%E8%BF%87%EF%BC%88%60.%60%EF%BC%89%E5%88%87%E5%88%86%E6%88%90%E4%B8%89%E4%B8%AA%E4%B8%BA%20Base64%20%E7%BC%96%E7%A0%81%E7%9A%84%E9%83%A8%E5%88%86%EF%BC%9A%0A%0A-%20Header%20%3A%20%E6%8F%8F%E8%BF%B0%20JWT%20%E7%9A%84%E5%85%83%E6%95%B0%E6%8D%AE%EF%BC%8C%E5%AE%9A%E4%B9%89%E4%BA%86%E7%94%9F%E6%88%90%E7%AD%BE%E5%90%8D%E7%9A%84%E7%AE%97%E6%B3%95%E4%BB%A5%E5%8F%8A%20%60Token%60%20%E7%9A%84%E7%B1%BB%E5%9E%8B%E3%80%82%0A-%20Payload%20%3A%20%E7%94%A8%E6%9D%A5%E5%AD%98%E6%94%BE%E5%AE%9E%E9%99%85%E9%9C%80%E8%A6%81%E4%BC%A0%E9%80%92%E7%9A%84%E6%95%B0%E6%8D%AE%0A-%20Signature%EF%BC%88%E7%AD%BE%E5%90%8D%EF%BC%89%20%EF%BC%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%80%9A%E8%BF%87%20Payload%E3%80%81Header%20%E5%92%8C%E4%B8%80%E4%B8%AA%E5%AF%86%E9%92%A5(Secret)%E4%BD%BF%E7%94%A8%20Header%20%E9%87%8C%E9%9D%A2%E6%8C%87%E5%AE%9A%E7%9A%84%E7%AD%BE%E5%90%8D%E7%AE%97%E6%B3%95%EF%BC%88%E9%BB%98%E8%AE%A4%E6%98%AF%20HMAC%20SHA256%EF%BC%89%E7%94%9F%E6%88%90%E3%80%82%0A%0AJWT%20%E9%80%9A%E5%B8%B8%E6%98%AF%E8%BF%99%E6%A0%B7%E7%9A%84%EF%BC%9A%60xxxxx.yyyyy.zzzzz%60%E3%80%82%0A%0A%E7%A4%BA%E4%BE%8B%EF%BC%9A%0A%0A%60%60%60java%0AeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.%0AeyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.%0ASflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c%0A%60%60%60%0A%0A%0A%E4%BD%A0%E5%8F%AF%E4%BB%A5%E5%9C%A8%20%5Bjwt.ioopen%20in%20new%20window%5D(https%3A%2F%2Fjwt.io%2F)%20%E8%BF%99%E4%B8%AA%E7%BD%91%E7%AB%99%E4%B8%8A%E5%AF%B9%E5%85%B6%20JWT%20%E8%BF%9B%E8%A1%8C%E8%A7%A3%E7%A0%81%EF%BC%8C%E8%A7%A3%E7%A0%81%E4%B9%8B%E5%90%8E%E5%BE%97%E5%88%B0%E7%9A%84%E5%B0%B1%E6%98%AF%20Header%E3%80%81Payload%E3%80%81Signature%20%E8%BF%99%E4%B8%89%E9%83%A8%E5%88%86%E3%80%82%0A%0AHeader%20%E5%92%8C%20Payload%20%E9%83%BD%E6%98%AF%20JSON%20%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%95%B0%E6%8D%AE%EF%BC%8CSignature%20%E7%94%B1%20Payload%E3%80%81Header%20%E5%92%8C%20Secret(%E5%AF%86%E9%92%A5)%E9%80%9A%E8%BF%87%E7%89%B9%E5%AE%9A%E7%9A%84%E8%AE%A1%E7%AE%97%E5%85%AC%E5%BC%8F%E5%92%8C%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95%E5%BE%97%E5%88%B0%E3%80%82%0A%0A!%5Bc63e4c498565f8b1918aaa6512181be9.png%5D(en-resource%3A%2F%2Fdatabase%2F5874%3A0)%0A%0A%0A%23%23%23%20Header%0A%0AHeader%20%E9%80%9A%E5%B8%B8%E7%94%B1%E4%B8%A4%E9%83%A8%E5%88%86%E7%BB%84%E6%88%90%EF%BC%9A%0A%0A-%20%60typ%60%EF%BC%88Type%EF%BC%89%EF%BC%9A%E4%BB%A4%E7%89%8C%E7%B1%BB%E5%9E%8B%EF%BC%8C%E4%B9%9F%E5%B0%B1%E6%98%AF%20JWT%E3%80%82%0A-%20%60alg%60%EF%BC%88Algorithm%EF%BC%89%20%EF%BC%9A%E7%AD%BE%E5%90%8D%E7%AE%97%E6%B3%95%EF%BC%8C%E6%AF%94%E5%A6%82%20HS256%E3%80%82%0A%0A%E7%A4%BA%E4%BE%8B%EF%BC%9A%0A%0A%60%60%60java%0A%7B%0A%20%20%22alg%22%3A%20%22HS256%22%2C%0A%20%20%22typ%22%3A%20%22JWT%22%0A%7D%0A%60%60%60%0A%0A%0AJSON%20%E5%BD%A2%E5%BC%8F%E7%9A%84%20Header%20%E8%A2%AB%E8%BD%AC%E6%8D%A2%E6%88%90%20Base64%20%E7%BC%96%E7%A0%81%EF%BC%8C%E6%88%90%E4%B8%BA%20JWT%20%E7%9A%84%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86%E3%80%82%0A%0A%0A%23%23%23%20Payload%0A%0APayload%20%E4%B9%9F%E6%98%AF%20JSON%20%E6%A0%BC%E5%BC%8F%E6%95%B0%E6%8D%AE%EF%BC%8C%E5%85%B6%E4%B8%AD%E5%8C%85%E5%90%AB%E4%BA%86%20Claims(%E5%A3%B0%E6%98%8E%EF%BC%8C%E5%8C%85%E5%90%AB%20JWT%20%E7%9A%84%E7%9B%B8%E5%85%B3%E4%BF%A1%E6%81%AF)%E3%80%82%0A%0AClaims%20%E5%88%86%E4%B8%BA%E4%B8%89%E7%A7%8D%E7%B1%BB%E5%9E%8B%EF%BC%9A%0A%0A-%20Registered%20Claims%EF%BC%88%E6%B3%A8%E5%86%8C%E5%A3%B0%E6%98%8E%EF%BC%89%20%EF%BC%9A%E9%A2%84%E5%AE%9A%E4%B9%89%E7%9A%84%E4%B8%80%E4%BA%9B%E5%A3%B0%E6%98%8E%EF%BC%8C%E5%BB%BA%E8%AE%AE%E4%BD%BF%E7%94%A8%EF%BC%8C%E4%BD%86%E4%B8%8D%E6%98%AF%E5%BC%BA%E5%88%B6%E6%80%A7%E7%9A%84%E3%80%82%0A-%20Public%20Claims%EF%BC%88%E5%85%AC%E6%9C%89%E5%A3%B0%E6%98%8E%EF%BC%89%20%EF%BC%9AJWT%20%E7%AD%BE%E5%8F%91%E6%96%B9%E5%8F%AF%E4%BB%A5%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E5%A3%B0%E6%98%8E%EF%BC%8C%E4%BD%86%E6%98%AF%E4%B8%BA%E4%BA%86%E9%81%BF%E5%85%8D%E5%86%B2%E7%AA%81%EF%BC%8C%E5%BA%94%E8%AF%A5%E5%9C%A8%20%5BIANA%20JSON%20Web%20Token%20Registryopen%20in%20new%20window%5D(https%3A%2F%2Fwww.iana.org%2Fassignments%2Fjwt%2Fjwt.xhtml)%20%E4%B8%AD%E5%AE%9A%E4%B9%89%E5%AE%83%E4%BB%AC%E3%80%82%0A-%20Private%20Claims%EF%BC%88%E7%A7%81%E6%9C%89%E5%A3%B0%E6%98%8E%EF%BC%89%20%EF%BC%9AJWT%20%E7%AD%BE%E5%8F%91%E6%96%B9%E5%9B%A0%E4%B8%BA%E9%A1%B9%E7%9B%AE%E9%9C%80%E8%A6%81%E8%80%8C%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E5%A3%B0%E6%98%8E%EF%BC%8C%E6%9B%B4%E7%AC%A6%E5%90%88%E5%AE%9E%E9%99%85%E9%A1%B9%E7%9B%AE%E5%9C%BA%E6%99%AF%E4%BD%BF%E7%94%A8%E3%80%82%0A%0A%E4%B8%8B%E9%9D%A2%E6%98%AF%E4%B8%80%E4%BA%9B%E5%B8%B8%E8%A7%81%E7%9A%84%E6%B3%A8%E5%86%8C%E5%A3%B0%E6%98%8E%EF%BC%9A%0A%0A-%20%60iss%60%EF%BC%88issuer%EF%BC%89%EF%BC%9AJWT%20%E7%AD%BE%E5%8F%91%E6%96%B9%E3%80%82%0A-%20%60iat%60%EF%BC%88issued%20at%20time%EF%BC%89%EF%BC%9AJWT%20%E7%AD%BE%E5%8F%91%E6%97%B6%E9%97%B4%E3%80%82%0A-%20%60sub%60%EF%BC%88subject%EF%BC%89%EF%BC%9AJWT%20%E4%B8%BB%E9%A2%98%E3%80%82%0A-%20%60aud%60%EF%BC%88audience%EF%BC%89%EF%BC%9AJWT%20%E6%8E%A5%E6%94%B6%E6%96%B9%E3%80%82%0A-%20%60exp%60%EF%BC%88expiration%20time%EF%BC%89%EF%BC%9AJWT%20%E7%9A%84%E8%BF%87%E6%9C%9F%E6%97%B6%E9%97%B4%E3%80%82%0A-%20%60nbf%60%EF%BC%88not%20before%20time%EF%BC%89%EF%BC%9AJWT%20%E7%94%9F%E6%95%88%E6%97%B6%E9%97%B4%EF%BC%8C%E6%97%A9%E4%BA%8E%E8%AF%A5%E5%AE%9A%E4%B9%89%E7%9A%84%E6%97%B6%E9%97%B4%E7%9A%84%20JWT%20%E4%B8%8D%E8%83%BD%E8%A2%AB%E6%8E%A5%E5%8F%97%E5%A4%84%E7%90%86%E3%80%82%0A-%20%60jti%60%EF%BC%88JWT%20ID%EF%BC%89%EF%BC%9AJWT%20%E5%94%AF%E4%B8%80%E6%A0%87%E8%AF%86%E3%80%82%0A%0A%E7%A4%BA%E4%BE%8B%EF%BC%9A%0A%0A%60%60%60json%0A%7B%0A%20%20%22uid%22%3A%20%22ff1212f5-d8d1-4496-bf41-d2dda73de19a%22%2C%0A%20%20%22sub%22%3A%20%221234567890%22%2C%0A%20%20%22name%22%3A%20%22John%20Doe%22%2C%0A%20%20%22exp%22%3A%2015323232%2C%0A%20%20%22iat%22%3A%201516239022%2C%0A%20%20%22scope%22%3A%20%5B%22admin%22%2C%20%22user%22%5D%0A%7D%0A%60%60%60%0A%0A%0APayload%20%E9%83%A8%E5%88%86%E9%BB%98%E8%AE%A4%E6%98%AF%E4%B8%8D%E5%8A%A0%E5%AF%86%E7%9A%84%EF%BC%8C%E4%B8%80%E5%AE%9A%E4%B8%8D%E8%A6%81%E5%B0%86%E9%9A%90%E7%A7%81%E4%BF%A1%E6%81%AF%E5%AD%98%E6%94%BE%E5%9C%A8%20Payload%20%E5%BD%93%E4%B8%AD%EF%BC%81%EF%BC%81%EF%BC%81%0A%0AJSON%20%E5%BD%A2%E5%BC%8F%E7%9A%84%20Payload%20%E8%A2%AB%E8%BD%AC%E6%8D%A2%E6%88%90%20Base64%20%E7%BC%96%E7%A0%81%EF%BC%8C%E6%88%90%E4%B8%BA%20JWT%20%E7%9A%84%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86%E3%80%82%0A%0A%23%23%23%20Signature%0A%0ASignature%20%E9%83%A8%E5%88%86%E6%98%AF%E5%AF%B9%E5%89%8D%E4%B8%A4%E9%83%A8%E5%88%86%E7%9A%84%E7%AD%BE%E5%90%8D%EF%BC%8C%E4%BD%9C%E7%94%A8%E6%98%AF%E9%98%B2%E6%AD%A2%20JWT%EF%BC%88%E4%B8%BB%E8%A6%81%E6%98%AF%20payload%EF%BC%89%20%E8%A2%AB%E7%AF%A1%E6%94%B9%E3%80%82%0A%0A%E8%BF%99%E4%B8%AA%E7%AD%BE%E5%90%8D%E7%9A%84%E7%94%9F%E6%88%90%E9%9C%80%E8%A6%81%E7%94%A8%E5%88%B0%EF%BC%9A%0A%0A-%20Header%20%2B%20Payload%E3%80%82%0A-%20%E5%AD%98%E6%94%BE%E5%9C%A8%E6%9C%8D%E5%8A%A1%E7%AB%AF%E7%9A%84%E5%AF%86%E9%92%A5(%E4%B8%80%E5%AE%9A%E4%B8%8D%E8%A6%81%E6%B3%84%E9%9C%B2%E5%87%BA%E5%8E%BB)%E3%80%82%0A-%20%E7%AD%BE%E5%90%8D%E7%AE%97%E6%B3%95%E3%80%82%0A%0A%E7%AD%BE%E5%90%8D%E7%9A%84%E8%AE%A1%E7%AE%97%E5%85%AC%E5%BC%8F%E5%A6%82%E4%B8%8B%EF%BC%9A%0A%0A%60%60%60java%0AHMACSHA256(%0A%20%20base64UrlEncode(header)%20%2B%20%22.%22%20%2B%0A%20%20base64UrlEncode(payload)%2C%0A%20%20secret)%0A%60%60%60%0A%0A%0A%E7%AE%97%E5%87%BA%E7%AD%BE%E5%90%8D%E4%BB%A5%E5%90%8E%EF%BC%8C%E6%8A%8A%20Header%E3%80%81Payload%E3%80%81Signature%20%E4%B8%89%E4%B8%AA%E9%83%A8%E5%88%86%E6%8B%BC%E6%88%90%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%8C%E6%AF%8F%E4%B8%AA%E9%83%A8%E5%88%86%E4%B9%8B%E9%97%B4%E7%94%A8%22%E7%82%B9%22%EF%BC%88%60.%60%EF%BC%89%E5%88%86%E9%9A%94%EF%BC%8C%E8%BF%99%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%B0%B1%E6%98%AF%20JWT%20%E3%80%82%0A%0A%23%23%20%20%E5%A6%82%E4%BD%95%E5%9F%BA%E4%BA%8E%20JWT%20%E8%BF%9B%E8%A1%8C%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%EF%BC%9F%0A%0A%E5%9C%A8%E5%9F%BA%E4%BA%8E%20JWT%20%E8%BF%9B%E8%A1%8C%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E7%9A%84%E7%9A%84%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%B8%AD%EF%BC%8C%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%80%9A%E8%BF%87%20Payload%E3%80%81Header%20%E5%92%8C%20Secret(%E5%AF%86%E9%92%A5)%E5%88%9B%E5%BB%BA%20JWT%20%E5%B9%B6%E5%B0%86%20JWT%20%E5%8F%91%E9%80%81%E7%BB%99%E5%AE%A2%E6%88%B7%E7%AB%AF%E3%80%82%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%8E%A5%E6%94%B6%E5%88%B0%20JWT%20%E4%B9%8B%E5%90%8E%EF%BC%8C%E4%BC%9A%E5%B0%86%E5%85%B6%E4%BF%9D%E5%AD%98%E5%9C%A8%20Cookie%20%E6%88%96%E8%80%85%20localStorage%20%E9%87%8C%E9%9D%A2%EF%BC%8C%E4%BB%A5%E5%90%8E%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%8F%91%E5%87%BA%E7%9A%84%E6%89%80%E6%9C%89%E8%AF%B7%E6%B1%82%E9%83%BD%E4%BC%9A%E6%90%BA%E5%B8%A6%E8%BF%99%E4%B8%AA%E4%BB%A4%E7%89%8C%E3%80%82%0A%0A!%5B95970e4b0e7d6e532e7e61a92c51880c.png%5D(en-resource%3A%2F%2Fdatabase%2F5876%3A0)%0A%0A%0A%E7%AE%80%E5%8C%96%E5%90%8E%E7%9A%84%E6%AD%A5%E9%AA%A4%E5%A6%82%E4%B8%8B%EF%BC%9A%0A%0A1.%20%E7%94%A8%E6%88%B7%E5%90%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8F%91%E9%80%81%E7%94%A8%E6%88%B7%E5%90%8D%E3%80%81%E5%AF%86%E7%A0%81%E4%BB%A5%E5%8F%8A%E9%AA%8C%E8%AF%81%E7%A0%81%E7%94%A8%E4%BA%8E%E7%99%BB%E9%99%86%E7%B3%BB%E7%BB%9F%E3%80%82%0A2.%20%E5%A6%82%E6%9E%9C%E7%94%A8%E6%88%B7%E7%94%A8%E6%88%B7%E5%90%8D%E3%80%81%E5%AF%86%E7%A0%81%E4%BB%A5%E5%8F%8A%E9%AA%8C%E8%AF%81%E7%A0%81%E6%A0%A1%E9%AA%8C%E6%AD%A3%E7%A1%AE%E7%9A%84%E8%AF%9D%EF%BC%8C%E6%9C%8D%E5%8A%A1%E7%AB%AF%E4%BC%9A%E8%BF%94%E5%9B%9E%E5%B7%B2%E7%BB%8F%E7%AD%BE%E5%90%8D%E7%9A%84%20Token%EF%BC%8C%E4%B9%9F%E5%B0%B1%E6%98%AF%20JWT%E3%80%82%0A3.%20%E7%94%A8%E6%88%B7%E4%BB%A5%E5%90%8E%E6%AF%8F%E6%AC%A1%E5%90%91%E5%90%8E%E7%AB%AF%E5%8F%91%E8%AF%B7%E6%B1%82%E9%83%BD%E5%9C%A8%20Header%20%E4%B8%AD%E5%B8%A6%E4%B8%8A%E8%BF%99%E4%B8%AA%20JWT%20%E3%80%82%0A4.%20%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%A3%80%E6%9F%A5%20JWT%20%E5%B9%B6%E4%BB%8E%E4%B8%AD%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E7%9B%B8%E5%85%B3%E4%BF%A1%E6%81%AF%E3%80%82%0A%0A%E4%B8%A4%E7%82%B9%E5%BB%BA%E8%AE%AE%EF%BC%9A%0A%0A1.%20%E5%BB%BA%E8%AE%AE%E5%B0%86%20JWT%20%E5%AD%98%E6%94%BE%E5%9C%A8%20localStorage%20%E4%B8%AD%EF%BC%8C%E6%94%BE%E5%9C%A8%20Cookie%20%E4%B8%AD%E4%BC%9A%E6%9C%89%20CSRF%20%E9%A3%8E%E9%99%A9%E3%80%82%0A2.%20%E8%AF%B7%E6%B1%82%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%B9%B6%E6%90%BA%E5%B8%A6%20JWT%20%E7%9A%84%E5%B8%B8%E8%A7%81%E5%81%9A%E6%B3%95%E6%98%AF%E5%B0%86%E5%85%B6%E6%94%BE%E5%9C%A8%20HTTP%20Header%20%E7%9A%84%20%60Authorization%60%20%E5%AD%97%E6%AE%B5%E4%B8%AD%EF%BC%88%60Authorization%3A%20Bearer%20Token%60%EF%BC%89%E3%80%82%0A%0A%5Bspring-security-jwt-guideopen%20in%20new%20window%5D(https%3A%2F%2Fgithub.com%2FSnailclimb%2Fspring-security-jwt-guide)%20%E5%B0%B1%E6%98%AF%E4%B8%80%E4%B8%AA%E5%9F%BA%E4%BA%8E%20JWT%20%E6%9D%A5%E5%81%9A%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E7%9A%84%E7%AE%80%E5%8D%95%E6%A1%88%E4%BE%8B%EF%BC%8C%E6%84%9F%E5%85%B4%E8%B6%A3%E7%9A%84%E5%8F%AF%E4%BB%A5%E7%9C%8B%E7%9C%8B%E3%80%82%0A%0A%23%23%20%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2%20JWT%20%E8%A2%AB%E7%AF%A1%E6%94%B9%EF%BC%9F%0A%0A%E6%9C%89%E4%BA%86%E7%AD%BE%E5%90%8D%E4%B9%8B%E5%90%8E%EF%BC%8C%E5%8D%B3%E4%BD%BF%20JWT%20%E8%A2%AB%E6%B3%84%E9%9C%B2%E6%88%96%E8%80%85%E8%A7%A3%E6%83%91%EF%BC%8C%E9%BB%91%E5%AE%A2%E4%B9%9F%E6%B2%A1%E5%8A%9E%E6%B3%95%E5%90%8C%E6%97%B6%E7%AF%A1%E6%94%B9%20Signature%20%E3%80%81Header%20%E3%80%81Payload%E3%80%82%0A%0A%E8%BF%99%E6%98%AF%E4%B8%BA%E4%BB%80%E4%B9%88%E5%91%A2%EF%BC%9F%E5%9B%A0%E4%B8%BA%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%8B%BF%E5%88%B0%20JWT%20%E4%B9%8B%E5%90%8E%EF%BC%8C%E4%BC%9A%E8%A7%A3%E6%9E%90%E5%87%BA%E5%85%B6%E4%B8%AD%E5%8C%85%E5%90%AB%E7%9A%84%20Header%E3%80%81Payload%20%E4%BB%A5%E5%8F%8A%20Signature%20%E3%80%82%E6%9C%8D%E5%8A%A1%E7%AB%AF%E4%BC%9A%E6%A0%B9%E6%8D%AE%20Header%E3%80%81Payload%E3%80%81%E5%AF%86%E9%92%A5%E5%86%8D%E6%AC%A1%E7%94%9F%E6%88%90%E4%B8%80%E4%B8%AA%20Signature%E3%80%82%E6%8B%BF%E6%96%B0%E7%94%9F%E6%88%90%E7%9A%84%20Signature%20%E5%92%8C%20JWT%20%E4%B8%AD%E7%9A%84%20Signature%20%E4%BD%9C%E5%AF%B9%E6%AF%94%EF%BC%8C%E5%A6%82%E6%9E%9C%E4%B8%80%E6%A0%B7%E5%B0%B1%E8%AF%B4%E6%98%8E%20Header%20%E5%92%8C%20Payload%20%E6%B2%A1%E6%9C%89%E8%A2%AB%E4%BF%AE%E6%94%B9%E3%80%82%0A%0A%E4%B8%8D%E8%BF%87%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%9C%8D%E5%8A%A1%E7%AB%AF%E7%9A%84%E7%A7%98%E9%92%A5%E4%B9%9F%E8%A2%AB%E6%B3%84%E9%9C%B2%E7%9A%84%E8%AF%9D%EF%BC%8C%E9%BB%91%E5%AE%A2%E5%B0%B1%E5%8F%AF%E4%BB%A5%E5%90%8C%E6%97%B6%E7%AF%A1%E6%94%B9%20Signature%20%E3%80%81Header%20%E3%80%81Payload%20%E4%BA%86%E3%80%82%E9%BB%91%E5%AE%A2%E7%9B%B4%E6%8E%A5%E4%BF%AE%E6%94%B9%E4%BA%86%20Header%20%E5%92%8C%20Payload%20%E4%B9%8B%E5%90%8E%EF%BC%8C%E5%86%8D%E9%87%8D%E6%96%B0%E7%94%9F%E6%88%90%E4%B8%80%E4%B8%AA%20Signature%20%E5%B0%B1%E5%8F%AF%E4%BB%A5%E4%BA%86%E3%80%82%0A%0A%E5%AF%86%E9%92%A5%E4%B8%80%E5%AE%9A%E4%BF%9D%E7%AE%A1%E5%A5%BD%EF%BC%8C%E4%B8%80%E5%AE%9A%E4%B8%8D%E8%A6%81%E6%B3%84%E9%9C%B2%E5%87%BA%E5%8E%BB%E3%80%82JWT%20%E5%AE%89%E5%85%A8%E7%9A%84%E6%A0%B8%E5%BF%83%E5%9C%A8%E4%BA%8E%E7%AD%BE%E5%90%8D%EF%BC%8C%E7%AD%BE%E5%90%8D%E5%AE%89%E5%85%A8%E7%9A%84%E6%A0%B8%E5%BF%83%E5%9C%A8%E5%AF%86%E9%92%A5%E3%80%82%0A%0A%23%23%20%E5%A6%82%E4%BD%95%E5%8A%A0%E5%BC%BA%20JWT%20%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%EF%BC%9F%0A%0A1.%20%E4%BD%BF%E7%94%A8%E5%AE%89%E5%85%A8%E7%B3%BB%E6%95%B0%E9%AB%98%E7%9A%84%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95%E3%80%82%0A2.%20%E4%BD%BF%E7%94%A8%E6%88%90%E7%86%9F%E7%9A%84%E5%BC%80%E6%BA%90%E5%BA%93%EF%BC%8C%E6%B2%A1%E5%BF%85%E8%A6%81%E9%80%A0%E8%BD%AE%E5%AD%90%E3%80%82%0A3.%20JWT%20%E5%AD%98%E6%94%BE%E5%9C%A8%20localStorage%20%E4%B8%AD%E8%80%8C%E4%B8%8D%E6%98%AF%20Cookie%20%E4%B8%AD%EF%BC%8C%E9%81%BF%E5%85%8D%20CSRF%20%E9%A3%8E%E9%99%A9%E3%80%82%0A4.%20%E4%B8%80%E5%AE%9A%E4%B8%8D%E8%A6%81%E5%B0%86%E9%9A%90%E7%A7%81%E4%BF%A1%E6%81%AF%E5%AD%98%E6%94%BE%E5%9C%A8%20Payload%20%E5%BD%93%E4%B8%AD%E3%80%82%0A5.%20%E5%AF%86%E9%92%A5%E4%B8%80%E5%AE%9A%E4%BF%9D%E7%AE%A1%E5%A5%BD%EF%BC%8C%E4%B8%80%E5%AE%9A%E4%B8%8D%E8%A6%81%E6%B3%84%E9%9C%B2%E5%87%BA%E5%8E%BB%E3%80%82JWT%20%E5%AE%89%E5%85%A8%E7%9A%84%E6%A0%B8%E5%BF%83%E5%9C%A8%E4%BA%8E%E7%AD%BE%E5%90%8D%EF%BC%8C%E7%AD%BE%E5%90%8D%E5%AE%89%E5%85%A8%E7%9A%84%E6%A0%B8%E5%BF%83%E5%9C%A8%E5%AF%86%E9%92%A5%E3%80%82%0A6.%20Payload%20%E8%A6%81%E5%8A%A0%E5%85%A5%20%60exp%60%20%EF%BC%88JWT%20%E7%9A%84%E8%BF%87%E6%9C%9F%E6%97%B6%E9%97%B4%EF%BC%89%EF%BC%8C%E6%B0%B8%E4%B9%85%E6%9C%89%E6%95%88%E7%9A%84%20JWT%20%E4%B8%8D%E5%90%88%E7%90%86%E3%80%82%E5%B9%B6%E4%B8%94%EF%BC%8CJWT%20%E7%9A%84%E8%BF%87%E6%9C%9F%E6%97%B6%E9%97%B4%E4%B8%8D%E6%98%93%E8%BF%87%E9%95%BF%E3%80%82%0A
