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

【JavaEE】http/https 超级详解

   🔥个人主页: 中草药

🔥专栏:【Java】登神长阶 史诗般的Java成神之路


🦊一.定义 

         HTTP(HyperText Transfer Protocol)即超文本传输协议,他是应用非常广泛的应用层协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议。它是一种请求/响应式的协议,客户端发送请求到服务器,服务器处理后返回响应给客户端。HTTP是一个应用层协议,运行在TCP/IP协议族之上,通常使用80端口进行通信。

http不仅能传输文本,还能传输图片,传输音频文件,传输视频,传输其他的各种数据

目前互联网见到的绝大多数版本都是http/1.1

🐺二.报文格式

        我们可以借助抓包工具 fiddler 来理解HTTP的报文格式

请求报文

一个HTTP请求报文的结构如下:

  1. 请求行(Request Line)

    • 包含了请求方法、请求URI(统一资源标识符)和HTTP版本。
    • 例如:GET /index.html HTTP/1.1
  2. 请求头(Request Headers)

    • 包含了一系列的键值对,提供了关于请求的附加信息,如客户端可以接受的内容类型、编码方式、语言等。
    • 例如:
      Host: www.example.com
      User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
      Accept-Language: en-US,en;q=0.5
      Accept-Encoding: gzip, deflate
      Connection: keep-alive
  3. 空行(Blank Line)

    • 请求头与消息主体之间用一个空行分隔。
  4. 消息主体(Message Body)

    • 可选部分,包含了实际要发送的数据,如POST请求中的表单数据。
    • 例如:
      username=john&password=secret

响应报文 

一个HTTP响应报文的结构如下:

  1. 状态行(Status Line)

    • 包含了HTTP版本、状态码和状态消息。
    • 例如:HTTP/1.1 200 OK
  2. 响应头(Response Headers)

    • 提供了关于响应的附加信息,如内容长度、内容类型、服务器信息等。
    • 例如:
      Date: Mon, 23 May 2005 22:38:34 GMT
      Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
      Content-Type: text/html; charset=UTF-8
      Content-Length: 138
      Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
  3. 空行(Blank Line)

  • 响应头与消息主体之间用一个空行分隔。 
  1. 消息主体(Message Body)

    • 包含了响应的实际内容,如HTML文档、图片数据等。
    • 例如:
      <html>
      <head><title>Example Page</title></head>
      <body>
      <h1>Hello, World!</h1>
      </body>
      </html>

 🐱三.URL

        URL(Uniform Resource Locator,统一资源定位符)是互联网上用于标识和定位资源的一种标准地址格式。URL不仅指明了资源的位置,还包含了访问该资源的方式。它是URI(Uniform Resource Identifier,统一资源标识符)的一种具体形式,主要用于定位可以通过网络获取的资源。

结构

一个完整的URL通常由以下几个部分组成:

  1. 方案/协议(Scheme)

    • 指定了获取资源所使用的协议类型,比如httphttpsftpfile等。指明这个URL给那个协议使用
    • 例如:http:// 或 https://
  2. 服务器地址(主机名Host)

    • 表示存放资源的服务器的 域名或IP地址。
    • 例如:www.example.com
  3. 端口号(Port)

    • 服务运行的TCP端口号。如果省略,默认使用对应协议的标准端口(如HTTP默认80端口,HTTPS默认443端口)。
    • 例如::8080
  4. 路径(Path)

    • 服务器上的文件路径或应用程序入口点。
    • 例如:/path/to/resource
  5. 查询参数(Query)

    • 以问号?开始,后面跟着一系列键值对,用于向服务器传递额外的信息。
    • 键值对之间用&分隔。
    • 例如:?key1=value1&key2=value2
  6. 片段标识符(Fragment)

    • 以井号#开始,用来指定网页内部的一个锚点,客户端浏览器会滚动到这个位置。
    • 例如:#section1

示例URL分析

考虑如下URL:        

https://www.example.com:8080/path/to/page.html?key1=value1&key2=value2#section1
  • 方案https —— 使用安全的超文本传输协议。
  • 主机名www.example.com —— 访问的网站域名。
  • 端口号8080 —— 服务器监听的非标准端口。
  • 路径/path/to/page.html —— 资源的具体路径。
  • 查询参数?key1=value1&key2=value2 —— 提供给服务器的数据。
  • 片段标识符#section1 —— 页面内的锚点。

