什么是JWT?

幂简集成 2024年02月29日

      JSON Web Token(JWT)是一种用于创建访问令牌的开放标准,用于声明一些声明。使用JSON编写的令牌旨在紧凑 – 专注于使用Web浏览器,单点登录(SSO)上下文。虽然不是身份提供商或服务提供商,但JWT用于在身份和服务提供商之间传递身份验证的用户身份。JWT是REST API常用的一种身份认证方式,也是跨域认证的一种解决方案。

JSON Web Token(JWT)的作用和原理是什么?

      JSON Web Token(JWT)的作用是在客户端和服务器之间传递身份验证信息,并支持授权和信息交换。JWT的原理基于数字签名技术,使用三个部分组成:头部、载荷和签名。其中:

  •       头部包含有关令牌类型和签名算法的信息,通常为Base64编码的JSON字符串。
  •       载荷包含有关用户或其他信息的声明,通常也为Base64编码的JSON字符串。
  •       签名用于验证令牌的真实性和完整性,由头部、载荷和一个密钥组成,通常使用HMAC算法或RSA公钥加密算法。

      JWT在客户端登录后,服务端生成一个JWT令牌并返回给客户端,客户端将该令牌存储在本地,之后在与服务端通信时,将该令牌作为身份验证信息发送给服务端。服务端接收到令牌后,使用密钥验证签名,确认令牌的真实性和完整性,然后解码载荷并使用其中的信息完成身份验证和授权操作。

JSON Web Token(JWT)的结构和组成部分有哪些?

      头部(Header)

      包含了令牌类型(即JWT)和所使用的签名算法信息,通常是一个JSON对象,例如:{ “alg”: “HS256”, “typ”: “JWT” } 其中alg表示签名算法,typ表示令牌类型。

      载荷(Payload)

      包含了一些声明(Claim),声明是有关实体的一些陈述。声明包含了一些标准声明和自定义声明,例如:{ “sub”: “1234567890”, “name”: “John Doe”, “iat”: 1516239022 } 其中sub表示主题(Subject),name表示名称,iat表示令牌颁发时间(Issued At)。

      签名(Signature)

      使用密钥对头部和载荷进行签名,以保证数据的完整性和真实性,例如:

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

JWT claims

      放置需要传输的信息,有三类:

  •       保留claims:主要包括iss发行者、exp过期时间、sub主题、aud用户等。
  •       公共claims:定义新创的信息,比如用户信息和其他重要信息。
  •       私有claims:用于发布者和消费者都同意以私有的方式使用的信息。

      以下是claims的官方定义内容:

      key
      name
      说明

      iss
      发送者
      标识颁发 JWT 的发送主体。

      sub
      主题
      标识 JWT 的主题。

      aud
      接收者
      标识 JWT 所针对的接收者。每个在处理 JWT 的主体都必须使用受众声明中的值来标识自己。如果处理的主体在存在此声明时未将自己标识为声明中的值,则必须拒绝 JWT。

      exp
      到期时间
      标识不得接受 JWT 进行处理的过期时间。该值必须是日期类型,而且是1970-01-01 00:00:00Z 之后的日期秒。

      nbf
      jwt的开始处理的时间
      标识 JWT 开始接受处理的时间。该值必须是日期。

      iat
      jwt发出的时间
      标识 JWT 的发出的时间。该值必须是日期。

      jti
      jwt id
      令牌的区分大小写的唯一标识符,即使在不同的颁发者之间也是如此。

{
      "sub": "12344321",
      "name": "Mars酱", // 私有claims
      "iat": 1516239022
      }

JSON Web Token(JWT)的加密和签名算法有哪些?

      HMAC算法

      使用密钥和哈希函数(如SHA256)生成签名,常用的有HS256、HS384和HS512。

      RSA算法

      使用公钥和私钥进行加密和解密,常用的有RS256、RS384和RS512。

      ECDSA算法

      使用椭圆曲线加密算法生成公钥和私钥,常用的有ES256、ES384和ES512。

JSON Web Token(JWT)的优点是什么?

      无状态

      JWT是一种无状态的身份验证机制,不需要在服务端存储会话信息,可以更轻松地实现分布式系统和负载均衡。

      安全性高

      JWT使用数字签名或加密算法保证令牌的真实性和完整性,避免了传统cookie中cookie劫持和CSRF攻击的问题。

      可扩展性好

      JWT的格式是基于JSON的,可以自定义声明,扩展性强。

      跨语言支持

      JWT是一种开放标准,支持多种编程语言和平台,便于不同系统之间的集成和交互。

      前后端分离

      JWT适合于前后端分离的架构,前端通过JWT令牌进行身份验证和授权,服务端只需要验证JWT令牌的真实性即可。

