1. 什么是HTTP请求头 (Request Headers)?

当你的浏览器或手机App向服务器发起一个HTTP请求时,这个请求并不仅仅包含你要访问的URL(比如 /logout)和可能的数据(请求体),它还附带了一堆“元数据(Metadata)”,这些元数据就是请求头

请求头是一些键值对(Key-Value pairs),它们向服务器提供了关于本次请求的各种上下文信息,比如:

  • Host: api.example.com (我想访问哪个服务器)

  • User-Agent: Mozilla/5.0 ... (我是用什么浏览器或设备发起的请求)

  • Accept: application/json (我希望你返回给我JSON格式的数据)

  • Content-Type: application/json (如果我发送了数据,那么这些数据的格式是JSON)

  • Authorization: Bearer eyJhbGciOiJIUzI1Ni... (这是身份凭证)

2. 为什么需要 Authorization 请求头?

HTTP协议本身是无状态的(Stateless)。这意味着服务器默认情况下,每一次收到请求,都把它当作一个全新的、陌生的请求来对待。它不会记得你上一次是谁,或者你是否已经登录过。

为了解决这个问题,我们需要一种机制来让客户端在每次请求时都“自报家门”。Authorization 请求头就是目前最主流的实现方式,特别是配合 Token-based Authentication(基于令牌的认证)

Token认证机制具有安全性。

  • 核心凭证只传一次: 用户的账号密码只在登录那一次通过HTTPS安全地传输到服务器。

  • 暴露的是“临时工”: Token是一个临时的、可控的凭证。它本质上是服务器对“我信任这个客户端”的一次授权声明。即使Token在传输过程中被截获,它的危害也是有限的

    • 有时效性: Token通常被设置为在几小时或几天后自动过期。攻击者拿到一个过期的Token是完全没用的。

    • 可被吊销: 服务器可以建立一个“黑名单”机制。一旦发现某个Token泄露,可以立刻将其加入黑名单,使其立即失效。

    • 权限可控: Token的Payload(载荷)部分可以包含用户的角色和权限信息。服务器可以签发一个权限受限的Token(例如,一个只读Token),即使泄露,攻击者也无法执行写操作。

3. 典型的登录认证流程

  1. 登录: 用户提交用户名和密码到一个登录接口(如 /login)。

  2. 获取令牌 (Token): 服务器验证用户名和密码成功后,生成一个加密的、有时效性的字符串,这个字符串就是令牌(Token)。服务器会将这个Token返回给客户端。

  3. 客户端存储令牌: 客户端(浏览器或App)收到Token后,会将其安全地存储起来(比如在浏览器的 localStorage 或 sessionStorage 中)。

  4. 后续请求携带令牌: 从此以后,客户端向服务器发起的每一个需要认证的请求,都必须在 Authorization 请求头中附带上这个Token。通常,Token前面还会加上一个Bearer的前缀,表示“持有者认证”。

  5. 服务器验证令牌: 服务器收到请求后,会先检查 Authorization 请求头。如果存在,它会取出Token,对其进行解密和验证(检查签名是否正确、是否过期等)。验证通过后,服务器就知道了“哦,原来是张三发来的请求”,然后才继续处理业务逻辑。

4. Token的生命周期

  1. “生成”阶段每一次独立的登录(Login)行为,都会触发服务器生成一个全新的、不一样的Token

  2. “使用”阶段: 在某一次登录成功后,直到这个Token过期或用户手动登出之前,客户端在发起每一次业务请求(Request)时,都会重复使用这同一个Token

5.JWT的“三段式”结构 

JWT Token而是由 三个部分 通过 . 连接而成的:

Header.Payload.Signature

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

  • 第一部分:Header (头部) eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

    • 内容: 描述这个JWT元信息的一个JSON对象,经过Base64Url编码而成。

    • 解码后: {"alg": "HS256", "typ": "JWT"}

    • 含义:

      • alg: "HS256" (HMAC using SHA-256),声明了签名部分(Signature)使用的加密算法

      • typ: "JWT",声明了这是一个JWT。

  • 第二部分:Payload (载荷) eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

    • Payload 的设计初衷是用来存放与“用户身份和权限”相关的、相对稳定的信息,这些信息在用户的一次登录会话中是不会改变的。

    • 内容: 包含了我们想传递的实际业务数据的一个JSON对象,也经过Base64Url编码。

    • 解码后: {"sub": "1234567890", "name": "John Doe", "iat": 1516239022}

    • 含义 (这里是一些标准字段):

      • sub: Subject (主题),通常存放用户的唯一ID—— 这就是“判断这个Token是谁的”关键!

      • name: 用户名。

      • iat: Issued At (签发时间),是一个时间戳。

      • exp: Expiration Time (过期时间),是一个时间戳。—— 这就是“检查是否过期”的关键!

      • 注意: 任何人都可以对Header和Payload进行Base64Url解码,看到里面的内容。所以,绝对不能在Payload中存放敏感信息,如密码!

  • 第三部分:Signature (签名) SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

    • 内容: 这是一个加密后的字符串,是JWT安全性的核心。

    • 生成过程: 它是通过以下公式,使用在**服务器端秘密保存的一个密钥(Secret Key)**生成的:
      HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secretKey )

    • 含义: 这个签名就像是这份“声明文件”(Header + Payload)的“数字指纹”或“防伪印章”。

6. 服务器验证Token的全过程 

假设服务器收到一个HTTP请求,请求头里有 Authorization: Bearer [一个JWT字符串]。在若依这类框架中,通常会有一个过滤器(Filter),比如 JwtAuthenticationTokenFilter,它会在请求到达你的Controller之前,自动执行以下验证流程:

第1步:检查请求头,取出Token

这步很简单,就是代码层面的字符串操作。

第2步:解密和验证(核心步骤)

这一步通常会由一个专门的JWT工具类(比如使用 jjwt 库)来完成。validateToken(jwtToken) 方法内部会做以下事情:

a. 拆分Token

  • 将收到的 jwtToken 字符串,按 . 分割成三部分:headerPart, payloadPart, signaturePart。

b. 验证签名(Signature)—— 最关键的安全校验

  • 服务器端有一个只有自己知道的、绝对保密的 secretKey。这个密钥在项目启动时就加载到内存中了。

  • 服务器会完全忽略收到的 signaturePart。

  • 它会用收到的 headerPart 和 payloadPart,以及自己保存在内存中的 secretKey重新计算一次签名
    newSignature = HMACSHA256(headerPart + "." + payloadPart, mySecretKey)

  • 然后,它将 newSignature 与收到的 signaturePart 进行逐位比较

    • 如果两者完全一致: 这证明了这个Token确实是由我(或拥有相同密钥的其他可信服务)签发的,并且 Header 和 Payload 在传输过程中没有被任何人篡改过。因为只有持有 secretKey 才能生成出正确的签名。—— 验证通过!

    • 如果两者不一致: 这说明Token要么是伪造的,要么内容被篡改了。—— 验证失败,立即拒绝请求!

c. 验证载荷(Payload)—— 业务规则校验

  • 在签名验证通过后,服务器才会信任 Payload 里的内容。

  • 它会对 payloadPart 进行Base64Url解码,得到一个JSON对象。

  • 然后,它会检查Payload中的标准声明(Claims)

    • 检查过期时间 (exp): if (currentTime > payload.getExp()) { ... }

      • 获取exp字段的值(一个时间戳)。

      • 与当前服务器时间进行比较。

      • 如果当前时间已经超过了exp时间,说明Token已过期。—— 验证失败,拒绝请求!

    • 还可以检查其他声明,比如nbf (Not Before,生效时间)等。

第3步:判断这个Token是谁的,并建立会话上下文

在签名和有效期都验证通过后,现在服务器可以完全信任这个Token了。

a. 提取用户信息

  • 服务器会从已经解码的 Payload 中,提取出用户的唯一标识,通常是 sub (Subject) 字段。
    String userId = payload.get("sub");

  • 它还可能提取出角色、权限等其他信息。
    List<String> roles = payload.get("roles");

b. 建立安全上下文 (Security Context)

  • 现在服务器知道了:“这个合法请求是用户 userId 发来的,他拥有 roles 这些角色。

  • 框架(如Spring Security)会创建一个认证对象(Authentication),把这些用户信息封装进去。

  • 然后,将这个认证对象存入一个**与当前线程绑定的“安全上下文”**中(SecurityContextHolder)。