URL encode

        url encode  query String键值对结构是可以包含各种内容的,由于某些字符在URL中有特殊含义,或者不能直接包含在URL中(比如空格、中文字符等),因此需要进行URL编码(也称为百分号编码)。

        这种编码方式将这些字符转换为一种可以在URL中安全传输的形式。例如,空格会被编码为%20,而中文字符会被转换为其UTF-8编码后的十六进制表示,并在每个字节前加上%符号。

        在日常开发之中,大多数情况不需要手动处理转码,日常使用的一些库都自带这个功能。

作用

  • 定位资源:通过提供明确的地址来访问特定的网络资源。
  • 跨平台和跨应用通信:URL可以被不同的操作系统和应用程序解析,从而实现数据共享和链接。
  • 书签和分享:用户可以保存URL作为书签,也可以方便地与他人分享。
  • 搜索引擎优化(SEO):友好的URL结构有助于提高网页在搜索引擎中的排名。

🐈四.方法

HTTP定义了几种请求方法来表示对指定资源的不同操作方式:

  • GET:请求获取由请求URL所标识的资源。该请求方法应该只用于数据检索,而不应该被用来产生其他效果。
  • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。
  • PUT:向指定资源位置上传其最新内容。
  • DELETE:请求服务器删除Request-URI所标识的资源。
  • HEAD:类似于GET,但是不返回报文主体,只返回首部信息。
  • OPTIONS:返回服务器支持的HTTP方法。
  • TRACE:追踪请求到达目标的过程中经过的代理服务器。
  • CONNECT:将网络连接转变为透明的TCP/IP通道,通常用于SSL加密服务器的链接(经由非加密的HTTP代理)

一个经典面试题:GET和POST的区别

首先明确GET和POST并没有本质区别(他们所运用的场景可以切换)

在使用习惯上,还是有区别

1.语义不同,方法表示的含义

GET表示从服务器拿数据

POST表示往服务器提交数据

2.传递数据的方式不同,
GET 传递数据, 通常是通过 query string 把自定义数据交给服务器

POST 传递数据, 通常通过 body 把自定义数据交给服务器

3.幂等性

GET 方法对应的请求,通常设计成"幂等"的

POST 方法对应的请求,对于"幂等性"则无要求

4.承接幂等性
GET 如果设计成幂等的,此时 GET 的结果是可以被缓存的

POST 不设计成幂等性,POST 就不应该被缓存

🐕五,请求报头

请求头部包含了一系列键值对,每个键值对表示一个特定的信息。常见的HTTP请求头部字段包括但不限于:

  1. Host - 指定被请求资源的Internet主机地址和端口号。这是必须的头部字段,因为HTTP/1.1要求每个请求都包含此字段。

    Host: www.example.com
  2. User-Agent - 包含发起请求的用户代理软件的信息,如浏览器类型和版本。简称UA。判定UA字段,通过UA获取到用户的浏览器信息和操作系统信息。UA还有一个作用,就是用来做数据统计,主要是区分PC和移动端

    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
  3. Accept - 告诉服务器客户端可以接受的内容类型。

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
  4. Accept-Language - 客户端希望接收的语言。

    Accept-Language: en-US,en;q=0.9
  5. Accept-Encoding - 客户端支持的内容编码类型,如gzip。

    Accept-Encoding: gzip, deflate, br
  6. Connection - 控制网络连接的行为,比如是否保持连接。

    Connection: keep-alive
  7. Content-Type - 当请求体中携带了数据时,用于指定数据的MIME类型。

    Content-Type: application/x-www-form-urlencoded
  8. Content-Length - 请求体的长度,以字节为单位。

    Content-Length: 348
  9. Cookie - 包含之前由服务器通过Set-Cookie头部设置的cookie。他也是键值对结构,是属于浏览器给网站提供的一种"客户端存储数据"的机制,按照域名为维度分别进行存储。后续浏览器访问同一个服务器的时候,就会把之前存储的 Cookie 再带上,从而发送到服务器这边

    Cookie: name=value; sessionid=38afes7a8
  10. Authorization - 用于认证,通常在需要身份验证的请求中使用。

    Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
  11. Referer - 包含当前请求页面的来源页面的地址,即用户是从哪个页面链接过来的。

    Referer: https://www.example.com/
  12. If-Modified-Since - 只有当所请求的内容在指定的日期之后又经过修改的情况下,才返回新的内容。

    If-Modified-Since: Sun, 06 Nov 1994 08:49:37 GMT

