HTTP và HTTPS
DNS cho ta IP, TCP mở kết nối — giờ client và server nói chuyện. Trên web, ngôn ngữ đó là HTTP. Đây là giao thức tầng ứng dụng mà mọi developer đụng tới hằng ngày (API, web), nên hiểu rõ nó rất đáng. Bài này mổ xẻ HTTP và phần "S" (HTTPS).
HTTP là gì
Theo MDN, HTTP (HyperText Transfer Protocol) là giao thức client-server để lấy tài nguyên. Vài đặc tính cốt lõi:
- Client-server, request-response: client gửi request, server trả response. Server không tự gửi khi không được hỏi.
- Stateless (không trạng thái): mỗi request độc lập, server không tự nhớ request trước. (Trạng thái như "đã đăng nhập" được mô phỏng bằng cookie/token — mục cuối.)
- Text-based (tới HTTP/1.1): thông điệp đọc được bằng mắt — đó là lý do ta soi được bằng
curl -v.
Cấu trúc một request và response
Xem một request/response thật bằng curl -v:
curl -v https://example.com
REQUEST (client → server): RESPONSE (server → client):
> GET / HTTP/2 < HTTP/2 200
> Host: example.com < date: Sat, 23 May 2026 ...
> User-Agent: curl/8.9.1 < content-type: text/html
> Accept: */* <
> < <!doctype html>...
(dòng trống = hết header) (dòng trống, rồi tới body)
(> là dòng gửi đi, < là dòng nhận về.) Cấu trúc:
Request gồm:
- Dòng đầu: phương thức (GET) + đường dẫn (/) + phiên bản (HTTP/2).
- Header: thông tin thêm (Host, User-Agent, Accept...).
- Body (tùy chọn): dữ liệu gửi lên, ví dụ với POST.
Response gồm:
- Dòng trạng thái: phiên bản + mã trạng thái (200) + thông điệp.
- Header: content-type, date...
- Body: nội dung (HTML, JSON...).
Phương thức (HTTP methods)
Phương thức cho biết bạn muốn làm gì với tài nguyên:
GET lấy tài nguyên (không thay đổi gì)
POST gửi dữ liệu lên (tạo mới, submit form)
PUT thay thế toàn bộ tài nguyên
PATCH sửa một phần tài nguyên
DELETE xóa tài nguyên
HEAD như GET nhưng chỉ lấy header (không body)
OPTIONS hỏi server hỗ trợ gì (dùng trong CORS)
Đây cũng là nền của REST API — chính các method này ta đã dùng trong series AWS/blog (POST /api/posts, PATCH /api/posts/:id, DELETE...). GET nên an toàn (không đổi dữ liệu); PUT/DELETE nên idempotent (làm nhiều lần kết quả như một lần).
Mã trạng thái (status code)
Mã trạng thái trong response cho biết kết quả. Chia 5 nhóm theo chữ số đầu:
1xx Thông tin 100 Continue, 101 Switching Protocols
2xx Thành công 200 OK, 201 Created, 204 No Content
3xx Chuyển hướng 301 Moved Permanently, 302 Found, 304 Not Modified
4xx Lỗi phía CLIENT 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found
5xx Lỗi phía SERVER 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable
Phân biệt 4xx vs 5xx cực quan trọng khi gỡ lỗi: 4xx = lỗi của phía gọi (sai URL, thiếu quyền, thiếu tham số), 5xx = lỗi của phía server (code lỗi, server quá tải, backend chết). Thấy 404 thì xem lại request mình; thấy 500/502 thì vấn đề ở server.
Ví dụ thật về 3xx: cloudflare.com trả 301 kèm header location: https://www.cloudflare.com/ — bảo trình duyệt chuyển hướng sang địa chỉ mới:
< HTTP/2 301
< location: https://www.cloudflare.com/
Header: thông tin đi kèm
Header là các cặp tên: giá trị mang thông tin điều khiển. Vài cái hay gặp:
Request: Response:
Host: example.com Content-Type: text/html
User-Agent: ... Content-Length: 1256
Accept: application/json Cache-Control: max-age=3600
Authorization: Bearer <token> Set-Cookie: session=...
Content-Type: application/json Location: https://... (cho 3xx)
Host cho phép một IP phục vụ nhiều website (server nhìn Host để biết bạn hỏi site nào — gọi là virtual hosting). Content-Type cho biết kiểu dữ liệu (text/html, application/json). Authorization mang token xác thực API.
HTTP/1.1, 2, 3: ngày càng nhanh
HTTP tiến hóa chủ yếu để giảm độ trễ:
- HTTP/1.1 — text, một request một lúc trên mỗi kết nối (về cơ bản); thêm keep-alive để tái dùng kết nối TCP thay vì mở mới mỗi lần.
- HTTP/2 — nhị phân, multiplexing: nhiều request/response song song trên một kết nối TCP (hết cảnh xếp hàng). Đây là cái
curl -vở trên dùng (using HTTP/2). - HTTP/3 — chạy trên QUIC (trên UDP) thay vì TCP (nhớ Bài 6), tránh được độ trễ bắt tay và "head-of-line blocking" của TCP. Server quảng cáo hỗ trợ qua header
alt-svc.
Bạn ít khi chọn phiên bản thủ công (trình duyệt/thư viện tự thỏa thuận), nhưng biết để hiểu vì sao web ngày càng nhanh, và để đọc đúng khi gỡ lỗi.
HTTPS: HTTP cộng mã hóa
HTTP trần là văn bản rõ — ai chen được vào đường truyền (nhớ ARP spoofing ở Bài 3) đều đọc/sửa được. HTTPS = HTTP chạy bên trong một kênh TLS mã hóa (cổng 443). Nó cho ba đảm bảo:
- Bí mật: nội dung được mã hóa, người giữa đường không đọc được.
- Toàn vẹn: không bị sửa đổi trên đường.
- Xác thực: bạn chắc đang nói chuyện với đúng
example.com(qua chứng chỉ), không phải kẻ giả mạo.
Phần TLS này — bắt tay, chứng chỉ, CA — là chủ đề Bài 9. Điểm cần nhớ giờ: HTTPS không phải giao thức khác, nó là HTTP nhưng gói trong TLS.
Stateless và cookie
Vì HTTP stateless, làm sao website nhớ "bạn đã đăng nhập"? Bằng cookie: server gửi Set-Cookie: session=abc trong response, trình duyệt lưu và tự đính kèm Cookie: session=abc ở mọi request sau. Server nhìn cookie để nhận ra bạn. Token (như Authorization: Bearer ... trong API) cũng cùng ý tưởng. Đây là cách "trạng thái" được xây trên một giao thức vốn không trạng thái.
Tổng kết
HTTP là giao thức client-server, request-response, stateless của web. Request gồm method (GET/POST/PUT/DELETE...) + đường dẫn + header + body; response gồm status code (2xx OK, 3xx chuyển hướng, 4xx lỗi client, 5xx lỗi server) + header + body. Header mang thông tin điều khiển (Host, Content-Type, Authorization...). HTTP tiến hóa 1.1 → 2 (multiplexing) → 3 (QUIC/UDP) để nhanh hơn. HTTPS là HTTP gói trong TLS để bí mật/toàn vẹn/xác thực, và cookie/token mô phỏng trạng thái. curl -v cho bạn soi tất cả.
Chữ "S" trong HTTPS dựa trên TLS — bắt tay mã hóa và chứng chỉ. Bài 9 đào vào đó.