c. 放行请求

  • 过滤器的工作到此完成,它会将请求放行,继续传递给后续的过滤器,最终到达Controller方法。当请求最终到达Controller时,不再需要关心Token了。只需要从那个“安全上下文”中获取用户信息即可。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89797.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89797.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/89797.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SVM smote】MAP - Charting Student Math Misunderstandings

针对数据不平衡问题&#xff0c;用调整类别权重的方式来处理数据不平衡问题&#xff0c;同时使用支持向量机&#xff08;SVM&#xff09;模型进行训练。 我们通过使用 SMOTE&#xff08;Synthetic Minority Over-sampling Technique&#xff09;进行过采样&#xff0c;增加少数…

repmgr+pgbouncer实现对业务透明的高可用切换

本方案说明 PostgreSQL repmgr&#xff1a;实现主从自动故障检测与切换&#xff08;Failover&#xff09;。PgBouncer&#xff1a;作为连接池&#xff0c;屏蔽后端数据库变动&#xff0c;提供透明连接。动态配置更新&#xff1a;通过repmgr组件的promote_command阶段触发脚本…

查找服务器上存在线程泄露的进程

以下是一个改进的命令&#xff0c;可以列出所有线程数大于200的进程及其PID和线程数&#xff1a; find /proc -maxdepth 1 -type d -regex /proc/[0-9] -exec sh -c for pid_dir dopid$(basename "$pid_dir")if [ -f "$pid_dir/status" ]; thenthreads$(aw…

Facebook 开源多季节性时间序列数据预测工具:Prophet 饱和预测 Saturating Forecasts

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 Prophet 是一种基于加法模型的时间序列数据预测程序&#xff0c;在该模型中&#xff0c;非线性趋势与年、周、日季节性以及节假日效应相匹配。…

从单线程到云原生:Redis 二十年演进全景与内在机理深剖

——从 1.0 到 7.2&#xff0c;一窥数据结构、网络模型、持久化、复制、高可用与生态协同的底层脉络&#xff08;一&#xff09;序章&#xff1a;为什么是 Redis 1999 年&#xff0c;Salvatore Sanfilippo 在开发一个实时访客分析系统时&#xff0c;发现传统磁盘型数据库无法在…

得了甲亢军队文职体检能过吗

根据军队文职体检现行标准&#xff0c;甲亢患者能否通过体检需分情况判定&#xff0c;核心取决于病情控制状态、治疗结果及稳定时长。结合《军队选拔军官和文职人员体检通用标准》及补充规定&#xff0c;具体分析如下&#xff1a;⚕️ 一、可直接通过体检的情况临床治愈满1年且…

【编程语言】C、C++、C#深度对比:三种语言的演进历程与应用场景

一、语言概述与历史背景 &#xff08;一&#xff09;C语言&#xff1a;系统编程的基石诞生背景 1972年由Dennis Ritchie在贝尔实验室开发为了重写UNIX操作系统而创造从B语言演化而来&#xff0c;增加了数据类型设计目标&#xff1a;简洁、高效、可移植设计哲学 “相信程序员”&…

《计算机网络》实验报告五 DNS协议分析与测量

目 录 1、实验目的 2、实验环境 3、实验内容 3.1 查看和配置本机的DNS系统 3.2 DNS信息测量 3.3 DNS协议分析 4、实验结果与分析 4.1 查看和配置本机的DNS系统 4.2 DNS信息测量 4.3 DNS协议分析 5、实验小结 5.1 问题与解决办法&#xff1a; 5.2 心得体会&#x…

Python工厂方法模式详解:从理论到实战

一、工厂方法模式核心概念 工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;属于经典23种设计模式之一。其核心思想是&#xff1a;定义一个创建对象的接口&#xff0c;但将具体对象的实例化过程延迟到子类中实现。这种模式通过引入…

python爬虫获取PDF

【前提&#xff1a;菜鸟学习的记录过程&#xff0c;如果有不足之处&#xff0c;还请各位大佬大神们指教&#xff08;感谢&#xff09;】 1.方法一&#xff1a;网站找到目标数据【单篇PDF】 https://bidding.sinopec.com/tpfront/xxgg/004005/ 按F12&#xff0c;----检查------…

