🎫
← Quay lại hướng dẫn

JWT là gì? Hướng dẫn đầy đủ về JSON Web Tokens

· Thẻ: what-is-jwt, jwt-authentication, jwt-guide, api-security, token-based-auth

JWT là gì?

JSON Web Token (JWT) là một tiêu chuẩn mở (RFC 7519) định nghĩa cách truyền thông tin an toàn giữa các bên dưới dạng một đối tượng JSON một cách nhỏ gọn và khép kín. JWT là định dạng token thống trị trong các ứng dụng web hiện đại, được sử dụng cho mọi thứ từ xác thực người dùng, phân quyền API đến trao đổi dữ liệu an toàn giữa các microservice.

Cách xác thực JWT hoạt động

Xác thực JWT tuân theo một mô hình không trạng thái (stateless), loại bỏ nhu cầu lưu trữ phiên phía máy chủ. Hiểu quy trình này là chìa khóa để hiểu tại sao JWT đã trở thành lựa chọn mặc định cho bảo mật API hiện đại.

Quy trình xác thực

  1. Người dùng đăng nhập — Máy khách gửi thông tin xác thực (tên người dùng và mật khẩu) đến máy chủ xác thực.
  2. Máy chủ tạo JWT — Máy chủ xác thực thông tin đăng nhập, tạo một JWT chứa danh tính và quyền của người dùng, ký nó bằng secret hoặc private key, rồi trả về cho máy khách.
  3. Máy khách lưu trữ token — Máy khách lưu trữ JWT, thường là trong localStorage, sessionStorage hoặc một cookie chỉ dùng HTTP (HTTP-only cookie).
  4. Máy khách gửi token kèm theo mỗi yêu cầu — Với mỗi yêu cầu API tiếp theo, máy khách đưa JWT vào header Authorization sử dụng lược đồ Bearer: Authorization: Bearer <token>.
  5. Máy chủ xác minh token — Máy chủ xác minh chữ ký JWT, kiểm tra thời gian hết hạn và trích xuất các claim của người dùng để phân quyền cho yêu cầu.
  6. Không cần tra cứu phiên — Vì JWT chứa tất cả thông tin cần thiết, máy chủ không cần truy vấn cơ sở dữ liệu hoặc bộ đệm để xác định người dùng.

Vì sao điều này quan trọng

Xác thực truyền thống dựa trên phiên lưu trữ ID phiên trong bộ nhớ hoặc cơ sở dữ liệu của máy chủ. Mỗi yêu cầu được xác thực đều cần một lần tra cứu. JWT loại bỏ việc tra cứu này — bản thân token đã chứng minh danh tính của người dùng. Điều này làm cho các hệ thống dựa trên JWT có khả năng mở rộng vốn có, vì bất kỳ máy chủ nào trong cụm đều có thể xác minh token mà không cần trạng thái phiên dùng chung.

JWT so với xác thực dựa trên phiên

| Khía cạnh | Xác thực JWT | Xác thực dựa trên phiên | |--------|--------------------|------------------------------| | Lưu trữ | Phía máy khách (trong token) | Phía máy chủ (trong bộ nhớ hoặc DB) | | Khả năng mở rộng | Không cần kho phiên dùng chung | Cần kho phiên dùng chung giữa các phiên bản | | Đa miền | Hoạt động tự nhiên trên nhiều miền | Khó chia sẻ phiên | | Thân thiện với di động | Có (không cần cookie) | Yêu cầu hỗ trợ cookie | | Thu hồi | Khó (cho đến khi token hết hạn) | Dễ (xóa phiên khỏi kho lưu trữ) | | Kích thước payload | Lớn hơn mỗi yêu cầu (token trong header) | Tối thiểu (chỉ ID phiên) |

Vì sao JWT được sử dụng cho bảo mật API

Các đặc điểm giúp JWT phù hợp cho xác thực cũng khiến nó lý tưởng cho việc bảo mật API.

Không trạng thái và có khả năng mở rộng

Mỗi JWT mang tất cả thông tin máy chủ cần để phân quyền cho một yêu cầu. Không có cơ sở dữ liệu phiên nào để truy vấn, không có bộ đệm nào để kiểm tra, không có trạng thái nào để đồng bộ giữa các máy chủ. Bộ cân bằng tải có thể định tuyến yêu cầu đến bất kỳ phiên bản máy chủ nào mà không cần phối hợp.

Đa miền và đa nguồn gốc

