Advertisement

什么是 JWT?

阅读量:
1. 什么是 JWT?

JSON Web Token(JWT)作为一种遵循JSON标准(RFC 7519)的安全协议,在通信双方之间实现了可靠的信息传递。该协议通过数字签名技术进行数据校验与身份验证机制设计,在通信双方之间实现了可靠的信息传递。


2. JWT 的结构

JWT 由三部分组成,使用 . 分隔:

复制代码
    header.payload.signature
(1)Header(头部)

头部包含两部分信息:

  • 类型:声明使用的是 JWT
  • 算法:说明签名的算法,比如 HMAC SHA256RSA

示例:

复制代码
 {

    
   "alg": "HS256",
    
   "typ": "JWT"
    
 }

Base64 编码后:

复制代码
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
(2)Payload(载荷)

Payload 是实际传递的数据,其中存放了一些声明信息,包括:

  • 注册声明:例如 iss 表示签发者的信息来源,“exp” 则用于指定过期时间的设置,“sub” 则代表主题分类字段,“aud” 则标识受众群体特征。
    • 公开声明:该系统允许开发者自定义任意键值对配置项,并且必须注意不要泄露敏感信息。
    • 私有声明:根据双方协议使用的数据进行处理和存储。

示例:

复制代码
 {

    
   "sub": "1234567890",
    
   "name": "John Doe",
    
   "admin": true
    
 }

Base64 编码后:

复制代码
    eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
(3)Signature(签名)

签名部分用于验证消息的真实性,防止数据被篡改。签名的生成公式如下:

复制代码
 HMACSHA256(

    
   base64UrlEncode(header) + "." +
    
   base64UrlEncode(payload),
    
   secret
    
 )

示例:

复制代码
    SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

最终完整的 JWT:

复制代码
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

3. JWT 的工作原理
流程:
  1. 用户登录 :用户通过用户名和密码登录。
  2. 服务器生成 JWT :服务器验证用户身份后,生成 JWT,通常包含用户信息和权限。
  3. 客户端存储 JWT :JWT 通常存储在浏览器的 localStoragesessionStorage 中。
  4. 客户端每次请求携带 JWT :客户端将 JWT 放在请求头中(通常是 Authorization 字段),如:
复制代码
    Authorization: Bearer <token>
  1. 服务器验证 JWT :服务器通过签名密钥对 JWT 进行验证,并进而判断是否应允此请求。

4. JWT 的特点
优点:
  • 零状态 :服务器无需保存会话信息,并完全依赖客户端传递的 JWT。
    • 轻量级 :结构简单且传输效率高。
    • 自洽性 :JWT 包含了验证用户身份所需的所有信息。
    • 广泛支持 :几乎涵盖了所有编程语言都能解析和生成 JWT。
缺点:
  • 无法撤销 :当生成一个 JWT 时(即一旦被创建),即使用户退出登录操作,在此之前的 JWT 仍然保有活性(直至过期)。
  • 大小问题 :每个 JWT 包含用户的详细信息,在数据传输过程中可能会导致较大的带宽消耗。
  • 安全性能高度依赖 :如果密钥发生泄露,在整个系统中所生成的所有 JWT 都可能面临被恶意篡改的风险。

5. JWT 的使用场景
  • 身份认证:用户登录后,服务端生成 JWT 格式标识符,并将该标识符发送给客户端用于访问受限资源。
    • 信息交换:不同服务之间通过安全机制可靠传输信息。
    • 单点登录(SSO):JWT 简便地实现了多个系统间的单点登录。

6. JWT 的最佳实践
(1)安全性:

通过https协议保障传输过程中的数据加密

(2)避免敏感数据暴露:
  • 不要在 JWT 的 payload 中存储敏感信息(如密码、银行卡号)。
(3)设置合理的过期时间:
  • 使用 exp 字段设置 JWT 的有效期,并结合刷新机制。
(4)防止重复签发:
  • 在 JWT 中添加 jti(JWT ID)字段,标识唯一性。

7. 常见问题

JWT 的安全性如何? * 签名机制确保了数据的一致性与不可篡改性;加密密钥仅掌握在授权的发件人与接收者之间

JWT 是否能存存在 Web cookie 中? * 答案是肯定的。如果采用 HttpOnly 属性,则会将 JWT 存储为一个 Web cookie 从而实现提高安全防护能力防止 XSS 攻击。

JWT 的不可篡改性源自何方? * 因为其核心机制将 header 和 payload 索引在其签名部分。


8. 总结

JWT 是一种简洁高效的身份验证方案,在无需状态的分布式系统中表现出色。然而它也存在一些不足,并非万能钥匙。经过科学的设计理念和严格的安全测试,JWT能够为现代Web应用提供高效的身份验证与数据交换方案。

JWT 是一种简洁高效的身份验证方案,在无需状态的分布式系统中表现出色。然而它也存在一些不足,并非万能钥匙。经过科学的设计理念和严格的安全测试,JWT能够为现代Web应用提供高效的身份验证与数据交换方案。

全部评论 (0)

还没有任何评论哟~