HTTP Protocol: Hướng Dẫn Toàn Diện

Giới Thiệu
Mỗi khi bạn duyệt web, gọi API, hoặc tương tác với ứng dụng web, bạn đang sử dụng HTTP — HyperText Transfer Protocol. Đây là nền tảng của giao tiếp dữ liệu trên web và hiểu sâu về nó sẽ giúp bạn trở thành developer giỏi hơn.
Bài viết này sẽ đưa bạn từ kiến thức cơ bản đến các khái niệm nâng cao như HTTP/2 và HTTP/3, với các ví dụ thực tế mà bạn có thể áp dụng ngay.
Bạn Sẽ Học Được
✅ Hiểu HTTP là gì và cách hoạt động
✅ Nắm vững HTTP methods (GET, POST, PUT, DELETE, PATCH, và nhiều hơn)
✅ Học tất cả HTTP status codes và khi nào sử dụng
✅ Làm việc với headers, cookies, và authentication
✅ Hiểu HTTPS và bảo mật TLS/SSL
✅ Khám phá cải tiến HTTP/2 và HTTP/3
✅ Triển khai caching và CORS đúng cách
✅ Debug HTTP với curl, Postman, và browser DevTools
HTTP Là Gì?
HTTP (HyperText Transfer Protocol) là giao thức tầng ứng dụng để truyền tải các tài liệu hypermedia (như HTML). Nó tuân theo mô hình client-server:
- Client (browser, app, hoặc API consumer) gửi request
- Server xử lý request và trả về response
Client Server
| |
| -------- Request ---------> |
| |
| <------- Response --------- |
| |Đặc Điểm Chính
- Stateless: Mỗi request độc lập. Server không nhớ các request trước.
- Text-based: HTTP messages có thể đọc được (cho đến khi HTTP/2 dùng binary).
- Extensible: Headers cho phép thêm metadata tùy chỉnh.
- Request-Response: Mỗi tương tác là một request theo sau bởi response.
Lịch Sử HTTP
HTTP/1.0 (1996)
- Thêm POST, HEAD methods
- Giới thiệu status codes
- Thêm headers
- Một request mỗi kết nối TCP
HTTP/1.1 (1997) — Persistent Connections
- Persistent connections (keep-alive mặc định)
- Pipelining (gửi nhiều requests mà không chờ responses)
- Methods mới: PUT, PATCH, DELETE, OPTIONS
- Bắt buộc có Host header
Vẫn được sử dụng rộng rãi ngày nay!
HTTP/2 (2015) — Binary và Multiplexed
- Binary framing (không phải text)
- Multiplexing (nhiều requests trên một connection)
- Header compression (HPACK)
- Server push
HTTP/3 (2022) — QUIC Protocol
- Xây dựng trên QUIC (UDP-based) thay vì TCP
- 0-RTT connection (kết nối nhanh hơn)
- Independent streams (không bị head-of-line blocking)
- Built-in encryption (bắt buộc TLS 1.3)
Cấu Trúc HTTP Request
METHOD /path HTTP/version
Header1: Value1
Header2: Value2
Request Body (tùy chọn)Ví Dụ Request
POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Length: 58
{"name": "John Doe", "email": "[email protected]"}Cấu Trúc HTTP Response
HTTP/version StatusCode StatusMessage
Header1: Value1
Header2: Value2
Response BodyVí Dụ Response
HTTP/1.1 201 Created
Content-Type: application/json
Location: /api/users/123
{
"id": 123,
"name": "John Doe",
"email": "[email protected]"
}HTTP Methods (Verbs)
GET — Lấy Dữ Liệu
Safe và idempotent. Không thay đổi trạng thái server.
GET /api/users/123 HTTP/1.1
Host: api.example.comPOST — Tạo Dữ Liệu
Không idempotent. Tạo resource mới.
POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
{"name": "Jane Doe", "email": "[email protected]"}PUT — Thay Thế Dữ Liệu
Idempotent. Thay thế toàn bộ resource.
PUT /api/users/123 HTTP/1.1
Content-Type: application/json
{"id": 123, "name": "John Smith", "email": "[email protected]"}PATCH — Cập Nhật Một Phần
Cập nhật các trường cụ thể.
PATCH /api/users/123 HTTP/1.1
Content-Type: application/json
{"name": "John Smith"}DELETE — Xóa Dữ Liệu
Idempotent. Xóa resource.
DELETE /api/users/123 HTTP/1.1So Sánh Methods
| Method | Request Body | Idempotent | Safe | Cacheable |
|---|---|---|---|---|
| GET | Không | Có | Có | Có |
| POST | Có | Không | Không | Hiếm |
| PUT | Có | Có | Không | Không |
| PATCH | Có | Không | Không | Không |
| DELETE | Tùy chọn | Có | Không | Không |
HTTP Status Codes
2xx — Thành Công
| Code | Tên | Khi Sử Dụng |
|---|---|---|
| 200 | OK | GET, PUT, PATCH thành công |
| 201 | Created | Resource được tạo (POST) |
| 202 | Accepted | Request được chấp nhận cho xử lý async |
| 204 | No Content | Thành công, không có body |
3xx — Chuyển Hướng
| Code | Tên | Khi Sử Dụng |
|---|---|---|
| 301 | Moved Permanently | Resource di chuyển vĩnh viễn |
| 304 | Not Modified | Phiên bản cache vẫn còn valid |
| 307 | Temporary Redirect | Chuyển hướng tạm thời (giữ method) |
4xx — Lỗi Client
| Code | Tên | Khi Sử Dụng |
|---|---|---|
| 400 | Bad Request | Cú pháp không hợp lệ, validation failed |
| 401 | Unauthorized | Cần authentication |
| 403 | Forbidden | Đã xác thực nhưng không có quyền |
| 404 | Not Found | Resource không tồn tại |
| 409 | Conflict | Request xung đột với trạng thái hiện tại |
| 422 | Unprocessable Entity | Validation errors |
| 429 | Too Many Requests | Vượt quá rate limit |
5xx — Lỗi Server
| Code | Tên | Khi Sử Dụng |
|---|---|---|
| 500 | Internal Server Error | Lỗi server chung |
| 502 | Bad Gateway | Upstream server trả về response không hợp lệ |
| 503 | Service Unavailable | Server quá tải hoặc bảo trì |
| 504 | Gateway Timeout | Upstream server không phản hồi kịp thời |
HTTP Headers
Request Headers Phổ Biến
Host: api.example.com # Bắt buộc trong HTTP/1.1
Accept: application/json # Định dạng response mong muốn
Content-Type: application/json # Định dạng body của request
Authorization: Bearer eyJhbGciOi... # Token xác thực
User-Agent: Mozilla/5.0 # Định danh client
Cookie: session=abc123 # CookiesResponse Headers Phổ Biến
Content-Type: application/json # Định dạng body response
Cache-Control: max-age=3600 # Chỉ thị caching
ETag: "abc123" # Phiên bản resource
Set-Cookie: session=xyz; HttpOnly; Secure # Đặt cookies
Location: /api/users/123 # URL chuyển hướng hoặc resource mới tạoCookies và Sessions
Cách Cookies Hoạt Động
1. Client gửi request
2. Server trả về với header Set-Cookie
3. Browser lưu cookie
4. Browser gửi cookie với các requests tiếp theo đến cùng domainĐặt Cookies
Set-Cookie: session_id=abc123; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=86400Cookie Attributes
| Attribute | Mô Tả |
|---|---|
Path | URL path nơi cookie được gửi |
HttpOnly | Không thể truy cập qua JavaScript |
Secure | Chỉ gửi qua HTTPS |
SameSite | Bảo vệ CSRF (Strict, Lax, None) |
Max-Age | Thời gian hết hạn (giây) |
HTTPS và TLS/SSL
HTTPS = HTTP + TLS (Transport Layer Security)
Tại Sao Cần HTTPS?
- ✅ Encryption: Dữ liệu không thể bị đọc bởi attacker
- ✅ Authentication: Xác minh danh tính server qua certificate
- ✅ Integrity: Dữ liệu không thể bị sửa đổi trong quá trình truyền
- ✅ SEO: Google xếp hạng cao hơn cho site HTTPS
- ✅ Bắt buộc cho tính năng hiện đại: HTTP/2, Service Workers
HTTP vs HTTPS
| Feature | HTTP | HTTPS |
|---|---|---|
| Port | 80 | 443 |
| Encryption | Không | TLS |
| Bảo mật | Dễ bị MITM | An toàn |
HTTP Caching
Cache-Control Header
Cache-Control: public, max-age=3600, must-revalidate| Directive | Ý Nghĩa |
|---|---|
public | CDN, proxy, browser có thể cache |
private | Chỉ browser có thể cache |
no-cache | Phải revalidate với server trước khi sử dụng |
no-store | Không cache |
max-age=N | Cache trong N giây |
ETag và Conditional Requests
Server gửi ETag:
HTTP/1.1 200 OK
ETag: "abc123"Client validate với If-None-Match:
GET /api/users/1 HTTP/1.1
If-None-Match: "abc123"Server trả về nếu không đổi:
HTTP/1.1 304 Not ModifiedCORS (Cross-Origin Resource Sharing)
CORS kiểm soát domain nào có thể truy cập API của bạn từ browsers.
Same-Origin Policy
Browsers block requests đến origins khác nhau mặc định:
https://frontend.com → https://api.com ❌ Blocked
https://api.com → https://api.com ✅ AllowedCORS Headers
# Response headers
Access-Control-Allow-Origin: https://frontend.example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: truePreflight Requests
Request phức tạp kích hoạt OPTIONS preflight trước:
Browser → OPTIONS /api/users → Server
Browser ← 204 với CORS headers ← Server
Browser → POST /api/users → Server
Browser ← 201 Created ← ServerHTTP/2 Chi Tiết
Tính Năng Chính
1. Binary Framing HTTP/2 sử dụng định dạng binary thay vì text.
2. Multiplexing Nhiều requests/responses trên cùng connection:
Stream 1: Request → ← Response
Stream 3: Request → ← Response
Stream 5: Request → ← Response
(Tất cả trên cùng TCP connection)3. Header Compression (HPACK) Headers được nén và cache.
4. Server Push Server gửi resources trước khi client request.
HTTP/3 và QUIC
Tại Sao HTTP/3?
HTTP/2 vẫn dùng TCP, có vấn đề:
- Head-of-line blocking: Packet mất block tất cả streams
- Connection setup: TCP + TLS handshake chậm
- Connection migration: Đổi IP làm mất connection
QUIC Features
- UDP-based: Không bị TCP head-of-line blocking
- 0-RTT Connection: Có thể gửi data với packet đầu tiên
- Independent Streams: Packet loss ở một stream không ảnh hưởng streams khác
- Connection Migration: Connection tồn tại khi đổi IP (mobile switching)
Debug HTTP
Sử Dụng curl
GET cơ bản:
curl https://api.example.com/usersPOST với JSON:
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name": "John"}'Xem headers:
curl -v https://api.example.com/usersChỉ response headers:
curl -I https://api.example.com/usersBrowser DevTools
- Mở DevTools (F12)
- Vào tab Network
- Thực hiện request
- Click vào request để xem:
- Headers (request và response)
- Preview (response đã format)
- Timing (connection, waiting, download)
Best Practices
API Design
- Sử dụng HTTP methods phù hợp
- Trả về status codes phù hợp
- Định dạng error nhất quán
- Version API của bạn
Security
- Luôn dùng HTTPS trong production
- Set security headers
- Cấu hình CORS đúng cách
- Dùng HttpOnly, Secure, SameSite cho cookies
Performance
- Bật compression (gzip hoặc brotli)
- Set cache headers phù hợp
- Dùng HTTP/2 hoặc HTTP/3 khi có thể
- Giảm thiểu redirects
Tổng Kết
✅ HTTP là giao thức giao tiếp web, dựa trên mô hình request-response
✅ HTTP versions: 1.1 (phổ biến), 2 (multiplexing, binary), 3 (QUIC, UDP-based)
✅ Methods: GET (đọc), POST (tạo), PUT (thay thế), PATCH (cập nhật), DELETE (xóa)
✅ Status codes: 2xx (thành công), 3xx (redirect), 4xx (lỗi client), 5xx (lỗi server)
✅ Headers cung cấp metadata cho requests và responses
✅ HTTPS mã hóa communication sử dụng TLS
✅ Caching sử dụng Cache-Control, ETag, và Last-Modified headers
✅ CORS kiểm soát cross-origin access trong browsers
✅ Debug với curl, Postman, hoặc browser DevTools
Tiếp Theo
Bây giờ bạn đã hiểu HTTP, tiếp tục học:
Xây dựng REST APIs:
- REST API là gì? Hướng dẫn đầy đủ — Thiết kế API theo nguyên tắc REST
- Bắt đầu với Spring Boot — Xây dựng REST APIs với Java
- TypeScript Phase 3: Backend Development — Xây dựng API với TypeScript
Tài liệu hóa APIs:
- API Documentation với OpenAPI/Swagger — Tự động tạo tài liệu tương tác
- Hiểu OpenAPI với FastAPI — OpenAPI trong Python
Tìm hiểu sâu:
- Relational Database Fundamentals — Lưu trữ và truy xuất dữ liệu hiệu quả
- Database Schema Design — Thiết kế data layer
Kết Luận
HTTP là nền tảng của giao tiếp web. Hiểu cách requests và responses hoạt động, ý nghĩa của các status codes, và cách các tính năng như caching và CORS hoạt động sẽ giúp bạn trở thành developer hiệu quả hơn.
Dù bạn đang xây dựng APIs, debug network issues, hay tối ưu performance, kiến thức HTTP từ bài viết này sẽ phục vụ bạn tốt trong suốt sự nghiệp.
Happy coding! 🚀
📬 Đăng ký nhận bản tin
Nhận những bài viết mới nhất qua email mỗi tuần. Không spam, hủy đăng ký bất cứ lúc nào.
Chúng tôi tôn trọng quyền riêng tư của bạn. Hủy đăng ký bất cứ lúc nào.
💬 Comments
Đăng nhập để bình luận
Chúng tôi sẽ không đăng bất cứ điều gì mà không có sự cho phép của bạn.