Thuật ngữ JWT là tiêu chuẩn mở quen thuộc với những người làm việc liên quan đến dữ liệu như lập trình viên. Vậy JWT là gì và khi nào nên dùng tiêu chuẩn này? Để có câu trả lời chi tiết, mời bạn cùng CodeGym tìm hiểu qua bài viết!
Nội dung
JWT là gì?
JWT là các ký hiệu viết tắt của từ JSON Web Token, đây là một tiêu chuẩn mở (đáp ứng RFC 7519). JWT giúp người dùng tạo ra chuỗi mã hóa dữ liệu để trao đổi thông tin giữa các hệ thống khác nhau dưới dạng JSON object một cách an toàn và tin cậy.
Các chuỗi thông tin trao đổi được xác minh thông qua chữ ký điện tử sử dụng thuật toán HMAC hoặc cặp khóa public/private key. Nhờ đó, thông tin đáp ứng các tiêu chuẩn RSA hoặc ECDSA về tính bảo mật và an toàn. Nhờ đó, chuỗi thông tin đáp ứng tiêu chuẩn JWT luôn được đánh giá cao về tính bảo vệ, tránh đánh cắp thông tin dữ liệu tối đa.

JWT là các ký hiệu viết tắt của từ JSON Web Token
Để có thể hiểu sâu hơn về chuẩn JWT, hãy cùng CodeGym tìm hiểu ý nghĩa của những thành phần trong thuật ngữ JWT:
Thứ nhất là JSON: JSON (viết đầy đủ là Javascript Object Notation), đây là một kiểu định dạng dữ liệu được sử dụng theo quy luật nhất định, hầu hết những ngôn ngữ lập trình định dạng dữ liệu này đều có thể đọc được. JSON giúp trao đổi dữ liệu ở các web dễ dàng nhờ tiêu chuẩn mở.
Thứ hai là Token: Đây là chữ ký điện tử (chữ ký số), chúng được mã hóa thành những con số khác nhau để tạo thành một dãy số. Token này được tạo ra dưới dạng OTP và chỉ được sử dụng một lần cho một giao dịch.
Nhìn chung, JWT là phương tiện đại diện cho những yêu cầu cần thiết để chuyển giao liên tục giữa Client (máy khách) và Server (máy chủ), nhờ đó xâu chuỗi những mã JWT lại để định dạng bằng JSON.
=>>> Cập nhật nhanh nhất các khoá học lập trình hàng tháng tại CodeGym ở đây.
Các thành phần chính của JWT
JWT gồm 3 thành phần chính: Header, Payload, Signature và chúng được ngăn cách với nhau bằng dấu “.”. Vì vậy, cấu trúc của JWT sẽ theo format sau: “header.payload.signature”.
Header
Header chứa kiểu dữ liệu và các thuật toán giúp mã hóa ra chuỗi JWT một cách hoàn hảo. Header bao gồm 2 phần chính, đó là:
- Typ (Type): Đây là token và được mặc định là một JWT.
- ALG (Algorithm): Được dùng để mã hóa nhanh chóng (thuật toán chữ ký được sử dụng phổ biến như HMAC, SHA256, RSA).

Header chứa kiểu dữ liệu và các thuật toán giúp mã hóa ra chuỗi JWT một cách hoàn hảo
Payload
Payload đóng một vai trò rất quan trọng trong JWT, đây là nơi chứa các nội dung của thông tin (claim) mà người sử dụng muốn truyền đi ở bên trong chuỗi. Các thông tin này góp phần mô tả thực thể một cách đơn giản và nhanh chóng hoặc cũng có thể là các thông tin bổ sung thêm cho phần Header.
Signature
Signature là phần chữ ký bí mật và phần này được tạo ra bởi mã hóa phần Header cùng với phần Payload kết hợp với một chuỗi secret (khóa bí mật). Khi 3 phần này được kết hợp lại với nhau, chúng ta sẽ có một chuỗi JWT hoàn chỉnh nhất. Nhờ đó, JWT đảm bảo có thể trợ giúp hiệu quả cao cho công việc của một người lập trình viên.
=>>> Xem thêm bài viết: Coffee Talk: Vượt Qua Rào Cản Học Lập Trình
Ưu điểm nổi bật của JWT
Trên thực tế, có rất nhiều lý do để JWT được nhiều người sử dụng. Sau đây là một vài lý do nổi bật nhất:
Tính bảo mật cao
JWT nổi bật với tính bảo mật tốt. Người dùng thực hiện đăng nhập vào hệ thống bắt buộc dùng mã JWT cho những yêu cầu tiếp theo. Không chỉ vậy, việc này sẽ giúp cho người dùng thuận tiện hơn trong việc click vào những server, resource và url một cách khá là dễ dàng bởi họ dễ dàng xác nhận quyền truy cập với một JWT duy nhất.
Để tránh tình huống JWT bị đánh cắp và kẻ gian sử dụng, JWT luôn luôn có thời hạn sử dụng ở khoảng thời gian ngắn. Mã JWT sẽ không có giá trị sử dụng nếu ngoài thời gian sử dụng. Tuy nhiên, người dùng cần bảo mật mật mã này để đảm bảo an toàn thông tin tối đa.

