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

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

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

1.JWT组成

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

alt

  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

#java#
全部评论
🐮
2
送花
回复 分享
发布于 06-21 15:32 上海

相关推荐

2024年3月12日 1、有没有跟导师做一些工程类项目?2、读研期间做什么?3、研究方向是什么?4、讲一下比较有代表性有亮点的项目(有什么背景、有什么想法、有什么困难、最后是怎么解决的)5、讲一下社区项目是什么?6、社区项目最后是什么进展?7、使用kafka和不使用kafka对实现点赞功能的差异是什么?效果差距在哪里?分别适用什么场景?8、点赞count字段存在哪里?9、我就想知道你这个场景设计了几张表,分别是怎么存的?10、讲一下JWT以及工作原理11、session的方式和JWT有什么核心差异?技术方面上?适用场景?12、cookie和session会有被冒用的风险?那用JWT就不会吗?13、JWT会有什么弱点?短板?cookie可以但是JWT不行?14、JWT具体怎么实现用户鉴权的?15、项目假如没有JWT或者Cookie和Session在访问社区的时候会遇到什么问题?16、JWT是怎么传输的?怎么处理的?17、JWT怎么校验的?18、MySQL的索引?索引的作用?19、二级索引对于MySQL是怎么实现的呢?20、B+为什么可以实现查询加速?21、建了B+树和没建B+树有什么区别呢?有索引和没索引有什么区别?为什么能实现加速?22、OSI网络七层模型?23、TCP和HTTP在哪一层?24、TCP和UDP有什么区别?25、一般什么情况会使用Redis呢?26、Java多线程编程写过吗?这个比较基础常见的。27、算法:三个线程打印ABC十次28、算法:整数反转(********************************************************* )#实习求职记录#
阿里巴巴一面255人在聊 查看28道真题和解析
点赞 评论 收藏
分享
一面面经1. 详细讲一下之前实习的工作经历和个人工作风格2. 讲一下从接受到mentor任务开始到最终完成,我是怎样沟通,推进到最终结果交付 3. 我在得物的实习经历深挖1 我认为有哪些因素会影响入驻率的达成2 我当时的工作有哪些是和能影响入驻率的因素相关的,对品牌方具有吸引力3 想要做到服务好商家需要具备哪些能力,以及我是怎样做的4 举一个过往项目中应用了复盘能力的例子5 平时的商家维护及活动提报这两部分怎样确定优先级分配个人精力6 你觉得在你这个组里有比你做得好的人么?以及和别人的差距7 如多线程处理工作能力,你认为你当前处于什么水平,未来想要达到什么水平,以及怎样达到该水平(可以举例工作或学习方面)也就是心里对于自己想要做的事情或技能的 判断,其次有没有对该技能的判断8 从你的角度谈怎样更好的对平台做贡献呢4. mentor建议:要明白自己最终目标/彼岸在哪?处理复杂多线程的工作任务--通过提升效 率和个人能力要明白未来可以应用于哪些场合?二面面经:1. 先自我介绍2. 详细介绍一下在快手实习的内容,举一些例子3. 对在快手的工作内容进行深挖4. 在得物实习时的主要内容是什么?5. 这2段实习经历中你觉得哪些内容你做得顺一些,哪些不是太顺利6. 你能感受到哪一块更符合你的个人风格7. 你和用户沟通和相处是否会有心理负担?8. 你向我介绍一下你自己会用哪些方式来介绍,怎样让我更认识你一些,说一下自己的特 点?反问
查看11道真题和解析
点赞 评论 收藏
分享
4 20 评论
分享
牛客网
牛客企业服务