Trả lời nhanh
JWT (JSON Web Token) gồm 3 phần mã hoá Base64URL ngăn bởi dấu chấm: header (thuật toán), payload (dữ liệu như mã người dùng, thời hạn exp) và chữ ký. Header và payload chỉ được mã hoá chứ KHÔNG được mã hoá bí mật, ai có token cũng đọc được; chữ ký mới là thứ chứng minh token không bị sửa.
JWT là gì?
Dán token để xem ngay header và payload dạng JSON dễ đọc, bảng giải thích từng claim chuẩn (iss, sub, aud, exp, iat…), thời điểm phát hành và hết hạn theo giờ Việt Nam, cùng trạng thái còn hạn hay đã hết hạn. Phần kiểm chữ ký dùng WebCrypto của trình duyệt cho HS256/384/512 (nhập secret) và RS, PS, ES (nhập khoá công khai PEM hoặc JWK). Token không bị gửi lên máy chủ nào.

Cách giải mã và kiểm một JWT
- 1
Dán token vào ô “Token JWT”. Có thể dán cả dòng “Bearer eyJ…” từ header Authorization, công cụ tự bỏ chữ Bearer và khoảng trắng.
- 2
Xem header (thuật toán alg, kiểu typ, mã khoá kid) và payload. Bảng “Các claim” giải thích từng trường và đổi iat, nbf, exp sang ngày giờ Việt Nam.
- 3
Dòng “Trạng thái thời hạn” cho biết token còn bao lâu nữa hết hạn, đã hết hạn hay chưa tới lúc dùng được.
- 4
Muốn chắc token không bị sửa, nhập secret (với HS256…) hoặc khoá công khai (với RS256, ES256…) ở phần “Kiểm tra chữ ký”.
Các claim chuẩn trong payload (RFC 7519)
| Claim | Tên đầy đủ | Ý nghĩa |
|---|---|---|
| iss | Issuer | Hệ thống phát hành token, ví dụ https://accounts.google.com |
| sub | Subject | Chủ thể, thường là mã người dùng |
| aud | Audience | Ứng dụng / API được phép nhận token |
| exp | Expiration time | Hết hạn lúc (giây Unix); quá thời điểm này phải từ chối |
| nbf | Not before | Trước thời điểm này chưa được dùng |
| iat | Issued at | Thời điểm phát hành |
| jti | JWT ID | Mã riêng của token, dùng để chống dùng lại |
Thời gian trong JWT tính bằng GIÂY kể từ 1/1/1970 UTC, không phải mili giây như Date.now() của JavaScript.
Các thuật toán ký thường gặp
| alg | Loại khoá | Ai kiểm được chữ ký | Ghi chú |
|---|---|---|---|
| HS256 / HS384 / HS512 | Một secret dùng chung | Chỉ bên giữ secret | Đơn giản, hợp khi một hệ thống vừa phát vừa kiểm token |
| RS256 / RS384 / RS512 | Cặp khoá RSA | Bất kỳ ai có khoá công khai | Phổ biến nhất ở OAuth, OpenID Connect |
| PS256 / PS384 / PS512 | Cặp khoá RSA (RSA-PSS) | Bất kỳ ai có khoá công khai | Phiên bản RSA an toàn hơn về lý thuyết |
| ES256 / ES384 / ES512 | Cặp khoá đường cong elliptic | Bất kỳ ai có khoá công khai | Chữ ký ngắn, nhanh; dùng nhiều ở Apple, Google |
| none | Không có | Không ai | Token không chữ ký; máy chủ phải từ chối |
Vuốt ngang để xem cả bảng →
Ví dụ thực tế
Đăng nhập API bị báo 401
Dán token đang gửi kèm request: nếu dòng trạng thái báo “Đã hết hạn 2 giờ trước”, ứng dụng cần làm mới token (refresh) thay vì sửa mã gọi API.
Xem quyền của người dùng
Nhiều hệ thống đặt vai trò trong payload, ví dụ "role": "admin" hay "scope": "read write". Giải mã để kiểm tra token có đúng quyền trước khi tìm lỗi ở chỗ khác.
Kiểm token Google / Auth0 / Keycloak
Các nhà cung cấp OpenID Connect ký bằng RS256 và công bố khoá công khai dạng JWK ở địa chỉ jwks_uri. Lấy khoá có kid trùng với header, dán vào ô khoá công khai để kiểm chữ ký.
Thử token tự tạo khi viết mã
Bấm “Dùng token mẫu” (ví dụ của jwt.io, secret “your-256-bit-secret”) để xem một token hợp lệ trông thế nào, rồi sửa một ký tự trong payload để thấy chữ ký báo không hợp lệ.
Lỗi thường gặp và cách xử lý
- Tưởng JWT đã được mã hoá bí mật nên đặt mật khẩu, số thẻ vào payload.
- Payload chỉ là Base64URL, ai cũng giải mã được như ở đây. Không đặt dữ liệu nhạy cảm vào JWT; cần bí mật thì dùng JWE.
- Báo “phải có đúng 3 phần”.
- Token bị cắt khi sao chép (thiếu đoạn cuối) hoặc dán thêm ký tự lạ. Sao chép lại nguyên dòng; token 5 phần là JWE đã mã hoá.
- Chữ ký không hợp lệ dù secret đúng.
- Kiểm tra secret có phải dạng Base64 không (nhiều thư viện lưu secret dạng Base64): bật “Secret ở dạng Base64”. Khoảng trắng thừa ở cuối secret cũng làm sai.
- Khoá công khai báo không đúng định dạng.
- Cần PEM bắt đầu bằng -----BEGIN PUBLIC KEY----- hoặc JWK dạng JSON. Chứng chỉ (BEGIN CERTIFICATE) hay khoá PKCS#1 (BEGIN RSA PUBLIC KEY) phải đổi sang SPKI bằng openssl trước.
- Token hết hạn ngay dù vừa tạo.
- exp phải tính bằng giây. Đặt exp = Date.now() + 3600 (mili giây) sẽ sai; dùng Math.floor(Date.now() / 1000) + 3600. Đồng hồ máy chủ lệch giờ cũng gây lỗi này.
- Máy chủ chấp nhận token alg “none”.
- Đây là lỗ hổng nghiêm trọng: kẻ tấn công tự tạo token không chữ ký. Cấu hình thư viện chỉ chấp nhận đúng thuật toán mình dùng.
Giải mã khác kiểm chữ ký thế nào
Giải mã (decode) chỉ là đổi Base64URL về JSON, không cần khoá và không chứng minh gì. Kiểm chữ ký (verify) tính lại chữ ký từ header + payload bằng khoá rồi so với phần thứ ba: khớp thì token đúng là do bên giữ khoá ký và chưa bị sửa một ký tự nào.
Máy chủ luôn phải kiểm chữ ký và thời hạn trước khi tin dữ liệu trong token. Ứng dụng phía trình duyệt có thể chỉ giải mã để hiện tên người dùng, nhưng không được dựa vào đó để cấp quyền.
Về an toàn khi dán token
Mọi xử lý trên trang này diễn ra trong trình duyệt của bạn bằng WebCrypto; token, secret và khoá không được gửi đi. Dù vậy, nên dùng token thử, token đã hết hạn hoặc token của môi trường phát triển. Token đăng nhập còn hạn giống như chìa khoá: ai có được là dùng được phiên đăng nhập đó.
Thuật ngữ
- JWT
- JSON Web Token: chuỗi chứa dữ liệu JSON có chữ ký, dùng cho đăng nhập và phân quyền API.
- JWS / JWE
- JWS là token có chữ ký (đọc được nội dung); JWE là token được mã hoá (không đọc được nếu không có khoá).
- Claim
- Một cặp tên – giá trị trong payload, như sub, exp, role.
- Base64URL
- Biến thể Base64 dùng - và _ thay cho + và /, bỏ dấu = ở cuối, an toàn khi đặt trong URL.
- JWK / JWKS
- Khoá viết dạng JSON; JWKS là danh sách khoá công khai nhà cung cấp công bố để kiểm token.
- kid
- Key ID trong header, cho biết khoá nào trong JWKS đã dùng để ký.
Câu hỏi thường gặp
Giải mã JWT có cần secret không?
Không. Header và payload ai cũng đọc được. Secret hoặc khoá công khai chỉ cần khi kiểm chữ ký.
Token của tôi có bị gửi đi đâu không?
Không. Giải mã và kiểm chữ ký chạy trong trình duyệt của bạn; không có yêu cầu mạng nào chứa token.
Vì sao chữ ký báo không hợp lệ?
Token đã bị sửa, dùng sai secret / khoá, secret cần bật chế độ Base64, hoặc khoá công khai không khớp kid trong header.
Có giải mã được JWE (5 phần) không?
Không, JWE được mã hoá thật và cần khoá giải mã riêng của hệ thống phát hành.
exp hiện giờ Việt Nam có đúng không?
Có. Giá trị gốc là giây Unix theo UTC; công cụ hiện cả giờ Việt Nam (UTC+7) và dạng ISO theo UTC để đối chiếu.
Nên dùng HS256 hay RS256?
HS256 khi một hệ thống vừa phát vừa kiểm token. RS256 / ES256 khi nhiều dịch vụ cần kiểm token mà không được giữ khoá ký, vì họ chỉ cần khoá công khai.
Đánh giá và bình luận
Đang tải…