理解 HTTP、HTTPS

你是否曾經好奇瀏覽網頁時,輸入的網址為什麼都是 http 開頭的?

網路模型 TCP/IP 聊起,經過網路層的 IP 到傳輸層的 TCP,HTTP 就是基於這些資料傳輸協定之上的應用層協定,我們今天就來看看現代人每天上網的背後都會用到的 HTTP 是何許協定吧!

HTTP 是什麼?超文本又是什麼?

HTTP,HyperText Transfer Protocol,譯作「超文本傳輸協定」。直白的說就是定義如何傳輸「超文本」,但什麼又是超文本呢?

這個概念的靈感來源被認為是在最初在 1941 年的短篇小說 The Garden of Forking Paths 中出現,在 1989 年 HTTP 的專案被 Tim Berners-Lee 發起時,描述 HyperText 為包含「超連結」文字及圖像的一種文本。

我想「超連結」對大家應該在熟悉不過了,也就是點了之後可以連到其它網頁,或概念上稱作文本的文字。而傳輸「超文本」的協定,就是我們這次的主題 HTTP。

HTTP 之中的角色分為兩個,一個是客戶端,另一個是伺服器端。當你用電腦在瀏覽網頁時,你的電腦瀏覽器就是客戶端,會詢問你想要瀏覽的網站伺服器,能否把網站的檔案傳給你。

HTTP 資料的傳輸:請求及回應

整個傳輸資料的過程相當直接,就是我問你答:客戶端送出一個「請求」,而伺服器端送回一個「回應」。

下載網頁的流程

你常在用的瀏覽器,不論是 Chrome, Safari, Firefox 還是 Edge 等等,都是透過 HTTP 把網站的內容抓下來,但是並非一次問與答就把所有的檔案下載回來。

瀏覽器請求網頁

當你點了某個超連結,或是在網址列輸入一串網址之後,你的瀏覽器便會透過 HTTP 對伺服器端送出第一個請求,假如沒有被拒絕的話,你通常會得到一個副檔名為 HTML 的檔案。

HTML(HyperText Markup Language)就是用來呈現超文本的一種「語言」,瀏覽器被設計成可以讀懂這種「語言」,因此當你下載成功一份 HTML 檔案之後,瀏覽器便會把這種語言翻譯成你看的懂得樣子,也就是漂亮的網頁,這個翻譯的過程被稱做「渲染」。

但剛開始渲染 HTML 時只有文字能夠顯示出來,一份 HTML 檔案裡面只有純文字,無法夾帶圖片,通常也不會把排版的樣式寫在一起。所以這些圖片、樣式檔會通過接下來一連串的 HTTP 請求,和伺服器端獲取。

例如我們瀏覽 Google 時,打開瀏覽器的開發者模式,在 Network 的標籤處可以看到下載了哪些檔案。

Chrome 開發者模式查看下載文件

由於這些檔案都是一步一步下載到你的電腦中的,所以有的時候瀏覽網頁時會發現怎麼剛開始版面是跑掉的,圖片還沒載入的情況。

為何都是 http 開頭

回到最開頭的問題,為何網頁都是 HTTP 開頭的呢?提到 HTTP 開頭的這種寫法,就不得不先說 URL(Uniform Resoure Locator)。

URL 也就是大家俗稱的網址,常見書寫的格式為 [協定]://[伺服器位置]:[連接埠號碼]/[檔案路徑]...,剛開始要填入的 [協定] 在透過 HTTP 下載網頁資料時便要填入 http。除此之外也有 ftp://mailto:// 用來下載檔案和傳送 email 的寫法。

所以當我們要瀏覽網頁時,由於要透過 HTTP 來下載網頁內容,我們就要在 URL 的協定部分填上 HTTP。但現在的瀏覽器基本上都預設你要透過 HTTP 來上網了,當你只打上 URL 後面的網站位置等資訊,也會自動幫你加上 http 囉!

HTTP Request Method

如果你只是在網址列打上網址按下 Enter,瀏覽器會送出 HTTP GET 的請求來獲取 HTML 等檔案。

等等,什麼叫做 HTTP GET?這邊就要提到 HTTP 所定義的 Method(方法)了,在送出請求時需要指定一個 Method。而這邊的 Method 指的是透過 HTTP 來做什麼事情,例如 GET 就是其中一種,用來請求一些文本、圖片等資源。

除此之外還有另外 7 個不同的 Methods,但是最常用到的一般只有 GET 以及 POST 兩種。而 POST 是用來提交一些東西,可能會改變伺服器狀態、資料庫內容等,通常提交表單用的就會是 HTTP POST。

HTTP Status Code

有請求 Method,另一邊也有 Response Status Code。HTTP 將其定義成一個 3 位數字,用來表示回覆的狀態。

  • 1xx:資訊
  • 2xx:成功
  • 3xx:重新導向
  • 4xx:請求錯誤
  • 5xx:伺服器錯誤

