JWT là gì? Giải thích chi tiết về JSON Web Token từ A–Z
Lê Đình Đài

JWT là gì? Giải thích chi tiết về JSON Web Token từ A–Z
JWT (JSON Web Token) là một chuẩn token dùng để xác thực và phân quyền người dùng theo mô hình stateless trong các hệ thống web và API hiện đại. Trong bối cảnh các ứng dụng web, mobile app và hệ thống API ngày càng mở rộng, việc xác thực người dùng và kiểm soát quyền truy cập đóng vai trò then chốt trong bảo mật hệ thống. Các mô hình xác thực dựa trên session truyền thống dần bộc lộ hạn chế khi triển khai ở quy mô lớn hoặc trong kiến trúc microservices. Vì vậy, JSON Web Token (JWT) ra đời như một giải pháp xác thực hiện đại, linh hoạt và dễ mở rộng. Thông qua bài viết này, DinhDai.Tech sẽ cùng bạn tìm hiểu JWT từ những khái niệm cơ bản đến cách thức hoạt động và ứng dụng thực tế, giúp bạn hiểu rõ và sử dụng JWT hiệu quả hơn trong các hệ thống hiện đại.
I. JWT là gì? Những khái niệm cơ bản cần biết
1. JWT là gì?

Điểm đặc biệt của JWT là server có thể xác minh nội dung token mà không cần truy vấn hay lưu trữ trạng thái phiên đăng nhập. Điều này giúp JWT trở thành một giải pháp xác thực hiệu quả cho các hệ thống hiện đại, nơi yêu cầu cao về hiệu suất, khả năng mở rộng và tính linh hoạt, đặc biệt là trong các ứng dụng web, mobile app và kiến trúc microservices.
2. JWT Token là gì?
JWT token là chuỗi token được server tạo ra sau khi người dùng đăng nhập hoặc xác thực thành công. Token này đóng vai trò như một "giấy thông hành", đại diện cho danh tính người dùng cũng như các quyền mà họ được phép truy cập trong hệ thống.
Sau khi nhận JWT token, client (trình duyệt, ứng dụng di động hoặc ứng dụng bên thứ ba) sẽ lưu trữ token này và tự động gửi kèm trong mỗi request tiếp theo, thường thông qua HTTP Header. Nhờ đó, server có thể xác định người dùng là ai và có đủ quyền truy cập tài nguyên hay không mà không cần thực hiện lại quá trình đăng nhập.
3. Ý nghĩa của từng thành phần trong tên JWT