IFN影视官网入口 - 4K影视在线看网站|网页|打不开|下载

IFN影视是一个专注于影视内容的网站&#xff0c;提供电影、电视剧、综艺等各类影视资源的在线观看服务。该网站以用户需求为导向&#xff0c;致力于为用户提供高清、流畅的观影体验&#xff0c;并不断更新内容以满足不同用户的观看习惯和偏好。IFN影视的特色在于其内容丰富、分…

《计算机网络》实验报告四 TCP协议分析

目 录 1、实验目的 2、实验环境 3、实验内容 3.1 利用wget下载新疆大学主页 3.2 使用wireshark分析TCP报文结构 3.3 使用wireshark分析建立连接的三次握手 3.4 使用wireshark分析释放连接的四次挥手 4、实验结果与分析 4.1 利用wget下载新疆大学主页 4.2 使用wiresh…

知识 IP 的突围:从 “靠感觉” 到 “系统 + AI” 的变现跃迁

越来越多的知识付费从业者陷入 “努力无成果” 的困局&#xff1a;做了内容、上了课程&#xff0c;却没人看、没人买。核心问题不在于能力不足&#xff0c;而在于仍在用 “靠感觉” 的原始方式打造 IP。在流量内卷、节奏加快的当下&#xff0c;“内容情怀” 已撑不起一门生意&a…

4.Java创建对象有几种方式?

1.使用 new 关键字&#xff08;最常用&#xff09;通过调用类的构造函数直接实例化对象Person person new Person(); // 调用无参构造 Person person new Person("Alice", 25); // 调用有参构造2.反射机制&#xff08;动态创建&#xff09;利用Java反射 API 在运行…

【好题】洛谷 P1600 [NOIP 2016 提高组] 天天爱跑步(倍增LCA+桶)

前言没做出来&#xff0c;看了很多篇题解后AC了&#xff0c;感觉大部分题解讲得不清楚。题目思路结果有两种求法模拟跑步过程&#xff0c;统计每个节点能观察到的人数考虑每条路径会对哪些节点作出贡献&#xff08;当前路径的玩家能被观察到&#xff09;尝试第一种求法必须遍历…

valkey之网络管理架构深度解析

一、连接类型实现体系 valkey通过ConnectionType结构体构建了灵活的网络连接抽象&#xff0c;支持多种连接类型的统一管理。每种连接类型都通过填充该结构体的函数指针来实现特定功能&#xff0c;形成了面向接口的设计模式。1.1 socket连接 Socket连接提供了最基础的TCP/IP通信…

【解码文本世界的“隐形分界线”:Windows与Linux回车换行之谜】

在计算机的文本世界里&#xff0c;回车&#xff08;Carriage Return&#xff0c;CR&#xff09;和换行&#xff08;Line Feed&#xff0c;LF&#xff09;是两个看似简单却意义非凡的字符。它们如同文本中的“隐形分界线”&#xff0c;默默地划分着段落与行&#xff0c;影响着文…

【Project】ELK 7.17.16 日志分析系统部署

ELK 日志分析系统集群部署 本文档基于 Rocky Linux 9.4 系统&#xff0c;部署 ELK 7.17.16&#xff08;长期支持版&#xff09;集群 案例准备 1. 节点规划IP主机名部署组件角色说明192.168.100.150kafka01Elasticsearch、Kibana主节点&#xff08;master&#xff09; 可视化192…

分布式定时任务系列13:死循环是任务触发的银弹?

传送门 分布式定时任务系列1&#xff1a;XXL-job安装 分布式定时任务系列2&#xff1a;XXL-job使用 分布式定时任务系列3&#xff1a;任务执行引擎设计 分布式定时任务系列4&#xff1a;任务执行引擎设计续 分布式定时任务系列5&#xff1a;XXL-job中blockingQueue的应用 …

Flutter基础(前端教程①③-单例)

现实类比&#xff1a;公司打印机假设你们公司有一台共享打印机&#xff1a;非单例&#xff08;重复创建&#xff09;&#xff1a;每个员工都自己买一台打印机放在工位上结果&#xff1a;浪费钱&#xff0c;占空间&#xff0c;难维护单例&#xff08;唯一实例&#xff09;&#…