以上分別由 1 至 5 開頭的,表示不同的意思,例如 200,就是 OK 的意思,代表你的請求成功了,在 GET 的請求下你便會拿到你請求的檔案,若是用 POST 提交表單則表示提交成功。

404 Not Found

其中 404 Not Found 應該算是大家最熟悉的 Status Code,總是可以看到大大的 404 三個數字,告訴你找不到。

但有時會聽到一些疑問,這個 404 是怎麼跑出來的?是網路有問題嗎,還是網站壞掉了?

404(來源:Unsplash)

探究其背後,你所看到的 404 頁面,都是網站伺服器的回應。有時會看到很有設計感的 404,這也是網站設計者製作的,讓請求的資源找不到時(例如網址的部分打錯、原文章被刪除了),有個畫面可以被瀏覽器渲染。

透過 HTTP 上網安全嗎?

你上的網站是「安全」的嗎?

現在的瀏覽器對於安全性的提醒都蠻完善了,拿 Chrome 來說,當你瀏覽某個網站時,可以看看網址列是否有提醒你此網站是否安全。

鳥哥的 Linux 私房菜

例如鳥哥的 Linux 私房菜,目前用瀏覽器查看的話,會提醒你這是個「不安全」的網站(但還是相當推這個學習資源),在此網站輸入較為機密的訊息,如密碼、信用卡號等等可能會有洩漏的風險。

這邊的「安不安全」代表在資料傳輸的過程中安不安全,是否可能被中間人擷取訊息,並不代表這個網站的伺服器安全性是否夠高。

MITM 中間人攻擊

我們在前面聊過路由,知道在網路上傳送訊息到某個 IP 位置中間會經過許許多多節點。

也就是說當某個人 Alice 透過 HTTP 上網時,連到 Bob 的伺服器,如果中間經過的某個節點是個壞人 Eve,他就能把你的封包打開來偷看一下,繼續傳給下一個節點,Alice 和 Bob 卻渾然不知,完全沒有隱私可言。

中間人攻擊

這就是所謂的中間人攻擊(Man-in-the-middle attack,簡寫成 MITM attack)。

那這可怎麼辦?能不能繞過 Eve 改走其它節點呢?答案是沒用的,任何一個節點都能看到你封包裡面的內容,如果要在上網時不讓別人看到你的內容,在傳輸時保證安全性,就得靠 HTTPS 這個協定的。

何謂 HTTPS?為什麼 HTTPS 是安全的?

在 HTTP 之後加一個 S 的協定 HTTPS 是什麼?這個 S 代表的是 Secure 的意思,也就是安全的 HTTP。

和 HTTP 相比,HTTPS 如何做到傳輸時更安全的呢?

加密,我加了密。

HTTPS 透過「傳輸層安全性協定」(TLS, Transport Layer Secure,前身為 SSL, Secure Sockets Layer)來進行封包的加密,在 TCP 送出封包之前先加密,收到時先解密。

google.com

透過 HTTPS 協定提供加密傳輸通道的網站,就會是 https:// 開頭。瀏覽器也會給這個網站一個「鎖頭」表示在此網站送出敏感訊息,在傳輸時是安全的。

但要讓網站獲得這個鎖頭,不單單是透過 HTTPS 協定加密解密,還包含「憑證」的相關資訊就是,至於憑證為何,我們待之後聊。

資料是安全的,但網址上和網址上的資料會被偷看到嗎?

我們了解到 HTTPS 所使用的 TLS 這個協定是介於 HTTP 和 TCP 之間的,我們傳輸的或是從網站得到的回應都會經過加密,有一定的保護存在。

那麼網址呢?或是我在網址後面似乎也有看到一些參數像是 https://xxx?name=123 中的 name=123 這類的資訊,是否也會被保護呢?

簡單一點的答案是,會的。

無論是 HTTP 的哪種 Method,都會被加密,用 HTTP GET 的加入的額外資訊稱做 parameters,例如 name=123 就是其中一個 parameter,自然也會被加密。

但是你瀏覽的網站是什麼網站,就不見得是可以隱藏的了。除了你送的目的 IP 位置是以明文的方式顯示,在透過網址轉成 IP 位置所需要用的 DNS 這個服務,也會透露出你上了什麼網站。

因此,就算刪掉你瀏覽器中的瀏覽記錄或使用無痕模式上網,你的 Router,或是 IPS 還是會記錄相關的資訊唷!

參考資料

  1. Wiki - HTTP
  2. Wiki - HyperText
  3. Wiki - URL
  4. MDN Web Docs - HTTP request methods
  5. MDN Web Docs - HTTP response status codes
  6. Wiki - HTTPS
  7. Wiki - 中間人攻擊
  8. Wiki - TLS
  9. StackOverflow - Are HTTPS URLs encrypted?

圖片來源

  1. Unsplash - 404, by Erik Mclean