JSON là gì?
JSON (JavaScript Object Notation) là một định dạng dữ liệu phổ biến, có cấu trúc rõ ràng, dễ đọc và dễ xử lý. Nhờ tính đơn giản và khả năng tương thích cao với hầu hết các ngôn ngữ lập trình, JSON được sử dụng rộng rãi trong việc trao đổi dữ liệu giữa client và server. JWT sử dụng JSON để biểu diễn thông tin bên trong token, giúp việc xử lý và mở rộng dữ liệu trở nên thuận tiện hơn.
Web là gì?
Từ "Web" trong JSON Web Token cho thấy JWT được thiết kế tối ưu cho môi trường web và các hệ thống giao tiếp qua giao thức HTTP/HTTPS. JWT có thể được sử dụng trong các ứng dụng web truyền thống, RESTful API, hệ thống phân tán và cả các nền tảng đa thiết bị, nơi việc xác thực cần diễn ra nhanh chóng và an toàn.
Token là gì?
Token là một chuỗi ký tự được sử dụng để đại diện cho danh tính hoặc quyền truy cập của một người dùng hay hệ thống. Không giống như các token ngẫu nhiên thông thường, JWT token chứa dữ liệu có cấu trúc và được ký số, cho phép server xác minh thông tin mà không cần truy xuất dữ liệu từ cơ sở dữ liệu trong mỗi request.
4. JWT và mô hình Stateless là gì?
JWT hoạt động dựa trên mô hình stateless, tức là server không cần lưu lại bất kỳ thông tin phiên đăng nhập nào của người dùng. Mỗi request từ client đều mang theo JWT token, và server chỉ cần kiểm tra chữ ký cũng như nội dung token để xác thực người dùng.
Cách tiếp cận này giúp giảm tải cho hệ thống, loại bỏ sự phụ thuộc vào session lưu trữ phía server và tăng khả năng mở rộng khi số lượng người dùng tăng cao. Chính vì vậy, JWT đặc biệt phù hợp với các hệ thống phân tán, microservices và các ứng dụng cần mở rộng linh hoạt theo thời gian.
II. Cấu trúc của JSON Web Token (JWT)
Để khám phá cấu trúc chi tiết của JWT, từ Header, Payload đến Signature, hãy cùng DinhDai.Tech tìm hiểu để thấy cách mỗi phần góp phần đảm bảo tính toàn vẹn và bảo mật cho dữ liệu trong các hệ thống web và API hiện đại. 
1. Cấu trúc tổng quát của JWT Token
Một JWT token về bản chất là một chuỗi ký tự ngắn gọn, bao gồm ba phần riêng biệt được nối với nhau bằng dấu chấm (.). Cấu trúc tổng quát của JWT thường có dạng:
Header.Payload.Signature
Ba thành phần này lần lượt đảm nhiệm những vai trò khác nhau trong việc mô tả thông tin, xác thực và bảo vệ dữ liệu. Trước khi được ghép lại thành một token hoàn chỉnh, mỗi phần đều được mã hóa theo chuẩn Base64URL, giúp JWT có thể dễ dàng truyền tải qua HTTP Header hoặc URL mà không gặp vấn đề về ký tự đặc biệt.
2. Header trong JWT là gì?
Header là phần đầu tiên của JWT, có nhiệm vụ mô tả các thông tin liên quan đến token và cách thức mà token này được ký. Cụ thể, Header cho biết loại token đang được sử dụng và thuật toán mã hóa được áp dụng để tạo chữ ký.
Nội dung trong Header
Thông thường, Header được biểu diễn dưới dạng một đối tượng JSON đơn giản, bao gồm các trường phổ biến như sau:
{
"alg": "HS256",
"typ": "JWT"
}
Trong đó, typ cho biết đây là một JSON Web Token, còn alg xác định thuật toán được sử dụng để ký token. Sau khi được mã hóa Base64URL, phần Header này sẽ trở thành một đoạn chuỗi gọn nhẹ trong JWT.
Thuật toán ký phổ biến
JWT hỗ trợ nhiều thuật toán ký khác nhau, tùy thuộc vào nhu cầu bảo mật và kiến trúc hệ thống. Một số thuật toán được sử dụng phổ biến gồm:
- HS256 (HMAC SHA-256): sử dụng khóa bí mật chung giữa server tạo token và server xác minh token.
- RS256 (RSA SHA-256): sử dụng cặp khóa public/private, phù hợp với các hệ thống phân tán hoặc nhiều service cùng xác thực JWT.
Trường typ và alg
- typ (Type): xác định loại token, thường là JWT.
- alg (Algorithm): chỉ định thuật toán ký, đóng vai trò quan trọng trong quá trình tạo và xác minh chữ ký của token.
3. Payload trong JWT là gì?
Payload là phần trung tâm của JWT, nơi chứa các claims – những thông tin mà hệ thống muốn truyền tải giữa các bên. Payload phản ánh nội dung chính của token và thường liên quan trực tiếp đến người dùng hoặc quyền truy cập trong hệ thống.
Payload chứa thông tin gì?
Payload có thể bao gồm nhiều loại dữ liệu khác nhau, phổ biến nhất là:
- Thông tin định danh người dùng (user ID, username, email, …)
- Các quyền hoặc vai trò truy cập (role, permission)
- Thời gian hiệu lực của token như thời điểm phát hành và thời điểm hết hạn
Payload có được mã hóa không?
Một điểm quan trọng cần lưu ý là Payload không được mã hóa, mà chỉ được encode bằng Base64URL. Điều này có nghĩa là bất kỳ ai có JWT đều có thể giải mã và đọc nội dung payload. Vì vậy, các thông tin nhạy cảm như mật khẩu, số thẻ ngân hàng hay dữ liệu bí mật tuyệt đối không nên được lưu trữ trong payload của JWT.
Các loại Claims trong JWT
JWT phân chia claims thành nhiều nhóm khác nhau để dễ quản lý và sử dụng:
- Registered Claims: là các claim được định nghĩa sẵn trong tiêu chuẩn JWT như iat (thời điểm phát hành), exp (thời điểm hết hạn), iss (đơn vị phát hành) và sub (chủ thể của token).
- Public Claims: là các claim có thể được định nghĩa công khai và sử dụng chung giữa nhiều hệ thống, tránh trùng lặp ý nghĩa.
- Private Claims: là các claim do nhà phát triển tự định nghĩa để phục vụ cho logic riêng của ứng dụng.
4. Signature trong JWT là gì?
Signature là phần cuối cùng và cũng là thành phần quan trọng nhất để đảm bảo tính toàn vẹn và độ tin cậy của JWT. Chữ ký này giúp server phát hiện xem token có bị thay đổi trong quá trình truyền tải hay không.
Cách tạo Signature
Signature được tạo ra bằng cách kết hợp Header đã mã hóa, Payload đã mã hóa cùng với secret key hoặc private key, sau đó áp dụng thuật toán ký đã được chỉ định trong Header. Kết quả của quá trình này chính là chữ ký được gắn vào cuối JWT.
Vai trò của secret key / private key
Khóa bí mật (đối với HS256) hoặc private key (đối với RS256) đóng vai trò cốt lõi trong việc ký và xác minh JWT. Chỉ những hệ thống sở hữu khóa hợp lệ mới có thể tạo hoặc kiểm tra chữ ký của token, từ đó đảm bảo tính an toàn trong quá trình xác thực.
Signature giúp JWT an toàn như thế nào?
Khi server nhận được JWT từ client, nó sẽ tự tạo lại chữ ký dựa trên header, payload và khóa tương ứng. Nếu payload hoặc header bị chỉnh sửa dù chỉ một ký tự, chữ ký mới tạo ra sẽ không trùng khớp với signature ban đầu và token sẽ ngay lập tức bị từ chối. Đây chính là cơ chế giúp JWT phát hiện và ngăn chặn hành vi giả mạo dữ liệu.
III. JWT hoạt động như thế nào và khi nào nên sử dụng?

