【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)

    • 包含了一系列的键值对,提供了关于请求的附加信息,如客户端可以接受的内容类型、编码方式、语言等。

    • 例如:

      java 复制代码
      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请求中的表单数据。

    • 例如:

      java 复制代码
      username=john&password=secret

响应报文

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

  1. 状态行(Status Line)

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

    • 提供了关于响应的附加信息,如内容长度、内容类型、服务器信息等。

    • 例如:

      java 复制代码
      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文档、图片数据等。

    • 例如:

      java 复制代码
      <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)

    • 指定了获取资源所使用的协议类型,比如http, https, ftp, file等。指明这个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:

java 复制代码
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要求每个请求都包含此字段。

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

    java 复制代码
    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 - 告诉服务器客户端可以接受的内容类型。

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

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

    java 复制代码
    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之后用私钥加密形成签名,那么也就没法办法对篡改后的证书形成匹配的签名
  • 如果强行篡改,客户端收到该证书后会发现明文和签名解密后的值不一致,则说明证书已被篡改,
  • 证书不可信,从而终止向服务器传输信息,防止信息泄露给中间人

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

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

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

相关推荐
幽弥千月11 分钟前
【ELK】ES单节点升级为集群并开启https【亲测可用】
elk·elasticsearch·https
PP东4 小时前
ES6学习Generator 函数(生成器)(八)
javascript·学习·es6
小屁不止是运维6 小时前
麒麟操作系统服务架构保姆级教程(二)ssh远程连接
linux·运维·服务器·学习·架构·ssh
njnu@liyong6 小时前
图解HTTP-HTTP状态码
网络协议·计算机网络·http
maimang096 小时前
关于UDP缓冲区和丢包统计
网络
tjjingpan7 小时前
HCIA-Access V2.5_4_2_静态路由介绍
网络
follycat7 小时前
bestphp‘s revenge
学习·web安全
柳鲲鹏7 小时前
jiangdg/AndroidCamera关闭摄像头流程
笔记
职业考试资料墙7 小时前
二级建造师考试题库及答案
学习·考试·题库
warrah7 小时前
k8s迁移——岁月云实战笔记
笔记·容器·kubernetes