面试题:什么是 JWT ,为什么使用 JWT

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种简洁的、自包含的方法用于通信双方之间以 JSON 对象的形式安全地传输信息。在实际应用中,JWT 作为一种无状态的认证机制,因其简单易用和灵活性而广受欢迎。

JWT 的组成

一个 JWT token 由三部分组成,以点(.)分隔,分别是:

  1. Header(头部):包含使用的签名算法和令牌类型。
  2. Payload(负载):包含声明,声明是关于实体(通常是用户)和其他数据的声明。
  3. 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

  1. 无状态认证:JWT 允许客户端和服务端之间进行无状态认证。一旦用户登录,服务端就会生成一个 JWT 并将其发送给客户端。客户端随后需要在每次请求时携带这个 JWT。由于 JWT 包含了所有必要的信息,服务端不需要在会话中存储任何关于用户的数据,这样就减少了服务端的负担。

  2. 跨域认证:由于 JWT 是自包含的,它可以在不同的域之间传递,这使得跨域认证变得简单。这对于单点登录(SSO)和多服务架构尤其有用。

  3. 安全性:JWT 可以使用秘密密钥或公私钥对进行签名,这保证了token的完整性和不可否认性。此外,可以使用 HTTPS 来保证 token在传输过程中的安全性。

  4. 可扩展性:由于 JWT 是无状态的,它可以帮助构建高度可扩展的应用程序。在分布式系统中,不需要担心会话复制或共享的问题,因为 JWT 包含了所有必要的信息。

  5. 灵活性:JWT 允许开发者自定义声明,这意味着可以将额外的信息存储在 token 中,例如用户的角色、权限或其他相关信息。这使得后端服务可以根据这些信息进行细粒度的权限控制。

  6. 支持移动应用:由于 JWT 是无状态的,它特别适合移动应用。移动应用可以使用 JWT 进行用户身份验证,而不需要存储会话信息。

  7. 减少数据库查询:在没有 JWT 的情况下,每次请求可能都需要查询数据库以验证用户的会话。使用 JWT,一旦 token 被验证,服务端就可以直接使用 token 中包含的信息,从而减少了数据库查询。

  8. 简易的注销机制:虽然 JWT 本身没有提供注销机制,但是可以通过将 JWT 存储在客户端的本地存储中并在需要时删除来实现注销。这样,一旦JWT被删除,用户就不再是认证状态。

  9. 多种语言支持:JWT 是一种广泛支持的标准,有多种编程语言的库可以用来创建和解析 JWT,这使得在不同语言编写的服务之间共享JWT变得容易。

  10. 清晰的API分离:在使用 JWT 的情况下,认证服务和资源服务可以分离。认证服务负责生成 JWT,而资源服务负责验证 JWT 并使用其中的声明来提供资源。这种分离有助于保持代码的清晰和组织。

----------------------- end -----------------------

我是武铭,目前在银行做开发,现在聚焦于 Java 开发和面试分享,感兴趣的小伙伴可以关注公众号:武铭聊编程 ,大家一起共同学习和进步。

武铭给大家准备了一些 面试简历 和 Java 面试题,大家感兴趣可以关注公众号获取,回复 100 获取 100 套简历模板,回复 210 获取210 道 Java 面试题,回复 面试手册 获取 最全的 Java 面试手册。

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值