iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0
Security

跨出第一步:D 從0到0.1的Web security 系列 第 4

Day 3: 一封信的旅程:從請求到回應的 HTTP 傳輸流程

  • 分享至 

  • xImage
  •  

各位我們今天來看HTTP的請求與回應吧,我們今天來解析一下HTTP Request/Response的方法與標頭
我們再上一次圖
https://ithelp.ithome.com.tw/upload/images/20250915/20169408JaKDfvPsCk.png
HTTP Request:向伺服器下訂單
首先,我們需要理解 HTTP 是客戶端(瀏覽器)跟伺服器之間溝通的共同語言。而 HTTP Request 就是客戶端用這種語言,向伺服器發出的一個「請求訊息」,好比是我們寫信或填寫一張訂單給店家。

一個完整的 HTTP Request 主要由三個部分組成:

請求行 (Request Line)

請求標頭 (Request Headers)

請求主體 (Request Message Body)

  1. 請求行 (Request Line)

這是整個請求訊息的第一行,也是最核心的部分,直接表達了我們客戶端的意圖。

GET /doc/test.html HTTP/1.1

這一行包含了三個重要資訊:

HTTP 方法 (Method):GET

這表示客戶端想要執行的動作。GET 是最常見的方法,意思是「請給我資源」。其他常見的方法還有:

POST:向伺服器提交資料(例如,送出註冊表單)。

PUT/PATCH:更新伺服器上的資源(例如,修改留言內容)。

DELETE:刪除伺服器上的資源(例如,有人發了一篇逆風文然後刪掉XD)。

請求的資源路徑 (URI):/doc/test.html

這告訴伺服器客戶端想要的是哪一個資源。它通常是網站根目錄之後的路徑和檔名。

HTTP 協定版本:HTTP/1.1

這表示客戶端使用的是哪個版本的 HTTP 協定。伺服器需要知道這個版本才能正確地溝通。HTTP/1.1 是長期以來最廣泛使用的版本,現在也有更新的 HTTP/2 和 HTTP/3。

  1. 請求標頭 (Request Headers)

請求標頭用來提供關於這個請求的更多附加資訊。

Host: www.test101.com

必要標頭。它指定了目標伺服器的網域名稱。因為一台實體伺服器可能託管了多個網站,Host 標頭能讓伺服器知道客戶端到底要訪問的是哪一個網站。

Accept: image/gif, image/jpeg, /

告訴伺服器,客戶端可以接受哪些類型的內容(MIME 類型)。

Accept-Language: en-us

告訴伺服器,客戶端偏好的語言是美國英語 (en-us)。如果伺服器有多國語言版本,就可以根據這個標頭回傳對應的語言頁面。

Accept-Encoding: gzip, deflate

告訴伺服器,客戶端可以處理被壓縮過的內容。如果伺服器支援,它可以先將資料壓縮再傳送,以節省網路頻寬、加快傳輸速度。

User-Agent: Mozilla/4.0

用來識別客戶端的軟體資訊(作業系統、瀏覽器名稱與版本等)。

Content-Length: 35

表示請求主體 (Request Body) 的長度(單位是位元組)。這個標頭只在請求中帶有主體時才會出現(通常是 POST 或 PUT 請求)。

  1. 請求主體 (Request Message Body)

請求主體是選填的,它包含了要發送給伺服器的實際資料。

bookId=12345&author=Tan+Ah+Teck

用途:通常用在 POST 方法中。例如當我們提交一個網頁表單時,填寫的帳號、密碼、留言等資料就會被放在請求主體中。(不過HTTP是以明文傳輸的,如果沒有使用 HTTPS,你輸入的這些資料在駭客的眼中其實跟裸奔沒兩樣!)

格式:圖中的 key=value&key2=value2 是一種常見的表單編碼格式。現在更常用 JSON 格式在主體中傳遞資料,尤其是在 API 通訊中。

再來我們看這張圖
https://ithelp.ithome.com.tw/upload/images/20250915/20169408IQePub3oRp.png
HTTP Response:來自伺服器的包裹與收據
如果說 HTTP Request 是我們對伺服器的「訂單」,那 HTTP Response 就是伺服器回覆給我們的「包裹跟收據」。

一個標準的 HTTP Response 同樣由三個部分組成:

狀態行 (Status Line)

回應標頭 (Headers)

回應主體 (Body)

  1. 狀態行 (Status Line)

這是回應訊息的第一行,也是最重要的部分,直接總結了伺服器對請求的處理結果。

HTTP/1.1 200 OK

這一行也包含了三個重要資訊:

HTTP 協定版本:HTTP/1.1

伺服器用來回應的 HTTP 協定版本。

狀態碼 (Status Code):200

最關鍵的資訊。一個三位數的數字,用來表示請求的處理結果。200 代表「成功 (Success)」。

狀態碼主要分為五大類:

2xx (成功):請求已成功處理。(例: 200 OK, 201 Created)

3xx (重定向):需要客戶端採取進一步的操作。(例: 301 Moved Permanently)

4xx (客戶端錯誤):請求有問題。(例: 404 Not Found - 找不到頁面, 403 Forbidden - 權限不足)

5xx (伺服器錯誤):伺服器端出錯。(例: 500 Internal Server Error)

狀態訊息 (Reason Phrase):OK

用來描述狀態碼的簡短文字,主要是給開發者看的。

  1. 回應標頭 (Headers)

回應標頭提供關於這個回應或伺服器本身的附加資訊。

Date: 伺服器產生此回應的日期和時間。

Server: 伺服器軟體的資訊(例如 Apache/2.2.14)。

Last-Modified: 請求的資源最後一次被修改的時間,可用於瀏覽器快取。

Content-Length: 回應主體 (Body) 的長度。

Content-Type: 最重要的標頭之一。它告訴瀏覽器回應主體的內容是什麼類型。例如 text/html 表示這是一份 HTML 文件;image/jpeg 則表示這是一張圖片。

Connection: 告知連線狀態,Closed 表示完成後關閉,keep-alive 表示保持連線以利後續請求。

  1. 回應主體 (Body)

在標頭和一個空白行之後,就是回應主體。這部分就是我們真正想要的內容,也就是你們現在看到的網頁頁面、圖片、影片等等。


上一篇
Day 2: 網站的接待員與廚房:瀏覽器、網站伺服器與後端語言
下一篇
Day 4: 網站如何記住我? Cookie 與 Session
系列文
跨出第一步:D 從0到0.1的Web security 30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言