当前位置: 首页 > article >正文

007 JSON Web Token

文章目录


https://doc.hutool.cn/pages/jwt/#jwt%E4%BB%8B%E7%BB%8D
JWT是一种用于双方之间安全传输信息的简洁的、URL安全的令牌标准。这个标准由互联网工程任务组(IETF)发表,定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。

JWT 通常用于在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以用于验证信息的完整性。

JWT由头部(Header)、载荷(Payload)和签名(Signature)三个部分组成,这些信息都被编码在JWT中,形成一个紧凑的字符串。
头部:描述了JWT的签名算法和其它元数据,如使用的哈希算法等。
载荷:包含了发行方信息、用户信息、过期时间等声明。这些声明可以是标准的,也可以是自定义的。
签名:是对头部和载荷进行数字签名的结果,用于验证JWT的完整性和真实性。签名通常使用头部中指定的签名算法和服务器端的密钥生成。

JWT(JSON Web Token)的自包含性指的是,JWT本身包含了所有验证和识别用户身份所需的信息,而不需要额外查询数据库或调用其他服务。

JWT通常存储在客户端,而服务端不直接存储JWT本身。

  1. JWT的生成与发送:

    • 当用户成功登录后,服务端会验证用户的身份信息。

    • 如果验证通过,服务端会生成一个JWT,这个JWT包含了用户的身份信息、过期时间等信息,并且经过数字签名以确保其完整性。

    • 然后,服务端将这个JWT发送给客户端,通常是通过HTTP响应头中的Authorization字段,格式为Bearer 。

  2. 客户端存储JWT:

    • 客户端收到JWT后,通常会将其存储在本地,以便在后续的请求中使用。

    • 存储方式可以是浏览器的localStorage、sessionStorage,或者是在移动应用中存储在设备的存储系统中。

    • 客户端在发送请求时,会从存储中取出JWT,并将其包含在请求头中发送给服务端。

  3. 服务端验证JWT:

    • 服务端在收到请求后,会从请求头中提取出JWT。

    • 然后,服务端会使用自己的私钥(如果是用RSA算法)或者相同的密钥(如果是用HMAC算法)来验证JWT的数字签名。

    • 如果签名验证通过,并且JWT没有过期,服务端就会认为这个请求是合法的,并根据JWT中的声明来执行相应的操作。

  4. 服务端不存储JWT:

    • 与传统的Session认证方式不同,服务端在JWT认证中不需要存储用户的会话信息。

    • 因为JWT本身已经包含了足够的用户信息和验证信息,服务端只需要验证JWT的有效性即可。

    • 这使得服务端可以更加轻量级和可扩展,因为不需要维护大量的会话状态信息。

需要注意的是,虽然服务端不直接存储JWT,但服务端可能需要存储一些与JWT相关的其他信息,比如用于签发和验证JWT的密钥、JWT的过期策略等。此外,为了安全性考虑,服务端还应该采取适当的措施来保护这些敏感信息不被泄露。

在Java中,存在多种JWT的实现库,如jjwt(Java JWT)、nimbusds-jwt等。
这些不同的JWT实现库在功能上可能相似,但在内部实现、性能、安全性等方面可能存在差异。例如,一些库可能提供了更强大的加密算法、更灵活的签名和验证机制,或者更好的异常处理和错误报告等。因此,在选择JWT实现库时,需要根据具体的应用场景和安全需求进行评估和选择。
同时,即使使用了相同的JWT实现库,不同的开发者在实现JWT的生成、解析和验证过程中也可能采用不同的方法和参数,从而影响JWT的安全性。例如,选择较弱的加密算法、不严格的签名验证规则、不安全的密钥管理等都可能导致JWT的安全性降低。


http://www.kler.cn/a/526936.html

相关文章:

  • pytorch基于FastText实现词嵌入
  • 浅谈AI的发展对IT行业的影响
  • 360嵌入式开发面试题及参考答案
  • C++中常用的十大排序方法之1——冒泡排序
  • python | OpenCV小记(一):cv2.imread(f) 读取图像操作(待更新)
  • Autogen_core: test_code_executor.py
  • Python爬虫:requests模块深入及案例
  • 【Postman 接口测试】接口测试基础知识
  • 查找cuda_home
  • 开源AI智能名片2+1链动模式S2B2C商城小程序:重塑私域流量运营格局
  • 计算机组成原理——数据运算与运算器(二)
  • P1775 石子合并(弱化版)
  • PPT演示设置:插入音频同步切换播放时长计算
  • [实践篇]13.32 QNX下,C++编程未捕获异常导致的CPU异常高占用
  • [原创](Modern C++)现代C++的关键性概念: 正则表达式
  • 2025最新源支付V7全套开源版+Mac云端+五合一云端
  • Spring Boot 热部署实现指南
  • L30.【LeetCode笔记】设计链表
  • 单链表专题(中)
  • Java多用户通信系统
  • 【自然语言处理(NLP)】多头注意力(Multi - Head Attention)原理及代码实现
  • C++中实现全排列方法
  • 10.6 LangChain提示工程终极指南:从基础模板到动态生成的工业级实践
  • JAVA实战开源项目:在线文档管理系统(Vue+SpringBoot) 附源码
  • JavaScript图像处理,腐蚀算法和膨胀算法说明和作用介绍
  • 愿景:做机器视觉行业的颠覆者