JWT là gì? Hướng dẫn xác thực API cho lập trình viên

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.

JWT token hiển thị ba phần header, payload và signature được mã hóa Base64Url và tô màu phân biệt

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.

Giao diện trang jwt.io debugger với token JWT mẫu và phần xác minh chữ ký HMAC-SHA256

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:

  1. Người dùng gửi tên đăng nhập và mật khẩu đến server.
  2. 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.
  3. Server trả token về cho client, client lưu vào cookie HttpOnly hoặc bộ nhớ.
  4. Ở mỗi request tiếp theo, client gửi kèm token trong header Authorization: Bearer <token>.
  5. 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

Sơ đồ luồng hoạt động JWT giữa ứng dụng client, máy chủ xác thực và API

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: jsonwebtoken của Auth0 với hơn 54 triệu lượt tải mỗi tuần, hoặc jose — 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ặc python-jose.
  • Java: jjwt (hơn 11 nghìn sao trên GitHub) hoặc nimbus-jose-jwt.
  • Go: golang-jwt/jwt phiên bản v5, được cộng đồng Go ưa chuộng.
  • Express: middleware express-jwt giú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, exp và 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.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

pnpm là gì? Trình quản lý package nhanh và tiết kiệm cho Node.js

pnpm là gì? pnpm là trình quản lý package nhanh và tiết kiệm ổ đĩa cho hệ sinh thái Node.js. Khác với npm và Yarn, pnpm lưu trữ các dependency…

Xem thêm

Clean Code là gì? Nguyên tắc viết code sạch

Clean Code hay viết code sạch là triết lý phát triển phần mềm nhấn mạnh việc viết code rõ ràng, dễ đọc và dễ bảo trì. Thuật ngữ này trở…

Xem thêm

Web Scraping với Python: Hướng dẫn thu thập dữ liệu web cho người mới

Web scraping là kỹ thuật tự động tải trang web và trích xuất dữ liệu có cấu trúc như giá sản phẩm, tin tức hay bài đánh giá bằng script,…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất