HTTP và HTTPS

K
Kai··5 min read

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ó HTTP nhưng gói trong TLS.

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 đó.