1. JWT Authentication – Quy trình xác thực JWT
Cơ chế xác thực bằng JWT được thiết kế theo hướng đơn giản nhưng hiệu quả, giúp hệ thống nhận diện người dùng mà không cần lưu trạng thái phiên đăng nhập. Quy trình này thường bắt đầu khi người dùng thực hiện đăng nhập vào hệ thống bằng cách gửi thông tin xác thực như tên đăng nhập và mật khẩu từ phía client lên server.
Sau khi nhận được yêu cầu, server tiến hành kiểm tra tính hợp lệ của thông tin đăng nhập. Nếu thông tin chính xác, server sẽ tạo và phát hành một JWT token, trong đó chứa các thông tin cần thiết như định danh người dùng, quyền truy cập và thời gian hiệu lực. Token này sau đó được trả về cho client và lưu trữ tại phía người dùng.
Ở các request tiếp theo, client không cần gửi lại thông tin đăng nhập mà chỉ cần đính kèm JWT token trong HTTP Header, thường dưới dạng:
Authorization: Bearer <token>
Khi server nhận được request, nó sẽ tiến hành xác minh chữ ký và các claims trong token. Nếu JWT còn hiệu lực và chữ ký hợp lệ, server cho phép người dùng truy cập vào tài nguyên được bảo vệ. Nhờ cơ chế này, mỗi request đều được xác thực độc lập mà không cần dựa vào session lưu trữ phía server.
2. JWT decode
JWT decode là gì?
JWT decode là quá trình giải mã phần Header và Payload của token để đọc các thông tin được chứa bên trong. Do các phần này chỉ được encode bằng Base64URL, việc decode JWT khá đơn giản và có thể thực hiện dễ dàng bằng nhiều công cụ hoặc thư viện khác nhau.
Decode JWT có cần secret key không?
Việc decode JWT không yêu cầu secret key hoặc private key, bởi đây chỉ là thao tác đọc dữ liệu. Tuy nhiên, để xác minh tính hợp lệ của token và đảm bảo dữ liệu không bị thay đổi, quá trình verify chữ ký mới cần đến khóa bí mật tương ứng.
Phân biệt decode JWT và verify JWT
Decode JWT và verify JWT là hai khái niệm hoàn toàn khác nhau. Decode chỉ giúp hiển thị nội dung header và payload, trong khi verify JWT là bước kiểm tra chữ ký, thời gian hiệu lực và các claim quan trọng để đảm bảo token chưa bị giả mạo. Một token có thể decode thành công nhưng vẫn không hợp lệ nếu chữ ký hoặc thời gian hết hạn không đúng.
Có nên sử dụng các tool decode JWT online?
Các công cụ decode JWT online rất tiện lợi trong quá trình học tập hoặc debug, tuy nhiên chỉ nên sử dụng với token thử nghiệm hoặc token giả lập. Việc đưa JWT thật của hệ thống lên các nền tảng bên thứ ba có thể tiềm ẩn rủi ro lộ thông tin và ảnh hưởng đến bảo mật.
3. JWT được sử dụng trong những trường hợp nào?

