[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.pswp.cn/bicheng/80409.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80409.shtml
英文地址,請注明出處:http://en.pswp.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…