基本介绍
Token(令牌)是一种用于身份验证和授权的凭证,它通常是一个加密的字符串,通常包含用户信息、过期时间等数据。相比传统的session认证,token更适合现代分布式系统和移动应用。
请以JWT为例,详情说明一下Token的组成,分为三部分组成,每部分用点(.)分隔:Header.Payload.Signature
- Header(头部):
{
"alg": "HS256", // 签名算法
"typ": "JWT" // token类型
}
- Payload(负载):
{
"sub": "1234567890", // 用户ID
"name": "John Doe", // 用户信息
"iat": 1516239022, // 签发时间
"exp": 1516242622 // 过期时间
}
- Signature(签名):
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
请以JWT为例,详情说明一下Token的使用流程,
- 用户登录阶段:
// 1. 客户端发送登录请求
POST /api/login
{
"username": "user@example.com",
"password": "password123"
}
// 2. 服务器验证并生成JWT
const jwt = {
header: {
"alg": "HS256",
"typ": "JWT"
},
payload: {
"userId": "123",
"username": "user@example.com",
"exp": new Date().getTime() + 3600000 // 1小时后过期
}
}
// 3. 服务器返回JWT
{
"token": "eyJhbGciOiJIUzI1...",
"expires_in": 3600
}
- 使用JWT访问受保护资源:
// 客户端发送请求,在header中携带JWT
GET /api/protected-resource
Authorization: Bearer eyJhbGciOiJIUzI1...
// 服务器验证流程:
1. 提取token
2. 验证签名
3. 检查是否过期
4. 验证token中的声明(claims)
5. 授权访问资源
常见Token类型
类型 | 特点 | 适用 | 优势 | 劣势 |
---|---|---|---|---|
JWT (JSON Web Token) | 自包含的token,包含三部分:header、payload和signature | Web API认证 |
|
|
Access Token | 短期有效的访问令牌 | 用于访问受保护的资源和API |
|
|
Refresh Token | 长期有效的更新令牌 | 用于获取新的Access Token |
|
|
Bearer Token | 简单的字符串token | HTTP请求认证 |
|
|
Session Token | 服务器端存储的会话标识 | 传统的Web应用会话管理 |
|
|
API Key | 静态的访问密钥 | API访问认证 |
|
|
SAML Token | XML格式的安全断言 | 企业级单点登录(SSO) |
|
|
选择建议
-
Web应用推荐使用JWT + Refresh Token的组合
-
微服务间通信可以使用JWT或Bearer Token
-
企业应用考虑SAML Token
-
简单API集成可以使用API Key
-
移动应用推荐Access Token + Refresh Token的组合