JWT có tính bảo mật cao
Dễ dàng truyền đạt và trao đổi thông tin
Cũng bởi đặc tính JWT có độ an toàn cao nên các thành viên dễ dàng trao đổi, nhận dạng nhau theo phần chữ ký. Thông qua đó, người dùng dễ dàng nhận biết được ai là người gửi thông tin, đảm bảo tính chính xác và phòng ngừa tình trạng giả mạo.
Mang lại nhiều lợi ích cho người dùng
JWT mang lại nhiều lợi ích cho người dùng, tiêu biểu là:
- Thuật toán mã hóa HMAC giúp thông tin bảo mật và dễ dàng chia sẻ.
- Quen thuộc với các ngôn ngữ lập trình khi chúng tạo ra một bản đồ trực tiếp hướng đến các đối tượng khác nhau.
- JWT nhỏ gọn hơn nhiều XML khác nhờ được mã hóa một cách rất thông minh.
- Phù hợp với mọi thiết bị, kể cả các thiết bị di động cá nhân.
Ứng dụng của JWT
Xác thực người dùng (Authentication)
Đây là ứng dụng phổ biến nhất của JWT. Thay vì sử dụng Session truyền thống (lưu trữ thông tin trên server), JWT giúp việc xác thực trở nên Stateless (không lưu trạng thái trên server).
Quy trình hoạt động:
-
Đăng nhập: Người dùng gửi
username/passwordlên Server. -
Khởi tạo: Server kiểm tra thông tin, nếu đúng sẽ tạo một JWT (chứa thông tin cơ bản như
userId) và ký bằng một Secret Key riêng biệt. -
Phản hồi: Server gửi token này về cho Client (thông thường lưu ở LocalStorage hoặc HttpOnly Cookie).
-
Truy cập tiếp theo: Với mỗi request sau đó, Client sẽ đính kèm token này vào tiêu đề (Header) của HTTP request:
Authorization: Bearer <token> -
Xác minh: Server chỉ cần giải mã token bằng Secret Key để biết người dùng là ai mà không cần phải truy vấn lại Database.
Lợi ích: Giảm tải cho Database và giúp hệ thống dễ dàng mở rộng (Scalability) vì bất kỳ server nào trong cụm (cluster) cũng có thể xác thực token nếu có Secret Key.
Sau khi đã biết “bạn là ai”, hệ thống cần biết “bạn có quyền làm gì”. JWT cực kỳ hiệu quả trong việc này nhờ phần Payload của nó.
Cách hoạt động:
-
Trong phần Payload của JWT, bạn có thể chèn thêm các thông tin về quyền hạn (Roles/Permissions). Ví dụ:
{ "role": "admin", "permissions": ["edit_post", "delete_user"] }. -
Khi người dùng truy cập vào một API hoặc Route nhạy cảm (ví dụ:
/admin/dashboard), Server sẽ kiểm tra trườngrolengay trong token. -
Nếu
rolelàadmin, quyền truy cập được chấp nhận. Nếu không, Server trả về lỗi403 Forbidden.
Tại sao nên dùng JWT cho việc này?
-
Tốc độ: Server không cần thực hiện thêm các lệnh
JOINphức tạp trong database để kiểm tra quyền của người dùng mỗi khi họ gọi API. -
Tính nhất quán: Quyền hạn đi kèm với token, đảm bảo tính đóng gói thông tin.
SSO (Single Sign-On – Đăng nhập một lần)
SSO là giải pháp cho phép người dùng chỉ cần đăng nhập một lần duy nhất nhưng có thể truy cập vào nhiều dịch vụ/hệ thống con khác nhau trong cùng một hệ sinh thái.
Ví dụ thực tế: Khi bạn đăng nhập vào Google, bạn có thể dùng chung tài khoản đó để vào Gmail, YouTube, Google Drive mà không cần nhập lại mật khẩu cho từng trang.
Cách JWT giải quyết bài toán SSO:
-
Người dùng đăng nhập tại một Identity Provider (IDP) tập trung (ví dụ:
accounts.google.com). -
IDP tạo ra một JWT và trả về cho trình duyệt.
-
Khi người dùng chuyển sang dịch vụ con (ví dụ: YouTube), dịch vụ này sẽ nhận JWT đó.
-
Vì YouTube và IDP dùng chung một cơ chế xác thực hoặc có sự tin tưởng lẫn nhau (Trust), YouTube chỉ cần xác minh chữ ký của JWT để biết người dùng đã đăng nhập thành công.
Giải đáp một số câu hỏi về JWT
Dưới đây là danh sách các câu hỏi thường gặp nhất về JWT (JSON Web Token) được nhiều người quan tâm:
JWT là gì và nó dùng để làm gì?
JWT (JSON Web Token) là một tiêu chuẩn mở (RFC 7519) dùng để truyền tải thông tin an toàn giữa các bên dưới dạng đối tượng JSON. Trong lập trình web, nó thường được dùng để xác thực (Authentication) và ủy quyền (Authorization). Sau khi đăng nhập, server trả về một JWT để client lưu lại và gửi kèm trong các request tiếp theo để chứng minh danh tính.
Cấu trúc của một JWT gồm những phần nào?
Trả lời: Một JWT gồm 3 phần được phân tách bằng dấu chấm (.):
-
Header: Chứa loại token và thuật toán ký (ví dụ: HS256, RS256).
-
Payload: Chứa các thông tin (claims) như ID người dùng, thời gian hết hạn, quyền hạn…
-
Signature: Chữ ký số dùng để xác thực rằng token không bị thay đổi trong quá trình truyền tải.
JWT có bảo mật tuyệt đối không?
Không. Dữ liệu trong phần Payload của JWT chỉ được mã hóa Base64, nghĩa là bất kỳ ai có token cũng có thể giải mã và đọc được thông tin bên trong. Do đó, tuyệt đối không để thông tin nhạy cảm (như mật khẩu) vào Payload. JWT chỉ đảm bảo tính toàn vẹn (không bị sửa đổi) nhờ vào phần Signature.
Nên lưu JWT ở LocalStorage hay HttpOnly Cookie?
Đây là vấn đề gây tranh cãi, nhưng lựa chọn phổ biến là:
-
LocalStorage: Dễ sử dụng nhưng dễ bị tấn công XSS (đánh cắp token bằng script).
-
HttpOnly Cookie: An toàn hơn trước XSS vì JavaScript không thể truy cập được, nhưng cần cấu hình thêm để chống tấn công CSRF.
-
Khuyên dùng: Sử dụng HttpOnly Cookie kèm theo thuộc tính
SameSite=StricthoặcLaxlà phương án bảo mật tốt nhất hiện nay.
Làm sao để đăng xuất hoặc hủy một JWT trước thời hạn?
Vì JWT là stateless (không lưu trạng thái trên server), việc hủy nó khá phức tạp. Có 3 cách phổ biến:
-
Client-side: Chỉ cần xóa token ở phía trình duyệt (người dùng không gửi token nữa).
-
Blacklist: Server lưu các token bị hủy vào một danh sách đen (thường dùng Redis) cho đến khi chúng hết hạn tự nhiên.
-
Short Expiration: Đặt thời gian hết hạn (
exp) cực ngắn và dùng Refresh Token để cấp mới.
Sự khác biệt giữa Access Token và Refresh Token là gì?
- Access Token: Dùng để truy cập tài nguyên, thường có thời hạn ngắn (vài phút đến 1 tiếng) để giảm thiểu rủi ro nếu bị mất.
-
Refresh Token: Dùng để lấy một Access Token mới mà không cần người dùng nhập lại mật khẩu. Nó thường có thời hạn dài (vài ngày đến vài tháng) và được bảo mật kỹ hơn.
Tại sao nên dùng JWT thay vì Session truyền thống?
- Khả năng mở rộng (Scalability): JWT không cần lưu trên server, giúp dễ dàng mở rộng hệ thống (Load balancing) mà không cần đồng bộ database session.
-
Hỗ trợ đa nền tảng: JWT hoạt động tốt trên cả web, ứng dụng mobile và các dịch vụ microservices khác nhau.
Bài viết đã giải đáp các vấn đề về JWT là gì, các thành phần và ưu điểm nổi bật của tiêu chuẩn này. Để được tư vấn thêm về JWT và các thông tin liên quan đến lập trình, bạn vui lòng liên hệ CodeGym.vn, đội ngũ tư vấn viên sẽ hỗ trợ bạn tận tình nhất.
Tham gia ngay các khóa học tại CodeGym với lộ trình đào tạo bài bản, thực chiến giúp bạn hiểu rõ các kiến thức về lập trình, hiểu bản chất JWT là gì và sẵn sàng tham gia vào các đơn vị/doanh nghiệp ngay sau khi kết thúc khóa học. Thời gian học chỉ mất 5-6 tháng với cam kết 100% có việc làm. Hãy trở thành lập trình viên chuyên nghiệp cùng CodeGym ngay thôi!



0 Lời bình