paopao/docs/guides/JWT.md

52 lines
2.9 KiB
Markdown
Raw Permalink Normal View History

2024-05-13 14:59:55 +08:00
## JWT
JSON Web Token (JWT)是一个开放标准(RFC 7519)它定义了一种紧凑的、自包含的方式用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任因为它是数字签名的。
由于其轻量级和易于使用的特性JWT在现代的Web应用中非常流行尤其是在需要跨域认证的场景中。
### JWT的组成
JWT由三部分组成用点`.`分隔,形成`header.payload.signature`的结构:
1. **Header头部**通常由两部分组成算法alg和令牌类型typ。例如`{"alg":"HS256","typ":"JWT"}`。
2. **Payload负载**包含所谓的“Claims”即声明。声明可以是注册声明也可以是公开的声明。注册声明是预定义的声明如`iss`(发行者),`sub`(主题),`aud`(观众),`exp`(过期时间),`iat`(签发时间),`jti`JWT的唯一身份标识等。公开的声明可以由发行者自行定义。
3. **Signature签名**是一个使用头部中指定的算法对前两部分进行签名的结果。签名用于验证消息在传递过程中没有被篡改并且如果使用了私钥签名还可以验证JWT的发行者。
### JWT的工作流程
1. **用户认证**:用户使用用户名和密码在客户端进行认证。
2. **认证服务器验证**服务器验证用户的凭据如果验证成功服务器会生成一个JWT。
3. **发送JWT**服务器将JWT发送回客户端。
4. **存储JWT**客户端可以将其存储在本地存储如LocalStorage、SessionStorage或Cookies中。
5. **发送请求**客户端在每次请求到受保护资源时将JWT发送到服务器。
6. **服务器验证**服务器接收到JWT后会验证其签名的有效性并检查如`exp`过期时间等声明以确保JWT没有过期。
7. **访问资源**如果JWT有效服务器允许客户端访问请求的资源。
8. **刷新令牌**如果JWT过期客户端可以使用刷新令牌如果存在来获取新的JWT。
### 示例
假设一个用户登录了一个网站以下是JWT的工作流程
1. 用户输入用户名和密码。
2. 网站将这些凭据发送到服务器。
3. 服务器验证凭据如果验证通过生成一个JWT。
4. 服务器将JWT发送回用户。
5. 用户将JWT存储在浏览器的LocalStorage中。
6. 用户想要访问一个受保护的页面。
7. 用户的浏览器发送一个请求到服务器并将JWT作为请求的一部分发送。
8. 服务器验证JWT的签名检查`exp`声明以确保它没有过期。
9. 如果JWT有效服务器提供受保护的页面内容。
JWT是一种无状态的认证机制它使得用户状态不需要存储在服务器上从而减轻了服务器的负担并且可以跨不同的服务和API进行使用。
### 参考
[深入浅出之JWT(JSON Web Token)](https://zhuanlan.zhihu.com/p/355160217)