[JAVAEE]HTTP协议(2.0)

 

响应报文格式

响应报文格式由首行,响应头(header),空行,正文(body) 组成

响应报文首行包括

1.版本号  如HTTP/1.1  

2.状态码(如200)  描述了请求的结果  

3.状态码描述(如OK)   

首行——状态码

这里主要介绍一下响应报文里面的 状态码 和状态码描述,它们描述了这次HTTP请求是否成功以及失败的原因

信息类(1xx)

  这里的状态码大体意思就是表示请求已被接收,但需要客户端继续发送请求,很少用到这里的状态码。

成功类(2xx)

 这里的状态码表示请求已成功处理,200 ok 是我们最常见的一个状态码,表示访问成功.

重定向类(3xx)

   3xx 表示 重定向。重定向指的是请求中访问的是 A 这样的地址,响应返回了一个重定向报文,告诉你应该要访问 B 地址

很多时候,页面跳转,就可以通过重定向来实现,还有的时候,某个网站服务器迁移了. IP/域名变了,就可以给旧的地址挂一个重定向响应,访问旧地址的用户就自动跳转到新的地址

这里有两个常见的状态码

301 Moved Permanently(永久重定向)

  • 含义:请求的资源已永久移动到新的位置。

 302 Found(临时重定向)

  • 含义:请求的资源临时移动到新的位置。

客户端错误类(4xx)

• 表示客户端的请求有误,服务器无法处理。

• 常见状态码:

• 400 Bad Request:请求格式错误。

• 401 Unauthorized:请求需要用户认证。

• 403 Forbidden:服务器拒绝请求(权限不足)。

• 404 Not Found:请求的资源不存在。

• 405 Method Not Allowed:请求方法不被允许(如 GET 请求不允许使用 POST)。

  服务器错误类(5xx)

表示服务器在处理请求时发生了错误。

常见状态码:

500 Internal Server Error:服务器内部错误。

501 Not Implemented:服务器不支持请求的方法。(get或者post)

503 Service Unavailable:服务器暂时不可用(如过载或维护)。

 响应头

响应头 (header)跟请求头结构一样,键值对内容跟请求头差别没有很大,以下是响应头键值对的主要内容:

唯一要说的点就是content-typent,由于这是响应报文,响应报文里绝对会有body内容,body里的内容可能比较长, 会有多种格式,如HTML, CSS, JS, JSON, XML, 图片, 字体, 视频, 音频等,比请求报文里的body种类多好多。

回顾一下

请求报文中body内部的数据类型,有以下三种数据类型

1.json,具体类型为 application/json

2.form表单的格式,具体类型为application/x-www-form-urlencoded:form

3.form-data 的格式,multipart/form-data: form 

除此以外,空行依旧是响应头的结束标志,body我们响应头该提的都提了,这里也不多说了

如何构造HTTP请求 

在讲完HTTP协议的报文结构后,我们接下来就要去了解下面两个问题

如何让客户端构造一个 HTTP 请求?

如何让服务器处理一个 HTTP 请求 ?

处理请求涉及到Servlet/Spring ,它非常重要,要讲清楚如何处理要花非常多的时间,所以这里我们就先只讲如何构造一个HTTP请求。

首先我们能直接在浏览器 地址栏 输入 url, 此时构造了一个 GET 请求, 又或者在htm| 中, 一些特殊的 htm| 标签, 可能会构造 GET 请求,比如像 img, a, link, script。
如果通过代码的话,我们能通过form或者是ajax的方式去构造,这里都是前端代码,就不说了
除此以外还有一种代码的方式,通过Java scoket构造HTTP请求,所谓的 "发送 HTTP 请求", 本质上就是按照 HTTP 的格式往 TCP Socket 中写入一个字符串. 所谓的 "接受 HTTP 响应", 本质上就是从 TCP Socket 中读取一个字符串, 再按照 HTTP 的格式来解析. 我们基于 Socket 的知识, 完全可以构造出一个简单的 HTTP 客户端程序, 用来发送各种类型的 HTTP 请求。

除了这些以外,我们还能通过第三方软件去快捷生成HTTP请求,这是最方便的,这里我们推荐用postman软件