🦬六.状态码

HTTP响应中的状态行包含了状态码,用来告知客户端请求是否成功或发生了什么类型的错误。常见的状态码有:

  • 1xx:信息性状态码
  • 2xx:成功状态码
  • 3xx:重定向状态码
  • 4xx:客户端错误状态码
  • 5xx:服务器错误状态码

例如:

  • 200 OK - 请求成功
  • 404 Not Found - 请求的资源不存在
  • 403 Forbidden 访问被拒绝(没有权限)
  • 500 Internal Server Error - 服务器遇到了意外的情况,无法完成请求
  • 504 Gateway Timeout 服务器没在规定时间内返回

🐐七.工作流程

  1. 建立TCP连接:客户端与服务器之间通过三次握手建立TCP连接。
  2. 客户端发送请求:一旦建立了TCP连接,客户端会向服务器发送一个请求报文。
  3. 服务器接收并处理请求:服务器接收到请求后,根据请求内容进行相应的处理。
  4. 服务器发送响应:处理完请求之后,服务器会生成一个响应报文,并将其发送回客户端。
  5. 关闭连接:默认情况下,请求完成后会立即断开连接;但在HTTP 1.1中引入了持久连接的概念,可以在同一个TCP连接上发送多个请求。

🐫八.https

        HTTPS(Hypertext Transfer Protocol Secure)是HTTP的安全版本,它通过SSL/TLS协议来加密信息的传输。HTTPS的主要目的是提供三个关键层面的安全保障:数据隐私、数据完整性和身份验证。

运营商劫持

        运营商劫持通常指的是互联网服务提供商(ISP,Internet Service Provider)或网络运营商在用户不知情的情况下修改用户的网络流量,从而改变用户的上网体验。这种行为可能出于多种目的,包括但不限于商业利益、监管要求等

因此,在互联网上,明文传输是比较危险的事情

加密

        加密是一种将信息转换成看似随机且无意义的数据的技术,目的是保护数据的隐私和安全。这个过程使得只有拥有正确密钥的人才能解码(或解密)信息,恢复其原始内容。加密是信息安全领域的一个核心组成部分,被广泛应用于保护敏感信息、确保通信的安全以及验证身份等场景。

加密的基本原理包括以下几个关键概念:

  1. 明文 (Plaintext):这是指未经加密的原始数据或信息。
  2. 密文 (Ciphertext):这是经过加密处理后的数据,看起来像是随机字符,没有正确的密钥就无法理解其含义。
  3. 加密算法 (Encryption Algorithm):这是一种数学函数,用于将明文转化为密文。常见的加密算法有对称加密算法(如AES, DES)和非对称加密算法(如RSA, ECC)。
  4. 密钥 (Key):这是一个特殊的参数,用于控制加密和解密的过程。在对称加密中,同一个密钥既用于加密也用于解密;而在非对称加密中,则使用一对密钥——公钥和私钥,其中公钥用于加密,私钥用于解密。
  5. 解密 (Decryption):这是加密的逆过程,通过使用正确的密钥将密文还原为原来的明文。

类型

  • 对称加密:使用相同的密钥进行加密和解密。这种方式速度快,适合大量数据的加密,但需要安全地共享密钥。
⼀个简单的对称加密, 按位异或
假设 明文 a = 1234, 密钥 key = 8888
则加密 a ^ key 得到的密⽂ b 为 9834.
然后针对密文 9834 再次进行运算 b ^ key, 得到的就是原来的明文 1234.
(对于字符串的对称加密也是同理, 每⼀个字符都可以表示成⼀个数字)
当然, 按位异或只是最简单的对称加密. HTTPS 中并不是使用按位异或
  • 非对称加密:使用一对密钥,即公钥和私钥。公钥可以公开分享,用于加密数据;而私钥必须保密,仅由接收方持有,用于解密数据。这种方法安全性更高,因为即使公钥泄露也不会影响到私钥的安全性,但它比对称加密慢很多。

