HTTP 和 HTTPS

、ZJL發表於2020-11-10

梗概

HTTP:是網際網路上應用最為廣泛的一種網路協議,是一個客戶端和伺服器端請求和應答的標準(HTTP 協議執行在 TCP 之上),用於從 WWW 伺服器傳輸超文字到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網路傳輸減少。
HTTPS:是以安全為目標的 HTTP 通道,簡單講是 HTTP 的安全版,即 HTTP 下加入 SSL 層,HTTPS 的安全基礎是 SSL,因此加密的詳細內容就需要 SSL。HTTPS 協議的主要作用可以分為兩種:一種是建立一個資訊保安通道,來保證資料傳輸的安全;另一種就是確認網站的真實性。

區別

Http 協議執行在 TCP 之上,明文傳輸,客戶端與伺服器端都無法驗證對方的身份;HTTPS 是執行在 SSL/TLS 之上的 HTTP 協議,SSL/TLS 執行在 TCP 之上。HTTPS是新增了加密和認證機制的 HTTP。二者之間存在如下不同:
埠不同:Http 與 Https 使用不同的連線方式,用的埠也不一樣,前者是 80,後者是 443;
資源消耗:和 HTTP 通訊相比,Https 通訊會由於加減密處理消耗更多的 CPU 和記憶體資源;
開銷:Https 通訊需要證書,而證書一般需要向認證機構購買;
Https 的加密機制是一種共享金鑰加密和公開金鑰加密並用的混合加密機制。

HTTPS 採用混合加密機制

由於公有金鑰的機制相對複雜,導致其處理速度相對較慢。於是 HTTPS 利用了兩者的優勢,採用了混合加密的機制。我們知道,共享(對稱)金鑰未能解決的問題是如何能夠安全地把金鑰傳送給對方。只要解決了這個問題就可以進行安全地通訊。於是,HTTPS 首先是通過公有金鑰來對共享金鑰進行加密傳輸。當共享金鑰安全地傳輸給對方後,雙方則使用共享金鑰的方式來加密報文,以此來提高傳輸的效率。

步驟 1:向伺服器發起請求。
步驟 2-3:取出公有金鑰及證書併傳送給客戶端。
步驟 4:客戶端判斷公有金鑰是否有效,無效則顯示警告。有效則生成一個隨機數串,並以此生成客戶端的共享金鑰。
步驟 5:用步驟 3 得到的公有金鑰對該隨機數串加密,傳送到伺服器。
步驟 6:伺服器得到加密報文,用私有金鑰解密報文,得到隨機數串,並以此生成伺服器端的共享金鑰。此時客戶端和服務端擁有相同的共享金鑰,可以用該共享金鑰進行安全通訊。
步驟 7-8:伺服器對響應進行加密,客戶端對報文進行解密。

HTTPS 的優點

儘管 HTTPS 並非絕對安全,掌握根證書的機構、掌握加密演算法的組織同樣可以進行中間人形式的攻擊,但 HTTPS 仍是現行架構下最安全的解決方案,主要有以下幾個好處:
(1)使用 HTTPS 協議可認證使用者和伺服器,確保資料傳送到正確的客戶機和伺服器;
(2)HTTPS 協議是由 SSL+HTTP 協議構建的可進行加密傳輸、身份認證的網路協議,要比 http 協議安全,可防止資料在傳輸過程中不被竊取、改變,確保資料的完整性。
(3)HTTPS 是現行架構下最安全的解決方案,雖然不是絕對安全,但它大幅增加了中間人攻擊的成本。

HTTPS 的缺點

雖然說 HTTPS 有很大的優勢,但其相對來說,還是存在不足之處的:
(1)HTTPS 協議握手階段比較費時,會使頁面的載入時間延長近 50%,增加 10% 到 20% 的耗電;
(2)HTTPS 連線快取不如 HTTP 高效,會增加資料開銷和功耗,甚至已有的安全措施也會因此而受到影響;
(3)SSL 證書需要錢,功能越強大的證書費用越高,個人網站、小網站沒有必要一般不會用。
(4)SSL 證書通常需要繫結 IP,不能在同一 IP 上繫結多個域名,IPv4 資源不可能支撐這個消耗。
(5)HTTPS 協議的加密範圍也比較有限,在黑客攻擊、拒絕服務攻擊、伺服器劫持等方面幾乎起不到什麼作用。最關鍵的,SSL 證書的信用鏈體系並不安全,特別是在某些國家可以控制 CA 根證書的情況下,中間人攻擊一樣可行。

HTTP 是不儲存狀態的協議,如何儲存使用者狀態?

HTTP 是一種不儲存狀態,即無狀態(stateless)協議。也就是說 HTTP 協議自身不對請求和響應之間的通訊狀態進行儲存。那麼我們儲存使用者狀態呢?Session 機制的存在就是為了解決這個問題,Session 的主要作用就是通過服務端記錄使用者的狀態。典型的場景是購物車,當你要新增商品到購物車的時候,系統不知道是哪個使用者操作的,因為 HTTP 協議是無狀態的。服務端給特定的使用者建立特定的 Session 之後就可以標識這個使用者並且跟蹤這個使用者了(一般情況下,伺服器會在一定時間內儲存這個 Session,過了時間限制,就會銷燬這個 Session)。

在服務端儲存 Session 的方法很多,最常用的就是記憶體和資料庫 (比如是使用記憶體資料庫 redis 儲存)。既然 Session 存放在伺服器端,那麼我們如何實現 Session 跟蹤呢?大部分情況下,我們都是通過在 Cookie 中附加一個 Session ID 來方式來跟蹤。

相關文章