HTTPS协议 

当前网络上,主要都是 HTTPS 了,很少能见到 HTTP
实际上 HTTPS 也是基于 HTTP,前面讲过的 HTTP 的各个方面的内容, 对于 HTTPS 同样适用,报文结构都是一样的。只不过 HTTPS 在 HTTP 的基础之上, 引入了"加密"机制.
引入 HTTPS 防止你的数据被黑客篡改(尤其是反针对  运营商劫持) ---运营商可能修改广告访问次数来和企业合作获利

加密机制是什么?
明文:要传输的原始数据

密文:经过加密之后得到的数据
密钥:进行加密和解密过程的重要道具
加密就是把明文(要传输的信息)进行一系列变换,生成密文.

解密就是把密文再进行一系列变换,还原成明文.

在这个加密和解密的过程中,往往需要一些数据才能进行转换,这样的数据称为密钥

既然要保证数据安全, 就需要进行 “加密”.

网络传输中不再直接传输明文了, 而是加密之后的 “密文”.

加密的方式有很多, 但是整体可以分成两大类: 对称加密 和 非对称加密

对称加密其实就是通过同一个 “密钥” , 把明文加密成密文, 并且也能把密文解密成明文。

 非对称加密要用到两个密钥, 一个叫做 “公钥”, 一个叫做 “私钥”. (私钥是自己必须严格保密的钥匙,公钥是公开发布给大家的钥匙)

  • 通过公钥对明文加密, 变成密文
  • 通过私钥对密文解密, 变成明文

也可以反着用

  • 通过私钥对明文加密, 变成密文
  • 通过公钥对密文解密, 变成明文

公钥和私钥是配对的. 它最大的缺点就是运算速度非常慢,比对称加密要慢很多.但安全性高

HTTPS保证自己的安全性过程 

在讲完上述加密概念后,我们就能去讲述HTTP如何保证自己的安全性了

但事情没这么简单. 要想进行对称加密,就需要客户端和服务器都具有同一个对称密钥,服务器同一时刻其实是给很多客户端提供服务的. 这么多客户端, 每个人用的秘钥都必须是不同的(如果是相同那密钥就太容易扩散了, 黑客就也能拿到了). 因此服务器就需要维护每个客户端和每个密钥之间的关联关系,这是个极其累的事,如果还要服务器再生成密钥的话就太负载了。
这个时候比较理想的做法, 让每个客户端生成一个密钥,在客户端和服务器建立连接的时候, 传输给服务器让服务器也有。    

但是如果直接把密钥明文传输, 那么黑客也就能获得密钥了,此时后续的加密操作就形同虚设了。

因此密钥的传输也必须加密传输!

但是要想对密钥进行对称加密, 就仍然需要先协商确定一个 “密钥的密钥”. 这就无限套娃了. 此时密钥的传输再用对称加密就行不通了,我们就选择用非对称加密进行密钥的传输。

引入非对称加密

服务器会自己生成一对公钥和私钥,并且把自己生成的公钥传输给客户端,私钥还是自己来持有。
接下来客户端会对自己的对称密钥(每个客户端生成自己的,客户端之间不知道别人的对称密钥是啥),比如上图的这个客户端生成的对称密钥时六个8,此时这个六个8不会明文传输,通过刚才从服务器拿到的公钥,来针对对称密钥进行加密,再把对称密钥的密文传输给服务器,这样服务器就知道了对称密钥是什么。
此时黑客拿到对称密钥的数据之后,是无法解密的,使用公钥加密,就得使用对应的私钥来进行解密,黑客能轻松拿到公钥,而拿不到私钥,这样是解密不了数据的。
我们要注意一个服务器只会生成一对公钥和私钥(意味着所有和它连接的客户端都是用同一套公钥进行加密)

既然已经引入了非对称加密,为啥还需要引入对称加密呢?直接使用非对称加密,来完成所有业务数据的加密传输即可
这是因为进行非对称加密/解密,运算成本是比较高的.运算速度也是比较低的,对称加密运算成本低, 速度快.
使用非对称加密kkkk,只是用来进行这种关键环节(传输密钥)(一次性的工作,体积也不大),成本就比较可控后续要传输大量的业务数据,都使用效率更高的对称加密,比较友好的做法.
如果业务数据都使用非对称加密,整体的传输效率就会大打折扣了.

