
JWT là gì?
JWT (JSON Web Token) là một tiêu chuẩn mở được IETF ban hành theo RFC 7519 vào tháng 5 năm 2015, dùng để truyền tải dữ liệu an toàn giữa các bên dưới dạng JSON gọn nhẹ. Trong lập trình web hiện đại, JWT là công cụ phổ biến nhất để xác thực API, triển khai Single Sign-On (SSO) và quản lý phiên đăng nhập cho các ứng dụng SPA, mobile app và microservices.
Điểm mạnh lớn nhất của JWT nằm ở tính chất tự chứa (self-contained): token mang đủ thông tin về người dùng, vai trò và thời hạn hiệu lực, nên server không cần lưu trạng thái phiên trên database. Chính nhờ vậy, JWT giúp hệ thống dễ mở rộng theo chiều ngang, phù hợp với kiến trúc phân tán hiện đại.

Cấu trúc của một JWT
Một JWT hợp lệ gồm ba phần được ngăn cách bởi dấu chấm (.) và mã hóa bằng Base64Url:
xxxxx.yyyyy.zzzzz
| | |
Header Payload Signature
- Header: Chứa thông tin về thuật toán ký và loại token, ví dụ
{"alg": "HS256", "typ": "JWT"}. Các thuật toán phổ biến gồm HS256 (HMAC-SHA256), RS256 (RSA-SHA256), ES256 (ECDSA-P256) và EdDSA. - Payload: Chứa các claims — dữ liệu về người dùng như
sub(subject),exp(thời điểm hết hạn),iat(thời điểm phát hành),iss(issuer) cùng các thông tin tùy chỉnh như id người dùng hay quyền admin. - Signature: Chữ ký số được tạo bằng cách mã hóa phần header và payload với một secret hoặc private key. Chữ ký này đảm bảo token không bị giả mạo hay sửa đổi trên đường truyền.
Quan trọng: payload của JWT chỉ được mã hóa Base64Url chứ không được mã hóa thật sự. Nghĩa là bất kỳ ai giải mã token đều đọc được nội dung bên trong. Vì vậy tuyệt đối không đưa mật khẩu, số thẻ hay dữ liệu nhạy cảm vào payload.

Cách JWT hoạt động trong xác thực
Luồng xác thực với JWT diễn ra như sau:
- Người dùng gửi tên đăng nhập và mật khẩu đến server.
- Server xác thực thông tin, tạo JWT chứa các claims cần thiết và ký token bằng secret hoặc private key.
- Server trả token về cho client, client lưu vào cookie HttpOnly hoặc bộ nhớ.
- Ở mỗi request tiếp theo, client gửi kèm token trong header
Authorization: Bearer <token>. - Server kiểm tra chữ ký, thời hạn và các claims, sau đó cho phép hoặc từ chối truy cập mà không cần truy vấn database.
Với kiến trúc microservices, JWT còn giúp các service xác minh lẫn nhau mà không cần gọi đến một server session tập trung. OpenID Connect (OIDC) cũng sử dụng JWT làm ID Token để xác thực danh tính trong các hệ thống SSO.
Ưu điểm và nhược điểm của JWT
| Ưu điểm | Nhược điểm |
|---|---|
| Kích thước nhỏ gọn, truyền qua URL, header hoặc body đều được | Khó thu hồi token trước khi hết hạn |
| Stateless, server không cần lưu session, dễ mở rộng | Token lớn hơn session ID thông thường |
| Hoạt động tốt trên mọi nền tảng: web, mobile, IoT | Payload có thể đọc được, không bảo mật nội dung |
| Hỗ trợ xác thực chéo miền, phù hợp SSO | Đòi hỏi hiểu đúng về mật mã học và quản lý key |

Các thư viện JWT phổ biến
Tùy vào ngôn ngữ, lập trình viên có thể chọn các thư viện đã được kiểm chứng:
- Node.js:
jsonwebtokencủa Auth0 với hơn 54 triệu lượt tải mỗi tuần, hoặcjose— thư viện hiện đại với hơn 113 triệu lượt tải/tuần nhờ được nhiều framework lớn sử dụng. - Python:
PyJWT(phiên bản 2.13) hoặcpython-jose. - Java:
jjwt(hơn 11 nghìn sao trên GitHub) hoặcnimbus-jose-jwt. - Go:
golang-jwt/jwtphiên bản v5, được cộng đồng Go ưa chuộng. - Express: middleware
express-jwtgiúp bảo vệ route chỉ trong vài dòng mã.
Những lỗi bảo mật cần tránh khi dùng JWT
Theo hướng dẫn của OWASP, các nhóm phát triển thường mắc những sai lầm sau:
- Lưu token trong localStorage: Dễ bị đánh cắp qua lỗ hổng XSS. Nên dùng cookie HttpOnly kèm cờ Secure và SameSite.
- Token sống quá lâu: Nên đặt thời gian hết hạn 15–60 phút và dùng refresh token để gia hạn.
- Không kiểm tra đầy đủ claims: Luôn validate
iss,aud,expvà chữ ký ở phía server. - Chấp nhận thuật toán
none: Đây là lỗ hổng kinh điển — thư viện phải từ chối mọi token khai báo"alg": "none". - Dùng HS256 cho nhiều service: Khi có nhiều service, nên dùng RS256 hoặc ES256 để chia sẻ public key thay vì dùng chung một secret.
Ngoài ra, nên công bố public key tại endpoint /.well-known/jwks.json (JWKS) để các service khác tự xác minh token, đồng thời xây dựng cơ chế thu hồi token như blacklist hoặc kết hợp short-lived token với refresh token.
Kết luận
JWT là giải pháp xác thực mạnh mẽ và linh hoạt cho API hiện đại, nhưng chỉ an toàn khi được triển khai đúng cách. Hãy chọn thuật toán ký phù hợp, giữ secret an toàn, đặt thời gian hết hạn ngắn và luôn validate token ở phía server. Khi hiểu rõ cấu trúc và những cạm bẫy bảo mật, bạn sẽ tận dụng được tối đa sức mạnh của JWT trong mọi dự án web và mobile.
Tham khảo thêm
Để tìm hiểu sâu hơn, bạn có thể đọc tài liệu chính thức tại jwt.io/introduction, bản đặc tả RFC 7519 trên trang IETF và hướng dẫn bảo mật từ OWASP Authentication Cheat Sheet.
