JWT
JWT全称是JSON Web Token(JSON Web令牌),JWT是一个开放标准(RFC 7519),它提供了一种在各方之间安全地传输信息的方式。JWT特别适用于在网络中作为令牌(tokens)进行身份验证和信息交换。
JWT的组成部分
JWT由三部分组成,分别用.
(点)分隔:
1.Header(头部):头部包含两部分信息,令牌的类型(即JWT)和所使用的签名算法,例如HMAC SHA256或RSA。
{
"alg": "HS256",
"typ": "JWT"
}
2.Payload(负载):负载是包含声明(claims)的部分。声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型:注册的、公开的和私有的。注册的声明是JWT预定义的声明,如iss
(发行人)、exp
(过期时间)、sub
(主题)等。公开的声明可以包含任何信息,但一般不建议包含敏感信息,因为这部分内容可以被解码并查看。私有的声明是提供者和消费者之间所定义的声明。
{
"sub": "1234567890",
"name": "sam",
"admin": true
}
3.Signature(签名):签名部分是对前两部分(头部和负载)的编码后的数据进行签名,以确保数据在传输过程中没有被篡改。如果使用的是HMAC算法,签名是通过将Base64Url编码后的头部和负载,用一个密钥进行HMAC SHA256运算,最后产生的签名也被Base64Url编码。如果使用的是RSA或ECDSA,签名是通过私钥对头部和负载的编码后的数据进行的。
JWT的工作原理
- 创建:当用户成功登录后,服务器会生成一个JWT,其中包含用户的身份和其他相关信息。这个JWT会被发送回客户端,用于后续的身份验证和授权。
- 传输:客户端在后续的请求中会将JWT包含在HTTP头部(通常是
Authorization
头部,使用Bearer
模式)中发送给服务器。 - 验证:服务器在接收到请求后,会首先从HTTP头部中提取JWT,然后验证JWT的签名。如果签名验证成功,并且JWT没有过期,服务器就会信任JWT中的信息,并允许用户进行后续的操作。
JWT的优点
- 轻量级:JWT是基于JSON格式的,相比于传统的XML格式,它更加轻巧且易于解析。
- 自包含:JWT中包含了用户的一些声明信息,因此无需查询数据库来验证用户身份,有效降低了服务器的负担。
- 无状态性:JWT本身是无状态的,所有的信息都被包含在令牌中,服务器端无需保存任何状态信息,使得系统易于扩展和维护。
- 安全性:JWT中使用签名进行验证,防止数据被篡改,确保了数据的完整性和安全性。
JWT的注意事项
- 不要将敏感信息放在负载中:虽然JWT的负载部分可以包含任何信息,但最好不要包含敏感信息,如密码或密钥。因为这些信息可以被解码并查看。
- 设置合理的过期时间:JWT可以设置过期时间,以防止令牌被滥用。但是,过短的过期时间可能会导致用户体验不佳,而过长的过期时间可能会增加安全风险。
- 使用HTTPS:JWT在传输过程中应该使用HTTPS来确保数据的安全性。否则,JWT可能会被截获并被恶意利用。