JWT Decoder

Giải mã / Mã hóa JWT

Giải mã bất kỳ JSON Web Token nào để xem header, payload và chữ ký — hoặc ký token mới với HS256/384/512. Xác minh chữ ký HMAC ngay tại máy. 100% trong trình duyệt của bạn.

Giải mã / Mã hóa JWT — TL;DR

Giải mã bất kỳ JSON Web Token nào để xem header, payload và chữ ký — hoặc ký token mới với HS256/384/512. Xác minh chữ ký HMAC ngay tại máy. 100% trong trình duyệt của bạn.

Không. Toàn bộ công cụ là JavaScript chạy trong trang này. Bạn dán token, việc giải mã diễn ra trong trình duyệt, dữ liệu không rời khỏi tab. Mở DevTools → Network và quan sát — không có yêu cầu nào được gửi đi khi giải mã hay xác minh. Vì vậy hoàn toàn an toàn để dán token thật của khách hàng hay môi trường production.

Nó chứng minh token được ký bởi người nắm giữ secret (HMAC) hoặc khóa riêng (RSA/ECDSA). Nó KHÔNG mã hóa payload — header và payload chỉ là JSON được mã base64url, ai có token đều đọc được. Chữ ký chỉ ngăn việc giả mạo: chỉ cần đổi một byte trong payload thì chữ ký sẽ không khớp nữa.

Một JWT thường mang theo user ID, email, scope, đôi khi tương đương cookie phiên — chính là dữ liệu KHÔNG được dán vào server của người lạ. Bộ giải mã của iKit chạy bằng JavaScript đã được tải sẵn trong tab trình duyệt. Có thể kiểm chứng qua DevTools → Network: không fetch, không XHR, không beacon trong lúc giải mã hay xác minh.

Header

Payload

Chữ ký

Claim tiêu chuẩn


            

Xác minh chữ ký HMAC

Với token HS256/384/512, nhập secret ký để xác minh chữ ký ngay tại máy. Với RS256/ES256 (RSA/ECDSA), hãy dùng thư viện phía server — xác minh khóa công khai cần file PEM mà công cụ này không nhận.

Vì sao chọn iKit JWT Decoder

Cách nhanh nhất để gỡ lỗi JWT — không tải lên, không đăng ký, không có bên thứ ba xen giữa bạn và token.

Ba khung, một thao tác dán

Dán JWT, xem header, payload và chữ ký đã giải mã cạnh nhau. Các claim tiêu chuẩn (iss, sub, aud, exp, iat) được gắn nhãn và hiển thị thời gian rõ ràng.

Xác minh HMAC tại chỗ

Với token HS256/384/512, nhập secret để xác minh chữ ký bằng Web Crypto API của trình duyệt. Secret không bao giờ rời khỏi tab.

Ký token của riêng bạn

Chuyển sang chế độ Mã hóa, chỉnh header và payload dạng JSON, chọn thuật toán, nhập secret, và nhận token đã ký ngay lập tức.

Quyền riêng tư từ thiết kế

Payload của JWT thường chứa user ID, email, đôi khi cả scope — đừng bao giờ dán vào công cụ phía server. Bộ giải mã của iKit chạy bằng JavaScript trong trình duyệt. Có thể kiểm chứng qua DevTools → Network.

Theo dõi hạn dùng

Các claim tiêu chuẩn như exp, nbf, iat được làm nổi với ngày giờ dễ đọc cùng nhãn ĐÃ HẾT HẠN / hợp lệ rõ ràng để bạn biết ngay token còn dùng được hay không.

Chuẩn mở, mã nguồn mở

Xây trên Web Crypto API và bộ phân tích JSON gốc của trình duyệt — cùng thuật toán với OpenSSL, libjwt, jose. Hành vi khớp với mọi thư viện JWT hiện đại.

JWT thực sự được giải mã như thế nào

Một JWT là ba đoạn JSON mã base64url ngăn cách bởi dấu chấm — chỉ vậy thôi.

  1. 1

    Tách theo hai dấu chấm

    Một JWT có dạng aaa.bbb.ccc. Chúng tôi tách theo hai dấu chấm để lấy header, payload và chữ ký đã mã hóa. Nếu không có đúng ba phần thì token bị lỗi định dạng.

  2. 2

    Giải mã base64url từng phần

    Header và payload là JSON UTF-8 mã base64url. Base64URL = Base64 với -/_ thay cho +//= và không có padding. Chúng tôi thay ký tự về dạng gốc rồi atob, sau đó JSON.parse chuỗi kết quả.

  3. 3

    Hiển thị có cấu trúc

    Header cho biết thuật toán (alg: HS256, RS256, v.v.) và loại. Payload chứa các claim — claim tiêu chuẩn (iss, sub, aud, exp, iat, nbf, jti) cộng với các trường tùy chỉnh. Mỗi giá trị được hiển thị trong một mục có nhãn rõ ràng.

  4. 4

    Xác minh (chỉ HMAC)

    Với HS256/384/512, chúng tôi tính lại HMAC của header.payload bằng secret bạn nhập rồi so với chữ ký ở phần thứ ba. Tương đương HMAC(SHA-256, secret, signing_input) mã base64url. Khớp = chữ ký hợp lệ.