应用实例

  • HTTPS协议:在互联网上安全传输数据时,通常采用SSL/TLS协议结合非对称加密来建立安全连接,并使用对称加密来高效传输实际的数据。
  • 电子邮件:某些电子邮件服务提供端到端加密功能,保证邮件内容只有发送者和接收者能够阅读。
  • 文件存储:为了保护重要文件不被未授权访问,用户可能会选择使用加密软件来加密文件,然后将其存储于云端或本地硬盘上。
  • 支付系统:在线交易过程中,信用卡信息等敏感数据会通过加密技术加以保护,防止被窃取。

总之,加密对于保障数字世界的隐私与安全至关重要,它帮助个人和组织抵御各种形式的信息泄露和攻击。

工作流程*

1.引入对称加密

        实际中,服务器在同一时刻是给钱很多客户端提供工作的,因此每个客户端所用的密钥都是不尽相同的,因此服务器需要维护每个客户端和每个密钥之间的关联关系 

比较理想的做法, 就是能在客户端和服务器建立连接的时候, 双方协商确定这次的密钥是啥~

但是如果 密钥 明文传输,此时的加密操作就有点形同虚设了,因此 密钥的传输也要加密传输 此时就引用了非对称加密

2.非对称加密

引入非对称加密,对需要传输的密钥进行加密

非对称加密的作用不是取代对称加密,而是辅助

业务数据依旧是对称加密传输

非对称加密,只用来加密对称传输密钥

非对称加密,也称为公钥加密,是一种使用一对密钥进行加密和解密的加密技术:一个公开的公钥(public key)和一个私有的私钥(private key)

工作原理

  1. 密钥生成

    • 用户通过算法生成一对密钥,其中一个是公钥,可以公开分享;另一个是私钥,必须保密。
    • 公钥用于加密数据或验证数字签名。
    • 私钥用于解密数据或创建数字签名。
  2. 加密过程

    • 发送者获取接收者的公钥,并用这个公钥来加密信息。
    • 加密后的信息只有拥有相应私钥的人才能解密。
  3. 解密过程

    • 接收者收到加密的信息后,使用自己的私钥来解密信息。
    • 由于私钥从未被公开,因此只有预期的接收者才能读取原始消息。
  4. 数字签名

    • 发送者可以使用自己的私钥对消息进行签名,产生一个唯一的签名值。
    • 接收者可以使用发送者的公钥来验证签名的真实性,确保消息未被篡改且确实来自发送者。

非对称加密,运算开销比较大,比较消耗内存

尽管如此上述的流程仍然存在巨大问题

3.中间人攻击

针对上述的加密,“黑客”可以这样做

这张图描述了一种中间人攻击的情况,具体如下:

  1. 客户端向服务器发送一条消息,获取公钥
  2. 被黑客入侵的路由器作为中间人,假装是服务器回复客户端:“我的公钥是 pub2。”(但实际上 pub2 是黑客自定义的)
  3. 客户端收到 pub2 后,使用 pub2 对业务数据进行加密,并发送给路由器。
  4. 路由器使用自己的私钥 pri2 解密得到业务数据,然后重新使用服务器真实的公钥 pub1 进行加密,发送给服务器。
  5. 服务器收到加密数据后,使用自己的私钥 pri1 解密,认为这就是客户端发送过来的数据。

        在这个过程中,客户端并不知道 pub2 是否真实来自于服务器,只能选择相信。而路由器作为中间人,成功地解密了客户端发送的数据,并重新加密发送给了服务器。服务器误以为这是客户端发送的数据,所以双方都认为已经完成了安全的密钥交换,接下来就会使用这个对称密钥进行业务数据的传输。

        然而,由于路由器已经解密了数据,它可以监控和操纵所有后续的通信,实现了中间人攻击。这个例子说明了在没有有效验证公钥来源的情况下,非对称加密也可能存在安全隐患。为了避免这种情况,应确保公钥的合法性,例如通过数字证书等方式验证。

 4.引入证书,解决中间人攻击

        数字证书是用于验证实体(如个人、组织或网站)身份的电子文档,它在互联网安全中扮演着至关重要的角色。数字证书通常与公钥基础设施(Public Key Infrastructure, PKI)一起使用,以确保网络通信的安全性