注意:上述流程看起来很美好,但是黑客依然能获取到原始数据,通过中间人攻击去获取。

中间人攻击问题

下面我们说下中间人攻击的流程:
客户端访问服务器(黑客冒充的),请求公钥,服务器就会生成一对公钥和私钥(提前生成好的),在此我们称为pub,pri,然后把公钥(pub)返回给黑客
这时就到了关键环节:黑客可以自己生成出一对公钥(pub2)和私钥(pri2),黑客就会把自己的公钥(pub2)返回给客户端,客户端就无法区分出当前的pub2是不是服务器最开始返回的公钥,是不是被中间人掉包了的公钥,客户端就只能选择相信,客户端就会拿着pub2针对对称密钥进行加密,并且发送给服务器(黑客),此时黑客就会拿着pir2针对刚才收到的pub2加密的数据进行解密,从而拿到这里的对称密钥,黑客继续把拿到的对称密钥,使用服务器的公钥pub再次加密发送给服务器,服务器就会使用自己的私钥进行解密,此处肯定会解密成功,拿到对称密钥,接下里意味着客户端和服务器就会继续使用这个对称密钥来完成后续的业务数据加密,此时对称密钥已经泄露出去了
上述过程,黑客面对服务器的时候,扮演客户端的角色,面对客户端的时候,扮演服务器的角色,那么客户端和服务器都不知道黑客的存在,这样就很神秘的泄露出去了。

引入证书 

上面讲到,客户端无法区分拿到的公钥是否为服务器返回的公钥,还是说其他人伪造的公钥。那么客户端如果能做出区分,当前的公钥是否为服务器返回的公钥,中间人攻击就不攻自破了。

为了解决该问题,我们引入第三方的可以被大家都信任的"公证机构",公证机构说这个公钥是正确的,不是被伪造的,我们就是可以信任的。所有的服务器在上线自己的网站的时候,都要先去第三方公证机构申请一个证书(此处的证书并不是纸质的,而是数字证书,可理解为一串字符串数据),这个证书包含:发证机构,有效期,服务器的公钥,证书持有者,持有者网站,主域名,数字签名......

这个数字签名可理解为一个加密之后的校验和,校验和是基于CRC/MD5等方式,把证书的其他内容的每个字节都带入计算一遍,最终得到的一串字符串,然后针对校验和进行非对称加密的方式进行加密,那么是谁的私钥进行加密的呢?

公证机构自己会生成一对公钥和私钥(和服务器的公钥私钥不一样),公证机构会自己持有私钥,而每个电脑的操作系统都会内置公证机构的公钥,公证机构会拿自己的私钥针对证书数据的校验和进行加密,得到数字签名。

在申请了证书后,我们就不再发送公钥了,而是直接发送证书(证书里面包含公钥)

客户端拿到了证书,也就拿到了证书中的公钥,客户端就需要验证这个公钥是否是服务器最初的公钥(是否是被黑客篡改了)
这个过程就称为证书的校验,如何进行校验?

此时,客户端拿到了数字签名,就可以通过操作系统内置的公证机构的公钥进行解密了,得到最初的校验和,客户端再重新计算一遍这里的校验和,和解密出来的校验和进行对比,如果校验和一致,就可以认为证书没有被篡改过,公钥就是可信的

在上述机制下,黑客就无法对证书内容进行篡改了,即使篡改,也很容易被发现.
当黑客收到证书之后,如果直接修改里面的公钥,替换成自己的,客户端在进行证书校验的时候,就会发现校验和不一致了,客户端就可以认为是篡改过了.(客户端这边往往就会弹出一些对话框来警告用户,存在安全风险)
那么黑客在替换公钥时,同时替换掉数字签名是否可以呢?

在算出自己的校验和时,针对校验和加密,需要使用公证机构的私钥才能进行.黑客没有这个私钥.如果黑客拿自己的私钥加密,客户端也就无法使用公证机构的公钥解密了公证机构的公钥是客户端系统自带的,黑客也无法替换(如果不对校验和进行加密,黑客还真可能得逞)