JWT hoạt động tự nhiên trên các miền và nguồn gốc khác nhau. Một token do auth.example.com phát hành có thể được sử dụng để truy cập api.example.comadmin.example.com. Điều này khiến JWT trở thành nền tảng của các hệ thống đăng nhập một lần (SSO).

Phân quyền chi tiết

Payload JWT có thể bao gồm các claim tùy chỉnh cho vai trò, quyền và tư cách thành viên tổ chức:

{
  "sub": "user_abc123",
  "role": "admin",
  "permissions": ["read:users", "write:users", "delete:users"],
  "org_id": "org_xyz789",
  "iat": 1516239022,
  "exp": 1516325422
}

Máy chủ API đọc các claim này trực tiếp từ token mà không cần bất kỳ tra cứu bổ sung nào.

JWT cho đăng nhập một lần (SSO)

Đăng nhập một lần là một trong những trường hợp sử dụng JWT phổ biến nhất. Trong một kiến trúc SSO điển hình:

  1. Người dùng đăng nhập vào nhà cung cấp danh tính (IdP) — chẳng hạn như Auth0, Okta hoặc Keycloak.
  2. IdP phát hành một JWT được ký bằng private key của nó.
  3. Người dùng trình JWT này cho nhiều ứng dụng.
  4. Mỗi ứng dụng xác minh chữ ký bằng public key của IdP.
  5. Mỗi ứng dụng tin tưởng token mà không cần liên lạc với IdP trong mỗi yêu cầu.

Mô hình này cho phép một lần đăng nhập duy nhất cấp quyền truy cập vào hàng chục dịch vụ — email, lưu trữ tệp, quản lý dự án, hệ thống nhân sự — mà mỗi dịch vụ không cần triển khai quy trình đăng nhập riêng.

Các thực hành bảo mật JWT tốt nhất

Mặc dù JWT cung cấp nền tảng vững chắc cho bảo mật API, việc triển khai đúng là điều thiết yếu.

Giữ token có thời gian sống ngắn

Đặt claim exp (hết hạn) với thời lượng ngắn — 15 phút đến 1 giờ cho access token. Sử dụng refresh token có thời gian sống dài hơn (nhiều ngày hoặc nhiều tuần) để lấy access token mới mà không yêu cầu người dùng xác thực lại.

Luôn sử dụng HTTPS

JWT không mã hóa payload của nó. Bất kỳ ai chặn được token đều có thể giải mã và đọc nội dung của nó. Luôn truyền JWT qua HTTPS để ngăn chặn việc bị chặn.

Xác thực mọi thứ

Luôn xác minh chữ ký, kiểm tra rằng token chưa hết hạn, xác nhận aud (audience) khớp với ứng dụng của bạn và từ chối các token có thuật toán không mong đợi.

Lưu trữ token an toàn

Về phía máy khách, hãy lưu trữ JWT trong cookie chỉ dùng HTTP (HTTP-only cookie) khi có thể, hoặc trong bộ nhớ đối với ứng dụng một trang (single-page application). Tránh localStorage cho các token cung cấp quyền truy cập vào dữ liệu nhạy cảm.

Các quan niệm sai lầm phổ biến về JWT

"JWT được mã hóa." — Không. JWT được ký, không được mã hóa. Payload được mã hóa bằng base64url, vốn có thể đảo ngược. JWE (JSON Web Encryption) cung cấp mã hóa, nhưng đó là một đặc tả riêng biệt không được bao trùm bởi JWT tiêu chuẩn.

"JWT ngăn chặn CSRF." — Không tự nó làm được. JWT trong header Authorization có tác dụng, nhưng nếu token nằm trong cookie thì vẫn cần bảo vệ CSRF.

"JWT chỉ dùng cho xác thực." — JWT được sử dụng cho xác thực, nhưng cũng cho trao đổi dữ liệu phân quyền, phiên không trạng thái và chia sẻ thông tin an toàn giữa các dịch vụ.

Giải mã và khám phá JWT trực tuyến

Sử dụng công cụ JWT decoder để kiểm tra bất kỳ JSON Web Token nào. Dán token của bạn và xem ngay header, payload và thuật toán chữ ký đã giải mã. Công cụ giúp bạn hiểu token của mình mang dữ liệu gì và xác minh rằng chúng được cấu trúc đúng.

JWT là gì? Hướng dẫn đầy đủ về JSON Web Tokens - CoolTool