证书 相当于身份证,证明服务端公钥的权威性

内容

一个标准的X.509格式的数字证书通常包括以下信息:

  • 实体的身份信息(如名称、电子邮件地址等)
  • 公钥
  • 签发证书的CA的信息
  • 有效期
  • 序列号
  • 使用的签名算法
  • 数字签名

作用

  • 身份验证:证书提供了对实体身份的信任,用户可以确信他们正在与正确的服务器或个人进行通信。
  • 完整性保护:通过数字签名,可以检测出证书是否被篡改。
  • 支持加密通信:证书中的公钥用于建立加密通道,例如在HTTPS连接中。

签名 是保证证书合法性的关键要点 证书中的各个字段综合在一起,计算校验和

公证机构。自己也会生成一对公钥私钥(公钥 会发个各个客户端,是操作系统内置的),公证机构拿着自己的私钥对刚才的校验和进行加密,因此得到了数字签名

客户端验证数字签名
1.客户端把证书中的各个字段,再算一次校验和,得到 checksum1
2.客户端使用公正机构的公钥,对数字签名进行解密,得到 checksum2
3.对比 checksum1 == checksum2 如果相等,视为当前证书的各个字段,就是和服务器这边发出来的证书是一模一样的,此时就可以认为这是合法证书.
如果不相等,意味着证书上的内容,被中间的黑客篡改过了~~ 此时浏览器往往就会弹出警告页面,提示用户,该网站不安全....

中间人有没有可能篡改该证书?

  • 中间人篡改了证书的明文
  • 由于他没有 CA 机构的私钥,所以无法hash之后用私钥加密形成签名,那么也就没法办法对篡改后的证书形成匹配的签名
  • 如果强行篡改,客户端收到该证书后会发现明文和签名解密后的值不一致,则说明证书已被篡改,
  • 证书不可信,从而终止向服务器传输信息,防止信息泄露给中间人

🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀

以上,就是本期的全部内容啦,若有错误疏忽希望各位大佬及时指出💐

  制作不易,希望能对各位提供微小的帮助,可否留下你免费的赞呢🌸

相关文章:

  • 六,MyBatis-Plus 扩展功能(逻辑删除,通用枚举,字段类型处理,自动填充功能,防全表更新与删除插件,MybatisX快速开发插件)
  • css的盒模型
  • 数据集-目标检测系列-豹子 猎豹 检测数据集 leopard>> DataBall
  • Spring Boot框架下的足球青训俱乐部后台开发
  • 数据分析-28-交互式数据分析EDA工具和低代码数据科学工具
  • C++ STL(1)迭代器
  • 速刷DuckDB官网24小时-掌握核心功法
  • 基于Hive和Hadoop的电商消费分析系统
  • 新农人的求索:既要种菜,也要种钱
  • web开发(1)-基础
  • 2024年7月大众点评乌鲁木齐美食店铺基础信息
  • FFmpeg源码:avio_skip函数分析
  • windows10使用bat脚本安装前后端环境之msyql5.7安装配置并重置用户密码
  • Java使用RabbitMQ的详细教程(原生框架)
  • 酒店智能门锁SDK接口pro[V10] 对接酒店收银-模块封装C#-SAAS本地化-未来之窗行业应用跨平台架构
  • HashMap ConcurrentHashMap
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JavaScript学习总结——原型
  • Meteor的表单提交:Form
  • quasar-framework cnodejs社区
  • spring + angular 实现导出excel
  • vue学习系列(二)vue-cli
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 创建一种深思熟虑的文化
  • 面试遇到的一些题
  • 前端临床手札——文件上传
  • 使用 @font-face
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 通过npm或yarn自动生成vue组件
  • 赢得Docker挑战最佳实践
  • 怎样选择前端框架
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • UI设计初学者应该如何入门?
  • 数据可视化之下发图实践
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ###C语言程序设计-----C语言学习(6)#
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #QT项目实战(天气预报)
  • (1)(1.13) SiK无线电高级配置(五)
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (3) cmake编译多个cpp文件
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (编译到47%失败)to be deleted
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net web项目 调用webService
  • .net生成的类,跨工程调用显示注释
  • .Net中ListT 泛型转成DataTable、DataSet