JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种简洁的、自包含的方法用于通信双方之间以 JSON 对象的形式安全地传输信息。在实际应用中,JWT 作为一种无状态的认证机制,因其简单易用和灵活性而广受欢迎。
JWT 的组成
一个 JWT token 由三部分组成,以点(.
)分隔,分别是:
- Header(头部):包含使用的签名算法和令牌类型。
- Payload(负载):包含声明,声明是关于实体(通常是用户)和其他数据的声明。
- Signature(签名):用于验证消息在传递过程中有没有被更改,并且,对于使用私钥签名的 token,它还可以验证 JWT 的发送方是否为它所称的发送方。
Header 示例
{
"alg": "HS256",
"typ": "JWT"
}
这部分的 JSON 被 Base64 编码形成 JWT 的第一部分。
Payload 示例
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
这部分也是 JSON 格式,它包含了一些声明(claims),同样被 Base64 编码形成 JWT 的第二部分。
Signature 示例
Signature 部分是由 Header、Payload 和秘钥(secret)通过指定的算法(在 Header 中指定)生成。例如,如果使用 HMAC SHA256 算法,签名生成公式如下:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
签名用于验证消息的完整性和真实性。
项目中为什么使用 JWT
-
无状态认证:JWT 允许客户端和服务端之间进行无状态认证。一旦用户登录,服务端就会生成一个 JWT 并将其发送给客户端。客户端随后需要在每次请求时携带这个 JWT。由于 JWT 包含了所有必要的信息,服务端不需要在会话中存储任何关于用户的数据,这样就减少了服务端的负担。
-
跨域认证:由于 JWT 是自包含的,它可以在不同的域之间传递,这使得跨域认证变得简单。这对于单点登录(SSO)和多服务架构尤其有用。
-
安全性:JWT 可以使用秘密密钥或公私钥对进行签名,这保证了token的完整性和不可否认性。此外,可以使用 HTTPS 来保证 token在传输过程中的安全性。
-
可扩展性:由于 JWT 是无状态的,它可以帮助构建高度可扩展的应用程序。在分布式系统中,不需要担心会话复制或共享的问题,因为 JWT 包含了所有必要的信息。
-
灵活性:JWT 允许开发者自定义声明,这意味着可以将额外的信息存储在 token 中,例如用户的角色、权限或其他相关信息。这使得后端服务可以根据这些信息进行细粒度的权限控制。
-
支持移动应用:由于 JWT 是无状态的,它特别适合移动应用。移动应用可以使用 JWT 进行用户身份验证,而不需要存储会话信息。
-
减少数据库查询:在没有 JWT 的情况下,每次请求可能都需要查询数据库以验证用户的会话。使用 JWT,一旦 token 被验证,服务端就可以直接使用 token 中包含的信息,从而减少了数据库查询。
-
简易的注销机制:虽然 JWT 本身没有提供注销机制,但是可以通过将 JWT 存储在客户端的本地存储中并在需要时删除来实现注销。这样,一旦JWT被删除,用户就不再是认证状态。
-
多种语言支持:JWT 是一种广泛支持的标准,有多种编程语言的库可以用来创建和解析 JWT,这使得在不同语言编写的服务之间共享JWT变得容易。
-
清晰的API分离:在使用 JWT 的情况下,认证服务和资源服务可以分离。认证服务负责生成 JWT,而资源服务负责验证 JWT 并使用其中的声明来提供资源。这种分离有助于保持代码的清晰和组织。
----------------------- end -----------------------
我是武铭,目前在银行做开发,现在聚焦于 Java 开发和面试分享,感兴趣的小伙伴可以关注公众号:武铭聊编程 ,大家一起共同学习和进步。
武铭给大家准备了一些 面试简历 和 Java 面试题,大家感兴趣可以关注公众号获取,回复 100 获取 100 套简历模板,回复 210 获取210 道 Java 面试题,回复 面试手册 获取 最全的 Java 面试手册。