什么是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
的官方定义内容:
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概念与实例