Bên cạnh đó, còn được dùng cho Authorization, giúp kiểm soát quyền truy cập tài nguyên dựa trên các claim về vai trò hoặc quyền hạn của người dùng. Ngoài ra, JWT cũng rất phù hợp cho việc trao đổi dữ liệu an toàn giữa các hệ thống, đặc biệt trong môi trường microservices hoặc khi các service cần giao tiếp với nhau mà không phụ thuộc vào trạng thái lưu trữ chung.
4. So sánh Session và JWT
Khi đặt Session và JWT lên bàn cân so sánh, có thể thấy mỗi phương pháp đều có ưu và nhược điểm riêng. Session yêu cầu server lưu trữ trạng thái đăng nhập, khiến hệ thống khó mở rộng khi số lượng người dùng tăng cao. Ngược lại, JWT hoạt động theo mô hình stateless, giúp giảm tải cho server và tăng khả năng mở rộng.
Trong các hệ thống monolithic nhỏ, session vẫn có thể là lựa chọn phù hợp. Tuy nhiên, với các ứng dụng phân tán, microservices hoặc cần phục vụ trên nhiều nền tảng, JWT tỏ ra vượt trội nhờ tính linh hoạt, hiệu suất và khả năng tích hợp dễ dàng.
IV. Ưu điểm và hạn chế của JWT
1. Ưu điểm của JWT
Một trong những ưu điểm lớn nhất là không cần lưu session trên server. Nhờ hoạt động theo mô hình stateless, mỗi request đều mang theo đầy đủ thông tin xác thực, giúp server không phải lưu trữ hay truy xuất dữ liệu phiên đăng nhập. Điều này giúp hệ thống giảm tải tài nguyên, đồng thời cải thiện khả năng mở rộng khi số lượng người dùng tăng lên.
Bên cạnh đó, JWT có kích thước nhỏ gọn và sử dụng định dạng JSON quen thuộc, dễ dàng truyền tải qua HTTP header mà không gây ảnh hưởng nhiều đến hiệu suất mạng. Việc sử dụng Base64URL encoding giúp token hoạt động tốt trong môi trường web và API mà không gặp vấn đề về ký tự đặc biệt.
Đặc biệt phù hợp với các hệ thống API và kiến trúc microservices. Trong mô hình này, nhiều service có thể xác thực người dùng chỉ dựa trên token mà không cần chia sẻ trạng thái hoặc kết nối tới cùng một kho lưu trữ session. Điều này giúp hệ thống linh hoạt hơn, dễ triển khai và thuận tiện khi mở rộng hoặc tách dịch vụ.
2. Hạn chế và rủi ro khi sử dụng JWT
Dù có nhiều ưu điểm, JWT vẫn tồn tại một số hạn chế nhất định. Một trong những vấn đề phổ biến nhất là khó thu hồi token trước khi hết hạn. Khi JWT đã được phát hành, server không thể chủ động vô hiệu hóa token đó trừ khi áp dụng các cơ chế bổ sung như blacklist hoặc rút ngắn thời gian sống của token. Điều này có thể trở thành rủi ro nếu token bị lộ.
Ngoài ra, payload trong JWT không được mã hóa, mà chỉ được encode. Điều này đồng nghĩa với việc bất kỳ ai có token đều có thể decode và đọc được nội dung bên trong. Vì vậy, JWT không phù hợp để lưu trữ các thông tin nhạy cảm như mật khẩu, số thẻ hay dữ liệu cá nhân quan trọng.
Một rủi ro khác nằm ở việc quản lý secret key hoặc private key. Nếu khóa bí mật bị lộ, toàn bộ hệ thống xác thực dựa trên JWT có thể bị ảnh hưởng nghiêm trọng. Do đó, secret key cần được bảo vệ cẩn thận, lưu trữ an toàn và thay đổi định kỳ để giảm thiểu nguy cơ tấn công.
V. Những sai lầm phổ biến khi dùng JWT

