HTTP 與 HTTPS
核心概念
HTTP 是 Web 通訊的事實標準。無狀態(每個請求獨立)、請求-回應模型。
請求結構:
GET /api/users/1 HTTP/1.1 ← method + path + version
Host: example.com ← headers
Authorization: Bearer abc123
回應結構:
HTTP/1.1 200 OK ← version + status code
Content-Type: application/json ← headers
Content-Length: 89
{ "id": 1, "name": "Terry" } ← body
HTTP 方法
| 方法 | 語義 | 冪等 | 有 Body |
|---|---|---|---|
| GET | 取得資料 | ✅ | ❌ |
| POST | 建立資源 | ❌ | ✅ |
| PUT | 完整更新 | ✅ | ✅ |
| PATCH | 部分更新 | ❌ | ✅ |
| DELETE | 刪除資源 | ✅ | ❌ |
冪等性與面試
POST 是唯一不冪等的常用方法。在設計重試機制時,非冪等操作(如支付)需要特別處理 → 見 01-Networking/07-Fault-Handling
狀態碼
| 分類 | 常見碼 | 含義 |
|---|---|---|
| 2xx 成功 | 200 OK | 請求成功 |
| 201 Created | 建立成功 | |
| 3xx 重定向 | 301 Moved Permanently | 永久移動 |
| 302 Found | 暫時移動 | |
| 4xx 客戶端錯誤 | 401 Unauthorized | 需要驗證 |
| 403 Forbidden | 已驗證但無權限 | |
| 404 Not Found | 資源不存在 | |
| 429 Too Many Requests | 頻率限制 | |
| 5xx 伺服器錯誤 | 500 Server Error | 伺服器內部錯誤 |
| 502 Bad Gateway | 上游回應無效 |
401 vs 403 容易混淆
401 = 「你是誰?」(尚未驗證身份)
403 = 「我知道你是誰,但你沒有權限」
HTTPS 與安全
HTTPS = HTTP + TLS/SSL 加密層。
- 防止竊聽(通訊加密)
- 防止中間人攻擊(伺服器憑證驗證)
- 公開網站無例外都要用 HTTPS
重要安全陷阱
HTTPS 加密的是傳輸通道,不代表請求內容是可信的。
❌ 錯誤做法:從 request body 讀取 user_id 做資料庫查詢
✅ 正確做法:永遠從驗證過的 session/token 取得用戶身份
攻擊者可以修改 HTTPS 請求的 body(中間人攻擊會被阻止,但自行構造請求不會)。
Headers 的設計哲學
Headers 是靈活的鍵值對,Accept-Encoding 是好例子:
- 客戶端表明能處理的壓縮格式(gzip, brotli)
- 伺服器用最有效率的格式回應
- 保持向後相容
這種「客戶端宣告能力,伺服器做最佳決策」的模式值得在 API 設計中借鑒。
Related Notes
- 01-Networking/04-API-Paradigms — 建立在 HTTP 之上的 REST/GraphQL/gRPC
- 01-Networking/02-TCP-vs-UDP — HTTP 建立在 TCP 之上
- 01-Networking/07-Fault-Handling — HTTP 冪等性與重試
- 01-Networking/Practice-Networking