Lazy loaded image
技术分享
JSON Web Token (JWT) 
字数 1547阅读时长 4 分钟
2025-6-18
2025-6-20
type
status
date
slug
summary
tags
category
icon
password

一、什么是 JWT

JWT 是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,使用 JSON 对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

二、JWT 诞生的背景

传统的基于 Session 的身份认证机制存在扩展性问题,在分布式系统或集群环境下,Session 数据通常存储在单台服务器内存中,当用户请求被负载均衡到不同服务器时,会出现 Session 不一致的问题。为解决上述问题,JWT 应运而生,它实现了无状态认证,将用户认证信息直接包含在 Token 中,而不是存储在服务器端。
 

三、JWT 的核心结构

JWT 由三部分组成,使用点号 (.) 连接:
Header.Payload.Signature
 
  • Header(头部):通常由两部分组成,令牌的类型(固定为 “JWT”)和使用的签名算法(如 HS256、RS256 等)。头部经过 Base64Url 编码后形成 JWT 的第一部分。
  • Payload(负载):包含声明(claims),即关于实体(通常是用户)和其他元数据的声明。包括标准中注册的声明(如 iss 签发者、sub 所面向的用户、exp 过期时间等)、公共声明和私有声明。负载也需要经过 Base64Url 编码,成为 JWT 的第二部分。需要注意的是,由于 Base64 编码可被解码,不要在负载中存储敏感信息。
  • Signature(签名):是对前两部分的签名,用于防止数据篡改。服务器使用只有其知道的密钥,按照 Header 里面指定的签名算法,对 Base64 编码后的 Header 和 Payload 进行签名,生成 JWT 的第三部分。
 

四、JWT 的工作原理

 
  • 用户登录时,客户端提交用户名和密码至认证服务。
  • 服务器验证凭据后,生成包含用户信息的 JWT 并签名,返回给客户端。
  • 客户端将 JWT 存储在本地(如 Cookie、LocalStorage),并在后续请求的 HTTP 头(如 “Authorization: Bearer <token>”)中携带。
  • 服务器解析 JWT,验证签名有效性、过期时间及权限,若合法则返回资源,否则拒绝请求。
 

五、JWT的使用

下面是一个使用 Python 和 Flask 框架实现的 JWT 认证示例,包含用户注册、登录和受保护路由的功能。
安装依赖:
pip install flask flask-jwt-extended werkzeug
测试 API:
 
使用 JWT Decoder 网站反解一下:
notion image
 

六、小结

 
JWT 的应用场景
  • 单点登录(SSO):用户一次登录后访问多个关联系统,JWT 可以在不同系统之间传递用户身份信息,实现单点登录。
  • API 认证:在微服务架构中,不同微服务之间通过 JWT 传递身份信息,减少频繁鉴权开销,确保只有合法用户能够访问相应的 API。
  • 移动端认证:适用于 App 与后端通信,无 Cookie 依赖,方便在移动设备上进行身份认证和授权。
JWT 的优势与局限性
  • 优势:无状态认证,无需服务器存储会话信息,适合分布式系统和高并发场景;跨域支持,可在不同服务间传递,适用于单点登录和微服务架构;安全性高,签名机制防止数据篡改,支持非对称加密增强安全性;扩展性好,JSON 格式灵活,可自定义负载内容。
  • 局限性:令牌不可撤销,在 JWT 有效期内无法强制失效,需依赖短有效期或黑名单机制;负载数据暴露,Base64 编码可被解码,需避免存储敏感信息;签名密钥管理要求高,密钥泄露会导致安全风险,需严格保护。
 
JSON Web Token 以其紧凑、安全、自包含的特点,在现代 Web 应用和分布式系统中发挥着重要作用,为身份认证和信息传输提供了一种高效可靠的解决方案。但在使用过程中,开发人员需要充分了解其原理和特性,遵循安全最佳实践,以确保应用的安全性和稳定性。
上一篇
Python自动化构建雷电模拟器
下一篇
JA3指纹

评论
Loading...