结合上述过程,证书就是可信的,通过了校验,就说明公钥就是服务器原始的公钥了,完美解决了中间人攻击问题

所以https是通过以下三点相结合保证 https 的安全性:
1.对称加密,加密业务数据

2.非对称加密,加密对称密钥
3.使用证书,校验服务器的公钥

这是一道经典的面试题,我们要深刻的理解它。

 

 

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

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

相关文章

Spring Boot 之MCP Server开发全介绍

Spring AI 的 MCP(模型上下文协议,Model Context Protocol)服务器启动器为在 Spring Boot 应用程序中设置 MCP 服务器提供了自动配置功能。它使得 MCP 服务器功能能够与 Spring Boot 的自动配置系统实现无缝集成。 MCP 服务器启动器具备以下特性: MCP 服务器组件的自动配置…

YOLOv8 对象检测任务的标注、训练和部署过程

YOLOv8 对象检测任务的标注、训练和部署过程 在计算机视觉领域,对象检测是一项基础且重要的任务,YOLOv8 作为当前先进的实时对象检测模型,以其高效性和准确性受到广泛关注。从数据准备到最终模型部署,整个流程包含多个关键环节&a…

电池热管理CFD解决方案,为新能源汽车筑安全防线

在全球能源结构加速转型的大背景下,新能源汽车产业异军突起,成为可持续发展的重要驱动力。而作为新能源汽车 “心脏” 的电池系统,其热管理技术的优劣,直接决定了车辆的安全性、续航里程和使用寿命。电池在充放电过程中会产生大量…

Redis 数据类型:掌握 NoSQL 的基石

Redis (Remote Dictionary Server) 是一种开源的、内存中的数据结构存储系统,通常用作数据库、缓存和消息代理。 它的高性能和丰富的数据类型使其成为现代应用程序开发中不可或缺的一部分。 本文将深入探讨 Redis 的核心数据类型,帮助你更好地理解和利用…

MLX-Audio:高效音频合成的新时代利器

MLX-Audio:高效音频合成的新时代利器 现代社会的快节奏生活中,对语音技术的需求越来越高。无论是个性化语音助手,还是内容创作者所需的高效音频生成工具,语音技术都发挥着不可或缺的作用。今天,我们将介绍一个创新的开…

Kafka单机版安装部署

目录 1.1、概述1.2、系统环境1.3、ZooKeeper的作用1.4、部署流程1.4.1、下载安装包1.4.2、解压文件1.4.3、创建日志目录1.4.4、配置Kafka1.4.5、启动Kafka服务1.4.6、启动成功验证 1.5、创建Topic测试1.6、消息生产与消费测试1.6.1、启动生产者1.6.2、启动消费者 1.1、概述 Kaf…

【C++设计模式之Observer观察者模式】

Observer观察者模式 模式定义动机(Motivation)结构(Structure)应用场景一(气象站)实现步骤1.定义观察者接口2.定义被观察者(主题)接口3.实现具体被观察者对象(气象站)4.实现具体观察者(例如:显示屏)5.main.cpp中使用示例6.输出结果7. 关键点 …

资产月报怎么填?资产月报填报指南

资产月报是企业对固定资产进行定期检查和管理的重要工具,它能够帮助管理者了解资产的使用情况、维护状况和财务状况,从而为资产的优化配置和决策提供依据。填写资产月报时,除了填报内容外,还需要注意格式的规范性和数据的准确性。…

UG471 之 SelectIO 逻辑资源

背景 《ug471》介绍了Xilinx 7 系列 SelectIO 的输入/输出特性及逻辑资源的相关内容。 第 1 章《SelectIO Resources》介绍了输出驱动器和输入接收器的电气特性,并通过大量实例解析了各类标准接口的实现。 第 2 章《SelectIO Logic Resources》介绍了输入输出数据…

C++ 内存泄漏相关

