闲鱼面试:说说JWT工作原理?

jwt · 浏览次数 : 0

小编点评

JWT(JSON Web Token)是一种用于网络安全的开放标准规范,用于在网络上安全地传输信息,通常用于身份验证。JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。生成 JWT 时,服务器会根据用户信息和秘钥生成一个 Token,并将其发送给客户端。客户端在每次请求时将 Token 放在 Authorization 头中或作为参数传递给服务器端。服务器端接收到 Token 后,会验证其完整性和有效性,然后根据需要处理请求。 JWT 的优势包括: 1. 无需服务器存储状态:JWT 包含了完整的认证和授权信息,无需服务器存储会话状态信息。 2. 跨域支持:JWT 可以轻松地在多个域之间进行传递和使用,实现跨域授权。 3. 适应微服务架构:JWT 可以满足无状态和横向扩展的需求。 4. 自包含:JWT 包含了认证和授权信息,以及其他自定义的声明,减少了对外部资源(如服务器)的依赖。 5. 扩展性:JWT 可以被扩展和定制,灵活性更高。 关于 JWT 如何实现自动续期,这通常不是一个自动过程,而是需要通过其他机制来管理 Token 的有效期。一种常见的做法是在 Token 过期前通过刷新令牌(Refresh Token)来自动延长其有效期。当客户端需要继续访问受保护的服务时,它会向服务器发送刷新令牌,服务器验证其有效性后,会延长 Token 的有效期并返回新的 Token 给客户端。这样,客户端就可以在不向服务器发送新密码的情况下,继续访问受保护的服务。

正文

JWT(JSON Web Token)一种开放的标准规范(RFC 7519),用于在网络上安全的传输信息,通常被用于身份验证。

简单来说,你可以把 JWT 想象成一张小巧的、自包含的电子通行证。这张通行证里面包含了用户的身份信息,就像你在某个俱乐部的会员卡,上面有你的名字、会员等级等信息,拿着这张卡,你就能证明你是谁,享受相应的服务。

1.JWT组成

JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),如下图所示:
image.png

  1. 头部(Header):包含了关于生成该 JWT 的信息以及所使用的算法类型。
  2. 载荷(Payload):包含了要传递的数据,例如身份信息和其他附属数据。JWT 官方规定了 7 个字段,可供使用:
    1. iss (Issuer):签发者。
    2. sub (Subject):主题。
    3. aud (Audience):接收者。
    4. exp (Expiration time):过期时间。
    5. nbf (Not Before):生效时间。
    6. iat (Issued At):签发时间。
    7. jti (JWT ID):编号。
  3. 签名(Signature):使用密钥对头部和载荷进行签名,以验证其完整性。

JWT 官网:https://jwt.io/

2.JWT工作原理

JWT 工作原理包含三部分:

  1. 生成 JWT
  2. 传输 JWT
  3. 验证 JWT

下面分别来看。

1.生成JWT

在用户登录时,当服务器端验证了用户名和密码的正确性后,会根据用户的信息,如用户 ID 和用户名称,加上服务器端存储的 JWT 秘钥一起来生成一个 JWT 字符串,也就是我们所说的 Token,这个 Token 是 Encoded 编码过的,类似于:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Decoded 解码后会得到三部分内容:头部(Header)+载荷(Payload)+签名(Signature)。

  1. 头部(Header):包含了关于生成该 JWT 的信息以及所使用的算法类型。
  2. 载荷(Payload):包含了要传递的数据,例如身份信息和其他附属数据。
  3. 签名(Signature):使用密钥对头部和载荷进行签名,以验证其完整性。

2.传输JWT

JWT 通常存储在客户端的 Cookie、LocalStorage、SessionStorage 等位置,客户端在每次请求时把 JWT 放在 Authorization 头中或作为参数传递给服务器端。

