暗黑模式
后端框架的认证与授权的JWT (JSON Web Tokens)
基础概念
1. JWT 介绍
- JWT(JSON Web Tokens)是一种用于在网络应用环境间传递声明(claim)的开放标准(RFC 7519)。
2. JWT 结构
- JWT 主要包括三部分:Header(头部)、Payload(载荷)和 Signature(签名)。
案例:JWT 结构
plaintext
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.S5CmpNYnebPxDyC8VHNu1I8q3gO3kzuj8O1IHLyNggM
3. 令牌类型
- 分为访问令牌(Access Token)和刷新令牌(Refresh Token)。
4. Base64 编码
- JWT 的 Header 和 Payload 部分使用 Base64Url 编码。
5. 算法
- 可以使用不同的签名算法,例如:HS256, RS256。
6. 不可篡改
- 由于有签名,JWT 是不可篡改的。
7. 自包含
- JWT 自包含了所有需要验证的信息,避免了需要去数据库查询。
使用场景
8. 身份验证
- JWT 最常用于身份验证和信息交换。
9. 单点登录
- 可以用于实现 SSO(Single Sign-On)。
10. 会话超时
- 可以设置 Payload 中的
exp
字段来限制令牌的有效期。
案例:设置 exp
字段
json
{
"exp": 1601280400
}
11. 跨域认证
- JWT 是跨域友好的,因为它不依赖于 CORS。
12. 微服务
- 在微服务架构中,可以使用 JWT 进行服务间的安全通信。
安全性
13. 存储
- 应该安全地存储 JWT,通常保存在 HttpOnly 的 Cookie 中。
14. 令牌泄露
- 一旦 JWT 泄露,攻击者可以任意使用该令牌。
15. Token 刷新机制
- 通过使用 Refresh Token,可以在 Access Token 过期后获得新的 Access Token。
案例:使用 Refresh Token
python
def refresh_token():
old_token = request.headers.get('Authorization')
new_token = generate_new_token(old_token)
return jsonify({"access_token": new_token})
16. 头部信息
- Header 部分通常包含令牌的类型(JWT)和用于签名的算法。
案例:JWT Header
json
{
"alg": "HS256",
"typ": "JWT"
}
17. 载荷信息
- Payload 部分用于存储所需要的声明。
案例:JWT Payload
json
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
18. 签名
- Signature 部分用于验证令牌的完整性。
案例:生成签名(Python)
python
import hmac
import base64
header = '{"alg":"HS256","typ":"JWT"}'
payload = '{"sub":"1234567890","name":"John Doe","admin":true}'
signature = hmac.new(secret_key, f"{base64.urlsafe_b64encode(header)}.{base64.urlsafe_b64encode(payload)}", hashlib.sha256).digest()
19. 高级应用:JWE
- JSON Web Encryption(JWE)用于对 JWT 进行加密。
20. 高级应用:JWK
- JSON Web Key(JWK)用于描述用于加密/解密和签名/验证 JWT 的密钥。
21. 时钟偏差
- 考虑到服务器间可能存在的时钟偏差,在验证 `exp
和
nbf`(不早于)声明时应允许一定的偏差。
22. 声明类型
- 标准声明和自定义声明。
案例:自定义声明
json
{
"iss": "your-issuer",
"aud": "your-audience",
"custom_claim": "your-value"
}
23. 黑名单机制
- 如果需要废弃某个 JWT,通常需要维护一个黑名单。
24. Rotation Policy
- 针对长期有效的 JWT,应当定期进行密钥轮换。
25. None 算法漏洞
- 避免使用 None 算法,因为它可能导致安全漏洞。
26. 重放攻击防护
- 使用一次性 JWT 或其他机制来防止重放攻击。
27. API Gateway 集成
- 在微服务架构中,可以将 JWT 验证集成到 API Gateway。
28. 第三方库
- 如 Python 的 PyJWT,Node 的 jsonwebtoken,等等,提供了丰富的 JWT 相关功能。
案例:使用 PyJWT 生成令牌
python
import jwt
encoded_jwt = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256')
29. 验证
- 接收 JWT 后,服务端需要进行验证。
案例:PyJWT 验证令牌
python
import jwt
decoded_jwt = jwt.decode(encoded_jwt, 'secret', algorithms=['HS256'])
30. GraphQL 集成
- 在使用 GraphQL 的应用中,也可以用 JWT 进行权限控制。
31. 合理设置过期时间
- 根据用途,合理地设置 Access Token 和 Refresh Token 的过期时间。
32. 使用 HTTPS
- 传输 JWT 应使用 HTTPS 以防止中间人攻击。
33. CSRF 攻击
- JWT 不防御 CSRF。需要其他机制,例如 CSRF Token。
34. 用户权限
- 可以在 JWT 的 Payload 部分添加用户角色或权限。
案例:添加用户角色
json
{
"sub": "1234567890",
"role": "admin"
}
35. 分布式系统
- JWT 在分布式系统中可以节省服务器的存储成本。
36. IP 限制
- 通过绑定令牌到 IP 地址,可以提高安全性。
37. 使用策略
- 针对不同的业务场景,可能需要生成不同策略和权限的 JWT。
38. 逐步废弃旧算法
- 当一个算法被认为不再安全,应逐步转向更安全的算法。
39. 动态密钥
- 可以使用动态生成的密钥进行 JWT 签名,以增加额外的安全层。
40. 测试与验证
- 在生产环境部署之前,应全面测试 JWT 的安全性。
41. 审计与监控
- 建立适当的审计和监控机制,以跟踪 JWT 的使用。
42. 用于 WebSocket
- JWT 也可以用于 WebSocket 连接的身份验证。
43. 内容压缩
- 在生成 JWT 时,可以考虑对 Payload 进行压缩以减小令牌大小。
44. 第三方服务
- 一些第三方服务提供 JWT 的生成和管理。
45. 与 OAuth2 集成
- JWT 可以作为 OAuth2 协议中的一部分来使用。
46. 实时无缝更新
- 使用 Silent Refresh 来无缝更新页面上的 JWT。
47. 批量操作
- 使用 JWT 可以进行批量授权。
48. 开源工具
- 有多种开源工具可用于生成和解析 JWT。
49. 文档和社区
- JWT 有着丰富的文档和活跃的开发者社区。
50. 扩展性
- JWT 是非常灵活的,可以根据需要扩展和定制。
这就是关于 JWT(JSON Web Tokens)的全面专业介绍,希望能为你提供详细和有用的信息。