jwt详解
时间: 2025-06-13 17:58:06 浏览: 12
### 什么是JSON Web Token (JWT)
JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息。JWT使用JSON对象来表示数据,并支持通过加密或签名的方式确保信息的完整性和安全性[^1]。
JWT的核心设计理念是将用户认证信息直接嵌入到令牌中,而不是依赖于服务器端存储。这种方式使得JWT特别适合无状态认证系统,因为服务器不需要维护会话信息,从而提升了系统的可扩展性[^4]。
---
### JWT的核心结构
JWT的结构由三部分组成,分别是Header(头部)、Payload(负载)和Signature(签名)。这三部分通过点号(`.`)连接,形成一个完整的JWT字符串。
#### 1. Header
Header通常包含两部分信息:令牌类型(即JWT)和使用的签名算法(如HMAC SHA256或RSA)。例如:
```json
{
"alg": "HS256",
"typ": "JWT"
}
```
这部分会被Base64编码后作为JWT的第一部分。
#### 2. Payload
Payload是JWT的主要部分,包含了声明(Claims)。声明可以分为三种类型:
- **Registered claims**(注册声明):预定义的标准字段,如`iss`(签发者)、`exp`(过期时间)、`sub`(主题)等。
- **Public claims**(公共声明):用户自定义的字段。
- **Private claims**(私有声明):应用内部使用的字段。
示例Payload:
```json
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
```
同样,这部分会被Base64编码后作为JWT的第二部分。
#### 3. Signature
为了验证消息的来源并确保消息未被篡改,JWT需要对前两部分进行签名。签名过程如下:
1. 将Header和Payload进行Base64编码。
2. 使用指定的算法(如HMAC SHA256)和密钥对编码后的字符串进行签名。
签名公式为:
```
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
```
最终的JWT格式为:
```
<base64url-encoded-header>.<base64url-encoded-payload>.<signature>
```
---
### JWT的工作原理
JWT的工作流程通常包括以下几个关键步骤:
1. **生成Token**:当用户登录成功后,服务器会根据用户的认证信息生成一个JWT,并将其返回给客户端。
2. **存储Token**:客户端可以将JWT存储在Cookie、LocalStorage或SessionStorage中。
3. **发送Token**:在后续请求中,客户端将JWT附加到HTTP请求头中(通常是`Authorization: Bearer <token>`)。
4. **验证Token**:服务器接收到请求后,解析JWT并验证其签名。如果签名有效,则允许访问受保护资源。
---
### JWT的使用场景
JWT因其紧凑性和安全性,在以下场景中得到了广泛应用:
1. **身份认证**:JWT常用于Web应用中的用户认证。客户端在每次请求时携带JWT,服务器通过验证JWT确认用户身份[^2]。
2. **信息交换**:JWT可以在不同系统之间安全地传递信息,同时确保信息的完整性和真实性[^3]。
3. **分布式系统**:在微服务架构中,JWT可以用于跨服务的身份验证和授权。
4. **单点登录(SSO)**:JWT支持跨域认证,因此非常适合实现单点登录系统[^5]。
---
### 示例代码:生成与解析JWT
以下是使用Python生成和解析JWT的示例代码:
#### 生成JWT
```python
import jwt
import datetime
secret_key = "my_secret_key"
payload = {
"sub": "1234567890",
"name": "John Doe",
"exp": datetime.datetime.utcnow() + datetime.timedelta(seconds=300)
}
token = jwt.encode(payload, secret_key, algorithm="HS256")
print("Generated Token:", token)
```
#### 解析JWT
```python
try:
decoded_payload = jwt.decode(token, secret_key, algorithms=["HS256"])
print("Decoded Payload:", decoded_payload)
except jwt.ExpiredSignatureError:
print("Token has expired")
except jwt.InvalidTokenError:
print("Invalid token")
```
---
### 注意事项
1. **安全性**:JWT本身并不提供加密功能,仅提供签名功能。如果需要加密,可以选择JWE(JSON Web Encryption)[^3]。
2. **Token过期管理**:应合理设置JWT的过期时间,并在必要时提供刷新机制。
3. **密钥管理**:签名密钥的安全性至关重要,必须妥善保管[^1]。
---
阅读全文
相关推荐


