3.验证JWT

  1. 服务器端接收到 JWT 的 Token 后,会先将 Token Decoded 解码,之后会得到头部(Header)+载荷(Payload)+签名(Signature)。
  2. 然后服务器端会使用它本地存储的秘钥,以及头部(Header)中的加密算法和载荷(Payload)中的信息进行重新加密,得到一个新的签名。
  3. 最后会判断 Token 的真伪,用上一步新生成的签名和 Decoded 解码得到的签名(Signature)进行判断,如果二者一致,则说明当前的 Token 有效性的、完整的,可以执行后续的操作了,否则则返回 Token 错误。当然在这一步判断时,我们通常也要看载荷(Payload)中的过期时间是否有效,如果无效,则需要提示用户重新登录。

3.JWT优势

JWT 相较于传统的基于会话(Session)的认证机制,具有以下优势:

  1. 无需服务器存储状态:传统的基于会话的认证机制需要服务器在会话中存储用户的状态信息,包括用户的登录状态、权限等。而使用 JWT,服务器无需存储任何会话状态信息,所有的认证和授权信息都包含在 JWT 中,使得系统可以更容易地进行水平扩展。
  2. 跨域支持:由于 JWT 包含了完整的认证和授权信息,因此可以轻松地在多个域之间进行传递和使用,实现跨域授权。
  3. 适应微服务架构:在微服务架构中,很多服务是独立部署并且可以横向扩展的,这就需要保证认证和授权的无状态性。使用 JWT 可以满足这种需求,每次请求携带 JWT 即可实现认证和授权。
  4. 自包含:JWT 包含了认证和授权信息,以及其他自定义的声明,这些信息都被编码在 JWT 中,在服务端解码后使用。JWT 的自包含性减少了对服务端资源的依赖,并提供了统一的安全机制。
  5. 扩展性:JWT 可以被扩展和定制,可以按照需求添加自定义的声明和数据,灵活性更高。

使用 JWT 相较于传统的基于会话的认证机制,可以减少服务器存储开销和管理复杂性,实现跨域支持和水平扩展,并且更适应无状态和微服务架构。

课后思考

JWT如何实现自动续期?

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

与闲鱼面试:说说JWT工作原理?相似的内容:

闲鱼面试:说说JWT工作原理?

JWT(JSON Web Token)一种开放的标准规范(RFC 7519),用于在网络上安全的传输信息,通常被用于身份验证。 简单来说,你可以把 JWT 想象成一张小巧的、自包含的电子通行证。这张通行证里面包含了用户的身份信息,就像你在某个俱乐部的会员卡,上面有你的名字、会员等级等信息,拿着这张卡

[转帖]线上问题零发生,闲鱼稳定性问题治理与监控优化

http://blog.itpub.net/28285180/viewspace-2940749/ 一、引言 闲鱼作为C2C电商交易平台,消息系统是导购链路上关键的一环。用户依赖聊天建立买家与卖家的信任,进一步获取商品信息。闲鱼消息的稳定性直接影响到闲鱼用户体验,成交效率。为强化闲鱼消息系统的稳定性

[转帖]兆芯官方的CPU测试成绩,我复现不了

https://baijiahao.baidu.com/s?id=1734998483605483848 下图是兆芯网官上的公开测试成绩,测试对象是3.0GHz的KX-U6880A。 有几个问题: 市面上从来没有见到过3.0GHz的KX-U6880A,无论京东、淘宝还是闲鱼,都只能找到2.7GHz的

在Biwen.QuickApi中整合一个极简的发布订阅(事件总线)

闲来无聊在我的Biwen.QuickApi中实现一下极简的事件总线,其实代码还是蛮简单的,对于初学者可能有些帮助 就贴出来,有什么不足的地方也欢迎板砖交流~ 首先定义一个事件约定的空接口 public interface IEvent{} 然后定义事件订阅者接口 public interface I

巧如范金,精比琢玉,一分钟高效打造精美详实的Go语言技术简历(Golang1.18)

研发少闲月,九月人倍忙。又到了一年一度的“金九银十”秋招季,又到了写简历的时节,如果你还在用传统的Word文档寻找模板,然后默默耕耘,显然就有些落后于时代了,本次我们尝试使用云平台flowcv高效打造一份巧如范金、精比琢玉的高品质Golang技术简历。 首先来到云平台:flowcv.com 点击 t