Nhiều hệ thống cũng mắc lỗi khi phát hành JWT mà không thiết lập thời hạn hết hạn (exp). Token không có thời gian sống rõ ràng có thể tồn tại vĩnh viễn, tạo ra lỗ hổng bảo mật nghiêm trọng nếu bị lộ hoặc bị sử dụng trái phép trong thời gian dài.
Bên cạnh đó, việc lưu JWT trong localStorage của trình duyệt cũng tiềm ẩn rủi ro bảo mật, đặc biệt là các cuộc tấn công XSS. Khi script độc hại được chèn vào ứng dụng, token có thể bị đánh cắp dễ dàng. Trong nhiều trường hợp, việc sử dụng HttpOnly cookie kết hợp với các biện pháp bảo mật khác sẽ an toàn hơn.
VI. Ứng dụng của JWT
1. Refresh Token JWT là gì?
Trong các hệ thống sử dụng JWT, access token thường được thiết kế với thời gian sống ngắn để giảm rủi ro bảo mật. Tuy nhiên, việc yêu cầu người dùng đăng nhập lại liên tục sẽ gây ảnh hưởng đến trải nghiệm. Đây chính là lý do refresh token ra đời.
Refresh token là một token có thời gian hiệu lực dài hơn, được sử dụng với mục đích cấp lại access token mới khi access token cũ đã hết hạn, mà không cần người dùng phải đăng nhập lại. Thông thường, refresh token sẽ được lưu trữ an toàn hơn (ví dụ trong HttpOnly cookie hoặc database phía server).
Về cách thức hoạt động, khi access token hết hạn, client sẽ gửi refresh token lên server. Server kiểm tra tính hợp lệ của refresh token, nếu hợp lệ sẽ phát hành một access token mới và trả về cho client. Cơ chế này giúp cân bằng giữa bảo mật và trải nghiệm người dùng, đồng thời hạn chế rủi ro nếu access token bị lộ.
2. IAT JWT là gì?
IAT (Issued At) là một registered claim trong JWT, dùng để xác định thời điểm token được phát hành. Thông tin này thường được biểu diễn dưới dạng timestamp và đóng vai trò quan trọng trong việc quản lý vòng đời của token.
Trong thực tế, iat thường được sử dụng kết hợp với các claim khác như exp (expiration time) để kiểm soát thời gian tồn tại của JWT. Nhờ đó, hệ thống có thể xác định token đã được tạo từ khi nào, có còn hợp lệ hay không, hoặc có cần buộc người dùng xác thực lại trong những tình huống nhạy cảm như thay đổi mật khẩu hay cập nhật quyền truy cập.
Việc tận dụng iat giúp tăng cường bảo mật và mang lại khả năng kiểm soát linh hoạt hơn đối với các phiên đăng nhập dựa trên JWT.
3. Passport JWT là gì?
Passport JWT là một chiến lược xác thực dựa trên JWT, được cung cấp bởi Passport.js, một middleware phổ biến trong hệ sinh thái Node.js. Passport hỗ trợ nhiều phương thức xác thực khác nhau và JWT là một trong những lựa chọn được sử dụng rộng rãi nhất.
Khi sử dụng Passport với JWT, server sẽ cấu hình một strategy để trích xuất token từ request (thường là từ header Authorization), sau đó xác minh chữ ký và payload của JWT Nếu token hợp lệ, thông tin người dùng sẽ được gắn vào request và cho phép truy cập tài nguyên.
Ưu điểm của Passport JWT nằm ở việc dễ tích hợp, có sẵn nhiều thư viện hỗ trợ và phù hợp cho các ứng dụng Node.js xây dựng theo mô hình API hoặc microservices.
4. JWT Spring là gì?
Trong hệ sinh thái Java, JWT thường được sử dụng phổ biến trong các ứng dụng Spring Boot để bảo vệ API. JWT giúp thay thế cơ chế session truyền thống, cho phép xác thực và phân quyền người dùng một cách stateless, phù hợp với các hệ thống backend hiện đại.
Trong Spring Boot, JWT thường được dùng để bảo vệ các endpoint API, đảm bảo chỉ những request mang token hợp lệ mới có thể truy cập tài nguyên. Việc này đặc biệt hữu ích khi xây dựng RESTful API hoặc hệ thống frontend – backend tách biệt.
Khi kết hợp với Spring Security, developer có thể triển khai các filter để kiểm tra token trong mỗi request, xác minh chữ ký, kiểm tra claims và phân quyền người dùng dựa trên role hoặc authority. Cách tiếp cận này giúp hệ thống vừa an toàn, vừa dễ mở rộng và bảo trì.
5. JWT secret key là gì?
JWT secret key là khóa bí mật được sử dụng để ký và xác minh token khi áp dụng các thuật toán đối xứng như HS256. Đây là thành phần cốt lõi quyết định mức độ an toàn của toàn bộ cơ chế xác thực dựa trên JWT.
Secret key đóng vai trò đảm bảo rằng chỉ server hợp lệ mới có thể phát hành và xác minh JWT. Nếu khóa này bị lộ, kẻ tấn công có thể tạo ra các token giả mạo và truy cập trái phép vào hệ thống.
Do đó, secret key cần được quản lý chặt chẽ, không hard-code trực tiếp trong mã nguồn, nên lưu trữ trong biến môi trường hoặc hệ thống quản lý bí mật chuyên dụng. Việc xoay vòng (rotate) secret key định kỳ cũng là một biện pháp quan trọng để tăng cường bảo mật cho hệ thống.
❓ Câu hỏi thường gặp
5 câu hỏi
Kết luận
JWT đang ngày càng trở thành "trụ cột" trong các hệ thống xác thực hiện đại. Hiểu rõ JWT là gì, cách thức hoạt động và các tình huống áp dụng sẽ giúp bạn thiết kế hệ thống an toàn, linh hoạt và dễ mở rộng. Thông qua bài viết này, DinhDai.Tech mong rằng sẽ cho bạn một cái nhìn toàn diện về JSON Web Token, từ kiến thức cơ bản đến cách triển khai thực tế, làm nền tảng vững chắc để áp dụng JWT hiệu quả trong các dự án tương lai.

Lê Đình Đài
- Kinh nghiệm 5 năm vận hành Shopee & TikTok Shop
- Xây shop thời trang nữ từ 0đ lên doanh thu 5 tỷ/tháng
Founder của dinhdai.tech - Nơi chia sẻ kiến thức, công cụ AI miễn phí và giải pháp tối ưu cho seller. Sứ mệnh của tôi là giúp mọi người kinh doanh hiệu quả hơn với công nghệ.