JSON Web Token(JWT)的缺点是什么?

      令牌大小

      JWT中包含了头部、载荷和签名三部分信息,如果使用RSA算法进行签名,令牌会比较大,会增加网络传输的负担。

      存储问题

      由于JWT是无状态的,令牌中包含了用户信息,如果令牌被盗取,攻击者可以获得用户的敏感信息,因此需要对令牌进行严格的存储和管理。

      时效性问题

      JWT的令牌是无法撤销的,一旦令牌被盗取,攻击者可以一直使用该令牌,因此需要设置较短的过期时间,增加令牌的安全性。

      安全性问题

      JWT使用数字签名或加密算法保证令牌的真实性和完整性,但如果密钥被泄露,攻击者可以篡改令牌,因此需要对密钥进行保护和管理。

      不支持多级回话

      JWT不支持多级回话,即无法在令牌中存储多个会话信息,对于一些复杂的应用场景,可能需要使用其他的身份验证和授权机制。

JSON Web Token(JWT)的使用场景和应用有哪些?

      身份验证和授权

      JWT是一种常用的身份验证和授权机制,适用于各种类型的网络应用,例如Web应用移动应用API服务等。

      单点登录

      JWT可以实现单点登录,即用户在一个系统中登录后,可以在多个系统中自动登录,提高用户体验和运营效率。

      信息交换

      JWT可以用于安全地传递信息,例如在OAuth2.0授权流程中,使用JWT作为访问令牌(Access Token)传递给客户端。

      分布式系统

      JWT适合于分布式系统和微服务架构,可以在不同的系统中传递身份验证信息,实现统一的身份验证和授权。

      前后端分离

      JWT适合于前后端分离的架构,前端通过JWT令牌进行身份验证和授权,服务端只需要验证JWT令牌的真实性即可。

JSON Web Token(JWT)的安全性和风险如何评估和管理?

      密钥管理

      JWT使用数字签名或加密算法保证令牌的真实性和完整性,因此密钥的管理非常重要,需要对密钥进行保护、存储和更新,避免密钥泄露和滥用。

      令牌过期时间

      JWT的令牌是无法撤销的,因此需要设置较短的过期时间,增加令牌的安全性,同时需要确保令牌过期后及时刷新或重新获取。

      令牌存储和传输

      JWT令牌中包含了用户信息和敏感数据,因此需要对令牌进行严格的存储和传输,避免令牌泄露和劫持,可以使用HTTPS协议进行加密传输。

      防止重放攻击

      JWT令牌是一种无状态的机制,因此容易受到重放攻击,需要对令牌进行防篡改和防重放措施,例如使用随机数和时间戳进行加密。

      审计和监控

      需要对JWT令牌的使用情况进行审计和监控,及时发现和处理异常情况,例如多次尝试登录、异常IP地址等。

JSON Web Token(JWT)的性能和可扩展性如何保障?

      算法选择

      需要根据具体情况选择合适的加密和签名算法,根据安全性要求和性能要求进行权衡,例如使用HMAC算法可以提高性能,但安全性相对较低;使用RSA算法可以提高安全性,但性能相对较低。

      令牌大小

      JWT令牌中包含了头部、载荷和签名三部分信息,如果使用RSA算法进行签名,令牌会比较大,会增加网络传输的负担,因此需要考虑令牌大小对性能的影响。

      缓存机制

      可以使用缓存机制对JWT令牌进行缓存,避免重复生成和签名,提高性能和可扩展性,可以使用Redis、Memcached等缓存中间件实现。

      分布式架构

      可以采用分布式架构和负载均衡技术,将JWT令牌的生成和验证任务分散到多个节点上,提高性能和可扩展性。

      代码优化

      可以对JWT令牌生成、解析和验证代码进行优化,避免性能瓶颈和安全漏洞,例如使用多线程、异步IO等技术优化代码,使用代码审查工具和安全测试工具检测代码质量和安全性。

JSON Web Token(JWT)的令牌存储和加密如何实现?

      存储在Cookie中

      可以将JWT令牌存储在Cookie中,使用HttpOnly和Secure属性进行保护,避免XSS攻击和数据泄露。

      存储在LocalStorage中

      可以将JWT令牌存储在LocalStorage中,但LocalStorage容易受到XSS攻击和数据泄露,因此需要对令牌进行加密和签名。

      存储在Session中

      可以将JWT令牌存储在Session中,但这种方式需要在服务端进行存储和管理,增加了服务器的负担和复杂度。

      存储在数据库中

      可以将JWT令牌存储在数据库中,增加了令牌的安全性和可控性,但会增加数据库的读写负担和延迟。

参考资料

      原文:JSON Web Token (腾讯云开发者社区)
      JWT官方站点
      初学者JWT使用指导
      JWT概念与实例