ASAN 参考链接 https://blog.csdn.net/wonengguwozai/article/details/129593186https://www.cnblogs.com/greatsql/p/16256926.htmlhttps://zhuanlan.zhihu.com/p/700505587小demo // leak.c #include <stdio.h> #include <stdlib.h> #include <string.h>…

计算人声录音后电平的大小(dB SPL->dBFS)

计算人声录音后电平的大小 这里笔记记录一下&#xff0c;怎么计算已知大小的声音&#xff0c;经过麦克风、声卡录制后软件内录得的音量电平值。&#xff08;文章最后将计算过程整理为Python代码&#xff0c;方便复用&#xff09; 假设用正常说话的声音大小65dB&#xff08;SP…

【MySQL数据库】C/C++连接数据库

MySQL要想在C/C下使用&#xff0c;就必须要有 MySQL 提供的头文件和相关的库。 在Ubuntu系统上&#xff0c;使用 apt install mysql-server 安装MySQL服务器后&#xff0c;仅安装了MySQL数据库服务本身&#xff0c;并没有安装MySQL开发所需的库和头文件。因此&#xff0c;在尝试…

Kubernetes调度策略深度解析:NodeSelector与NodeAffinity的正确打开方式

在Kubernetes集群管理中&#xff0c;如何精准控制Pod的落点&#xff1f;本文将深入解析两大核心调度策略的差异&#xff0c;并通过生产案例教你做出正确选择。 一、基础概念快速理解 1.1 NodeSelector&#xff08;节点选择器&#xff09; 核心机制&#xff1a;通过标签硬匹配…

Golang的linux运行环境的安装与配置

很多新手在学go时&#xff0c;linux下的配置环境一头雾水&#xff0c;总结下&#xff0c;可供参考&#xff01; --------------------------------------Golang的运行环境的安装与配置-------------------------------------- 将压缩包放在/home/tools/下 解压 tar -zxvf g…

自定义实现elementui的锚点

背景 前不久有个需求&#xff0c;上半部分是el-step步骤条&#xff0c;下半部分是一些文字说明&#xff0c;需要实现点击步骤条中某个步骤自定义定位到对应部分的文字说明&#xff0c;同时滚动内容区域的时候还要自动选中对应区域的步骤。element-ui-plus的有锚点这个组件&…

Oracle Fusion常用表

模块表名表描述字段说明sodoo_headers_all销售订单头表sodoo_lines_all销售订单行表sodoo_fulfill_lines_all销售订单明细行表popo_headers_all采购订单头表popo_lines_all采购订单行表popo_line_locations_all采购订单分配表popo_distributions_all采购订单发运表invEGP_SYSTE…

面试常问系列(一)-神经网络参数初始化-之-softmax

背景 本文内容还是对之前关于面试题transformer的一个延伸&#xff0c;详细讲解一下softmax 面试常问系列(二)-神经网络参数初始化之自注意力机制-CSDN博客 Softmax函数的梯度特性与输入值的幅度密切相关&#xff0c;这是Transformer中自注意力机制需要缩放点积结果的关键原…

5.9-selcct_poll_epoll 和 reactor 的模拟实现

5.9-select_poll_epoll 本文演示 select 等 io 多路复用函数的应用方法&#xff0c;函数具体介绍可以参考我过去写的博客。 先绑定监听的文件描述符 int sockfd socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in serveraddr; memset(&serveraddr, 0, sizeof(struc…

Python基础语法(上)

常量和表达式 我们可以使用python来进行一些 - * / %的一些运算 print(1 2 - 3) print(1 2 * 3) print(1 2 / 3) python中的运算规则与数学当中一致&#xff0c;先乘除后加减&#xff0c;有括号的先计算括号里面的。 形如 1 2 - 3 这样是算式, 在编程语言中称为 表达式,…

数图闪耀2025深圳CCFA中国零售博览会:AI+零售数字化解决方案引发现场热潮

展会时间&#xff1a;2025年5月8日—10日 地点&#xff1a;深圳国际会展中心&#xff08;宝安新馆&#xff09; 【深圳讯】5月8日&#xff0c;亚洲规模最大的零售行业盛会——2025 CCFA中国零售博览会在深圳盛大开幕。本届展会汇聚全球25个国家和地区的900余家参展商&#xff…