Công Cụ Nhanh

Giải mã JWT online

Token được giải mã ngay trên trình duyệt, không gửi đi đâu. Dù vậy, đừng dán token đăng nhập còn hạn của hệ thống thật vào bất kỳ trang web nào: ai có token là dùng được phiên đăng nhập đó.

Xử lý ngay trên trình duyệt của bạn. Tệp và dữ liệu không được tải lên máy chủ.

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.

Minh hoạ phong bì đóng dấu sáp đang mở ra ba tờ giấy nhiều màu xếp chồng, bên cạnh là chiếc chìa khoá đồng và kính lúp

Cách giải mã và kiểm một JWT

  1. 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. 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. 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. 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)

ClaimTên đầy đủÝ nghĩa
issIssuerHệ thống phát hành token, ví dụ https://accounts.google.com
subSubjectChủ thể, thường là mã người dùng
audAudienceỨng dụng / API được phép nhận token
expExpiration timeHết hạn lúc (giây Unix); quá thời điểm này phải từ chối
nbfNot beforeTrước thời điểm này chưa được dùng
iatIssued atThời điểm phát hành
jtiJWT IDMã 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

algLoại khoáAi kiểm được chữ kýGhi chú
HS256 / HS384 / HS512Một secret dùng chungChỉ 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 / RS512Cặp khoá RSABất kỳ ai có khoá công khaiPhổ biến nhất ở OAuth, OpenID Connect
PS256 / PS384 / PS512Cặp khoá RSA (RSA-PSS)Bất kỳ ai có khoá công khaiPhiên bản RSA an toàn hơn về lý thuyết
ES256 / ES384 / ES512Cặp khoá đường cong ellipticBất kỳ ai có khoá công khaiChữ ký ngắn, nhanh; dùng nhiều ở Apple, Google
noneKhông cóKhông aiToken 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…