Giải mã JWT

Dán JSON Web Token để xem header và payload dưới dạng JSON đã định dạng, các mốc thời gian exp, iat và nbf ở dạng ngày giờ, và biết token đã hết hạn hay chưa. Bạn có thể xác minh chữ ký ngay trên máy bằng khóa bí mật hoặc khóa công khai.

Phần đầu (Header)

Phần thân (Payload)

Các claim

Chữ ký (Signature)

Xác minh chữ ký

Chạy hoàn toàn trong trình duyệt của bạn. Không có gì được tải lên.

Cách sử dụng

  1. Dán toàn bộ token: ba phần Base64URL được phân tách bằng dấu chấm.
  2. Xem Phần đầu (Header) và Phần thân (Payload) đã giải mã. Các claim exp, iat và nbf được hiển thị dưới dạng ngày giờ, kèm cảnh báo khi token đã hết hạn hoặc chưa có hiệu lực.
  3. Để xác minh chữ ký, hãy nhập khóa bí mật dùng chung vào ô Khóa bí mật cho HS256, HS384 hoặc HS512, hoặc dán khóa công khai PEM vào ô Khóa công khai (PEM, SPKI) cho các thuật toán RS, PS hoặc ES.
  4. Kiểm tra xem các claim về bên phát hành, đối tượng nhận và chủ thể có khớp với những gì ứng dụng của bạn mong đợi hay không.

Cấu trúc của một JWT

Một JSON Web Token (RFC 7519) gồm ba phần được phân tách bằng dấu chấm: header.payload.signature. Header và payload là các đối tượng JSON được mã hóa thành Base64URL không có phần đệm, đó là lý do token hầu như luôn bắt đầu bằng eyJ, dạng mã hóa của chuỗi mở đầu {". Chữ ký được tính trên hai phần đầu, đúng như chúng xuất hiện trong token.

  • Header: thuật toán ký trong alg, thường có "typ": "JWT" và hay kèm theo kid để chỉ định khóa.
  • Payload: các claim, chẳng hạn người dùng là ai, ai đã phát hành token và khi nào token hết hạn.
  • Chữ ký (signature): chữ ký HMAC, RSA hoặc ECDSA, chứng minh rằng header và payload chưa bị thay đổi.

Token có năm phần là một JWE đã được mã hóa bảo mật; không thể đọc nội dung của nó nếu không có khóa giải mã.

Các claim đã đăng ký

ClaimTênÝ nghĩa
issIssuer (bên phát hành)Bên đã tạo và ký token
subSubject (chủ thể)Đối tượng mà token nói đến, thường là ID người dùng
audAudience (đối tượng nhận)Dịch vụ mà token dành cho
expExpiration time (thời điểm hết hạn)Sau thời điểm này, token phải bị từ chối
nbfNot before (hiệu lực từ)Trước thời điểm này, token phải bị từ chối
iatIssued at (thời điểm phát hành)Thời điểm token được tạo
jtiJWT IDĐịnh danh duy nhất, dùng để phát hiện tấn công phát lại

Các mốc thời gian là giá trị NumericDate: số giây tính từ ngày 1 tháng 1 năm 1970 UTC, không phải mili giây. Công cụ hiển thị chúng dưới dạng ngày giờ dễ đọc và so sánh với đồng hồ trên thiết bị của bạn.

Giải mã không đồng nghĩa với xác minh

Ai cũng có thể giải mã JWT, vì payload chỉ được mã hóa dạng Base64URL chứ không được mã hóa bảo mật; đừng bao giờ đặt mật khẩu hay thông tin bí mật khác vào đó. Độ tin cậy chỉ đến từ việc kiểm tra chữ ký bằng đúng khóa, và máy chủ chấp nhận token còn nên:

  • chỉ cho phép thuật toán mà nó mong đợi và từ chối "alg": "none", giá trị đánh dấu token không có chữ ký;
  • không bao giờ để header của token quyết định giữa HMAC và RSA, nếu không kẻ tấn công có thể ký một token giả mạo bằng chính khóa công khai của bạn, dùng nó làm khóa bí mật HMAC;
  • kiểm tra exp, nbf, iss và aud ở mọi yêu cầu.

Tính năng xác minh tùy chọn trên trang này dùng Web Crypto API có sẵn trong trình duyệt của bạn. Việc giải mã và xác minh diễn ra trên thiết bị của bạn và không có gì được tải lên. Theo nguyên tắc chung, đừng bao giờ dán khóa ký của môi trường production hoặc token đang sử dụng thật vào những trang web bạn không tin cậy.

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

Dán JWT vào công cụ giải mã này có an toàn không?

Token được giải mã và xác minh bằng JavaScript trong trình duyệt của bạn và không bao giờ được gửi đến máy chủ. Hãy nhớ rằng một token chưa hết hạn có tác dụng như mật khẩu đối với bất kỳ ai nắm giữ nó, vì vậy nên dùng token thử nghiệm hoặc token đã hết hạn khi chia sẻ ảnh chụp màn hình hay nhật ký.

Có giải mã được JWT khi không có khóa bí mật không?

Có. Header và payload chỉ là JSON được mã hóa Base64URL, nên có thể đọc mà không cần khóa nào. Khóa bí mật hoặc khóa công khai chỉ cần thiết để xác minh chữ ký.

Vì sao công cụ báo token của tôi đã hết hạn?
Claim exp của token nằm trước thời điểm hiện tại trên thiết bị của bạn. Nếu token lẽ ra vẫn còn hiệu lực, hãy kiểm tra đồng hồ hệ thống và thời gian sống của token do bên phát hành cấu hình.
Có thể xác minh những thuật toán chữ ký nào?

HS256, HS384 và HS512 với khóa bí mật dùng chung, cùng RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384 và ES512 với khóa công khai ở định dạng PEM.

"alg": "none" có nghĩa là gì?

Giá trị này đánh dấu một JWT không được bảo mật, có chữ ký rỗng, được định nghĩa trong RFC 7518. Bất kỳ ai cũng có thể tạo hoặc sửa token như vậy, nên máy chủ mong đợi token có chữ ký phải luôn từ chối nó.