Những tác vụ gỡ lỗi JWT thường gặp

Các tình huống thực tế khi bạn cần một bộ giải mã JWT.

Kiểm tra token từ nhà cung cấp xác thực

Auth0, Firebase, Keycloak, AWS Cognito đều trả về JWT sau khi đăng nhập. Dán access_token để xem ứng dụng của bạn thực sự nhận được những claim nào — user ID là gì, có scope nào, hết hạn khi nào?

Gỡ lỗi 401 Unauthorized

API từ chối yêu cầu của bạn? Giải mã token để kiểm tra: đã hết hạn chưa (exp đã qua)? Claim audience (aud) có đúng với API mong đợi không? Issuer (iss) có phải tenant đúng không?

Xác minh chữ ký webhook

Stripe, GitHub Apps, Slack gửi payload webhook được ký dưới dạng JWT. Sau khi nhận, dán vào chế độ Giải mã cùng secret chung để xác nhận yêu cầu thật sự đến từ họ.

Tạo token thử nghiệm

Cần một JWT đã ký mới cho integration test? Chuyển sang chế độ Mã hóa, chỉnh payload (user ID tùy chọn, hạn dùng tùy chọn), chọn HS256 + secret thử nghiệm, có ngay token trong tích tắc. Không cần round-trip qua backend.

Vì sao giải mã JWT tại chỗ lại quan trọng

Một JWT thường mang theo user ID, email, scope, đôi khi tương đương cookie phiên — chính là dữ liệu KHÔNG được dán vào server của người lạ. Bộ giải mã của iKit chạy bằng JavaScript đã được tải sẵn trong tab trình duyệt. Có thể kiểm chứng qua DevTools → Network: không fetch, không XHR, không beacon trong lúc giải mã hay xác minh.

  • Không có yêu cầu mạng nào trong lúc giải mã hay xác minh — kiểm chứng được qua DevTools.
  • Secret bạn nhập để xác minh nằm trong bộ nhớ trình duyệt và bị xóa khi bấm Xóa / tải lại trang.
  • An toàn cho token production, access token của khách hàng và secret webhook.

Hướng dẫn liên quan

Hướng dẫn chi tiết và so sánh công cụ từ blog iKit.

Câu hỏi thường gặp

Có an toàn không? JWT của tôi có bị tải lên không?

Không. Toàn bộ công cụ là JavaScript chạy trong trang này. Bạn dán token, việc giải mã diễn ra trong trình duyệt, dữ liệu không rời khỏi tab. Mở DevTools → Network và quan sát — không có yêu cầu nào được gửi đi khi giải mã hay xác minh. Vì vậy hoàn toàn an toàn để dán token thật của khách hàng hay môi trường production.

Chữ ký JWT thực sự xác minh điều gì?

Nó chứng minh token được ký bởi người nắm giữ secret (HMAC) hoặc khóa riêng (RSA/ECDSA). Nó KHÔNG mã hóa payload — header và payload chỉ là JSON được mã base64url, ai có token đều đọc được. Chữ ký chỉ ngăn việc giả mạo: chỉ cần đổi một byte trong payload thì chữ ký sẽ không khớp nữa.

Vì sao payload giải mã trông ổn nhưng xác minh lại thất bại?

Ba nguyên nhân thường gặp: (1) sai secret — secret của JWT phân biệt hoa thường và bất kỳ khoảng trắng thừa nào cũng làm hỏng xác minh. (2) Lệch thuật toán — header ghi HS256 nhưng secret ban đầu lại được dùng với HS512. (3) Token bị sửa sau khi ký — chỉ một byte cũng làm hỏng chữ ký. Hãy kiểm tra header.alg có khớp với mong đợi của bạn không.

Còn RS256, ES256 và các thuật toán khóa công khai khác thì sao?

iKit hiện chỉ hỗ trợ xác minh HMAC (HS256/384/512). RS256 và ES256 dùng mã hóa khóa công khai — việc xác minh cần khóa công khai của bên phát hành ở dạng PEM, đòi hỏi giao diện phức tạp hơn. Hiện tại việc giải mã vẫn hoạt động (header/payload/signature hiển thị đúng), nhưng nút Xác minh sẽ báo không hỗ trợ. Tính năng xác minh RSA/ECDSA đã nằm trong kế hoạch.

Công cụ này khác gì với jwt.io?

Cùng ý tưởng, mặc định khác nhau. Bộ giải mã của iKit chạy hoàn toàn trong trình duyệt (jwt.io cũng vậy, nhưng mã của iKit có thể xem qua view-source và tên miền của chúng tôi không có theo dõi từ bên thứ ba). Chúng tôi thêm nhãn ĐÃ HẾT HẠN / hợp lệ rõ ràng cho claim exp, ghi chú claim có cấu trúc (iat / nbf / iss / sub / aud / jti hiển thị thành các hàng dễ đọc), và nút sao chép toàn bộ kết quả giải mã để bạn dán vào báo cáo lỗi.