所有WIKI > J字母 > 什么是JWT?

什么是JWT?

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的官方定义内容:

keyname说明
iss发送者标识颁发 JWT 的发送主体。
sub主题标识 JWT 的主题。
aud接收者标识 JWT 所针对的接收者。每个在处理 JWT 的主体都必须使用受众声明中的值来标识自己。如果处理的主体在存在此声明时未将自己标识为声明中的值,则必须拒绝 JWT。
exp到期时间标识不得接受 JWT 进行处理的过期时间。该值必须是日期类型,而且是1970-01-01 00:00:00Z 之后的日期秒。
nbfjwt的开始处理的时间标识 JWT 开始接受处理的时间。该值必须是日期。
iatjwt发出的时间标识 JWT 的发出的时间。该值必须是日期。
jtijwt 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概念与实例