浅析JWT

ops/2025/2/5 1:34:01/

jwt_0">浅析jwt

基本用法,基本原理什么的,问问ai都知道了,这里只简略带过。主要是在后面记录些自己的总结和思考


JWT 组成

json web token,由三部分组成,用 . 分隔:

Header.Payload.Signature

1. Header(头部)
  • 描述令牌类型和签名算法
  • Base64Url 编码的 JSON
{"alg": "HS256",  // 签名算法(HS256/RSA等)"typ": "JWT"     // 令牌类型
}
2. Payload(负载)
  • 携带实际数据(claims)

  • Base64Url 编码的 JSON

  • 三种声明类型:

    {// 标准声明(建议但不强制)"iss": "auth-server", // 签发者"exp": 1620000000,    // 过期时间"sub": "user123",     // 主题// 公共声明(可自定义)"name": "John Doe",// 私有声明(双方约定)"role": "admin"
    }
    
3. Signature(签名)
  • 防篡改核心保障

  • 计算公式:

    HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret-key
    )
    
jwt__69">4. jwt 实例

以上是以明文形式展示的 jwt 组成,实际上服务器会将编码后的 header,payload 以及签名通过 ‘.’ 连接并发给客户端

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

jwt_79">jwt过期时间

jwt会在payload中设置过期时间,服务端接收到请求是会验证该jwt是否过期,过期则需要用户重新登录。

为什么?

  1. 出于安全性考虑,如果jwt被窃取,攻击者就可以无限期地使用它来访问用户的资源
  2. 控制会话时长,有些服务不能让用户长期保持登录状态
  3. 避免内存泄漏,服务器会存储用户令牌状态,无限期的令牌会导致内存爆了

令牌状态

实际中,服务器可能会为每个令牌存储令牌的状态

为什么?

答:从安全性考虑,当用户执行 “注销” 操作、账户被盗用或出现异常登录行为时,服务器可迅速将对应的令牌标记为无效。这样,即便攻击者获取到该令牌,也无法再利用它访问系统资源,有效降低了安全风险。

这不是与令牌的无状态特性相违背了吗?

答:确实会在一定程度上影响令牌的无状态性,但不能简单说完全失去了无状态性,准确的说是在 安全性和无状态性之间的权衡

分布式系统中还要考虑令牌信息的一致性,这又导致令牌失去了灵活性?

答:同上,是在安全性和灵活性之间的权衡

总结&注意:

jwt 相当于服务器给客户端颁发的一个 “身份证”

  1. 服务端不必存储用户的登录状态,而是在登录的时候给用户生成一个jwt,用户下次访问时带上jwt即可,是个服务器无状态的设计
  2. 这个身份证不可以被篡改,若被篡改,服务器能发现(服务器是唯一拥有密钥的)
  3. 这个身份证可能会泄露信息,因为它只防止篡改,但是header和payload部分能被解码,所以不适合在jwt中携带过多敏感信息
  4. jwt 本身也不适合携带多余的用户状态,因为每次客户端发出的请求都要携带完整的jwt,在jwt中存储过多信息,会造成传输延迟。如果有较多的状态信息,还是结合session机制实现较好。jwt只用于身份验证即可。

个人感悟

cookie和session代表两种会话状态存储机制,cookie存在客户端本地,session存在服务器。

由于cookie的设计存在安全隐患,慢慢的cookie受到了跨域限制

而session会增加服务器的存储负担

jwt则没有这二者的缺点:

  1. jwt是在cookie之后发明的技术,设计本身比cookie更安全,浏览器厂商不对jwt进行跨域限制
  2. jwt通过签名机制,避免了篡改
  3. 通过非对称加密可以实现分布式验证而无须考虑密钥的一致性,从而加强了跨域的灵活性
  4. 登录信息编码存储在jwt本身,实现了服务器的无状态

所以jwt比cookie和session更适合用作登录信息验证和跨域验证

其实jwt和cookie比较像

  1. 都存储在客户端
  2. 信息是非加密的(cookie是完全明文的,jwt的信息是编码的,jwt的签名是加密的)
  3. 都能在请求头中(cookie在set-cookie字段,jwt一般在Authorization字段)。

但是jwt相比于cookie是更新更好的技术,用起来方便,所以jwt被广泛运用于用户登录信息验证&跨域验证

而非要纠结技术细节的话,那么我觉得,原理上,cookie是能实现jwt的功能的,但没必要

ps:希望大家也讨论自己的想法


http://www.ppmy.cn/ops/155725.html

相关文章

PyTorch中的movedim、transpose与permute

在PyTorch中,movedim、transpose 和 permute这三个操作都可以用来重新排列张量(tensor)的维度,它们功能相似却又有所不同。 movedim 🔗 torch.movedim 用途:将张量的一个或多个维度移动到新的位置。参数&…

C++:结构体和类

在之前的博客中已经讲过了C语言中的结构体概念了,重复的内容在这儿就不赘述了。C中的结构体在C语言的基础上还有些补充,在这里说明一下,顺便简单地讲一下类的概念。 一、成员函数 结构体类型声明的关键字是 struct ,在C中结构体…

C#System.Threading.Timer使用实例

本文实例讲解System.Threading.Timer定时器的使用 1、定义 System.Timers.Timer类:定义一个System.Timers.Timer对象,然后绑定Elapsed事件,通过Start()方法来启动计时,通过Stop()方法或者Enable=false停止计时。AutoReset属性设置是否重复计时。Elapsed事件绑定相当于另开…

html的字符实体和颜色表示

在HTML中,颜色可以通过以下几种方式表示,以下是具体的示例: 1. 十六进制颜色代码 十六进制颜色代码以#开头,后面跟随6个字符,每两个字符分别表示红色、绿色和蓝色的强度。例如: • #FF0000:纯红…

R绘图 | pheatmap 聚类并设置间隔

一个pheatmap的小例子&#xff0c;包含设置列注释&#xff0c;列注释颜色&#xff0c;聚类&#xff0c;聚类间隔&#xff0c;保存为pdf等。 加方框失败&#xff0c;可以后续使用Illustrator手工添加 效果图&#xff1a; library(pheatmap) set.seed(2025) mat <- matrix…

Haproxy介绍及学习

一、负载均衡(load balance)&#xff1a; 1.一种服务基于硬件设备实现的高可用反向代理技术&#xff0c;将特定的业务分担给指定的一个或者多个后端特定的服务器&#xff0c;提高了业务的并发处理能力保证业务的高可用并方便对业务后期的水平动态扩展性。 2.使用负载均衡的原因…

【cran Archive R包的安装方式】

cran Archive R包的安装方式 添加链接描述 1.包被cran移除 2.包要求的R语言版本与你电脑上的版本不相符 ad archive包的网址或者是下载到工作目录下&#xff0c;ad等于文件名 install,packages(ad repos NULL)

Clojure语言的文件操作

Clojure语言的文件操作 Clojure是一种现代的函数式编程语言&#xff0c;运行于Java虚拟机&#xff08;JVM&#xff09;之上&#xff0c;使得它可以生成高效的字节码并可以与Java类库无缝集成。在Clojure中&#xff0c;文件操作是一个常见的需求&#xff0c;不论是在数据处理、…