# Lesson 7: 網路共通語-HTTP 協定核心

前面介紹了比較多實務上的內容，內容也相對扎實，接下來我們就進到比較輕鬆的環節，這篇文章主要探討HTTP以及相關延伸的概念。

# 什麼是Http

HTTP（超文字傳輸協定，HyperText Transfer Protocol）是全球資訊網 (World Wide Web) 的基礎，它是一種應用層協定，用於在用戶端和伺服器之間傳輸超媒體文件（例如 HTML 頁面）。HTTP 是網路上的共通語言。

**HTTP** (HyperText Transfer Protocol，超文字傳輸協定) 是全球資訊網 (World Wide Web) 的資料通訊基礎。

它位於 **OSI 模型的應用層**，是電腦之間交換資訊時遵循的一套規則。如果說 TCP/IP 像是網路世界的郵局和道路，那麼 HTTP 就是與伺服器之間溝通的「語言」。

## OSI模型是什麼

相信離開資訊相關科系後，這些學術內容（計算機概論）大家跟我一樣都拋在腦後了，所以我們來簡單複習一下。

OSI模型分成七層：應用層、表示層、工作層、傳輸層、網路層、資料連結層、實體層

基本上工作後大多只會碰到應用層

應用層就是大家耳熟能詳的：Http,Https,FTP,SMTP之類的

## Http的應用

HTTP 採用經典的**客戶端-伺服器端 (Client-Server)** 模式，整個過程就是一個不斷循環的**請求-回應 (Request-Response)** 循環。

1. **用戶端 (Client, 通常是瀏覽器)**：發起請求，要求存取特定資源（如 HTML 文件、圖片、API 資料）。
    
2. **伺服器端 (Server, 網站主機)**：接收請求，處理資料，並回傳回應。
    

# Request

作為後端工程師，我們每天都在接受請求後進行回應，一個完整的請求包含以下

## 請求行

請求行由：請求方法(Method)、請求目標(path/路由）、請求版本 組合而成。

### 請求版本

其實回應速度也會跟Http版本有關，以下提供Http1.1/2/3之間的比較

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765445205878/de92eaea-6267-4ec8-aa56-35101756e1fb.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765445209641/d54a88fc-ede8-42ad-be31-150d744680a8.png align="center")

### 常見 HTTP 方法 (Method)

這是實現 **RESTful API** 的基礎。

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1765445218218/d3bf8cbb-1038-440e-8dc0-5167f5aad2ae.png align="center")

## 請求標頭 (Request Headers)

包含額外的元數據，以 **Key-Value** 形式呈現，是控制請求行為的關鍵，以下我挑幾個重點介紹：

1. User-Agent：Client端的類型(如OS , 瀏覽器版本)
    
2. Accept：Client端接受的回應類型 (例如：application/json, text/html , */* )
    
3. Content-Type：主體中發送的數據格式 (例如：application/json, application/x-www-form-urlencoded)
    
4. Cookie：瀏覽器發送給伺服器的 Cookie 資料，用於身份識別
    
5. Authorization：身份驗證資訊 (例如：Bearer Token)
    

## 請求主體 (Request Body)

僅在 `POST`、`PUT`、`PATCH` 等方法中出現。它攜帶了實際要提交給伺服器處理的數據，例如表單數據、JSON 物件等。

# Response

Response就是 server 端接受到request後，結束處理丟回去給client端的**回應**

基本上跟Request沒差多少，比較不一樣的是：status code

## Status Code

這裡就針對常見的status code進行介紹。

但實際上大家都很懶，我還真沒看過真的哪家公司完全照status code的定義回傳的

### 成功類

* 200 - 請求成功，回傳資源
    
* 201 - created，資源新增成功
    
* 204 - No Content ，請求成功，但不回傳資源
    

### 重定向

* 301 - 永久轉址
    
* 302 - 暫時轉址
    

### Client的問題

* 400 - 請求格式有誤
    
* 401 - Unauthorized，沒有身份驗證（沒有登入）
    
* 403 - Forbidden，沒權限
    
* 404 - 找不到資源
    
* 413 - 請求過大
    
* 429 - 請求頻率過高
    

### Server的問題

* 500 - **Internal Server Error** ，程式碼發生未預期的錯誤
    
* **503 - Service Unavailable** ，伺服器臨時超載或維護
    

# HTTP 的核心特性

## 無狀態性

HTTP 協定本身不保留任何用戶端的連線狀態或歷史資訊。每個請求和回應都被視為一次獨立的事件。為了維持使用者體驗（例如登入狀態），通常會透過 **Cookies** 或 **Session** 等技術來彌補無狀態的限制。

補充：傳統登入做法就是session id存在前端cookie，因為前端請求會攜帶cookie到後端，後端就拿cookie中的session id 找 session就知道是哪個User了。

## 一次性

在 HTTP/1.0 中，每次請求發送完畢並收到回應後，TCP 連線就會被關閉。雖然 HTTP/1.1 及後續版本引入了持久連線 (Persistent Connection) 來重複使用連線以提高效率，但 HTTP 協定本身仍是基於請求/回應的模式。

補充：實務上如果需要保持連線，多半會使用websocket(一樣是 應用層的協議）

# **HTTP 與 HTTPS 的差異**

差一個S，差在哪？

Https就是Http多一個secure，簡單來說就是比較安全，那安全在哪？

在 HTTP 之下加入了 安全通層協定/**傳輸層**安全，將所有傳輸的資料進行加密，提供資料機密性和完整性，以及伺服器身份驗證。這對於處理信用卡號碼、密碼等敏感資訊的網站至關重要。HTTPS 預設使用443 port，而 HTTP 預設使用80 port。

相信大家很常聽到Https的S就是SSL，但其實在現代化的網路中SSL已經全面改成TLS了。

從前 (1990s)： HTTPS = HTTP + SSL

現在 (實際標準)： HTTPS = HTTP + TLS

SSL 3.0 之後就被廢棄，所有現代瀏覽器與伺服器都使用 TLS 1.2 或 TLS 1.3。

ps.前陣子忘記在哪裡看到有人在吵Https的S到底是不是TLS，甚至有人去截圖維基百科說S明明是指**Secure**，但人家百科後面明明還有寫：常稱為HTTP over TLS、HTTP over SSL或HTTP Secure。

不管S指的是TLS還是Secure，就是因為用TLS加密封包才會比較Secure。
