Skip to content

后端框架的认证与授权的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)的全面专业介绍,希望能为你提供详细和有用的信息。