JWT decode: giải mã header, payload và hạn token
Giải mã JWT ngay trong trình duyệt: header, payload, thời hạn. Token không gửi đi đâu.
JWT token
Header
{
"alg": "HS256",
"typ": "JWT"
}Payload (Claims)
{
"sub": "12345",
"name": "Trần Công Thắng",
"iat": 1715952000,
"exp": 1747488000,
"role": "admin",
"iss": "alodev.vn"
}Signature
fakeSignatureForDemoOnly
Signature chỉ kiểm tra được nếu có secret/public key. Tool này decode (không verify) - không cần secret.
Giải mã token và ranh giới công cụ không vượt qua
Công cụ này bóc ra những gì
Token được tách theo hai dấu chấm, hai phần đầu được giải Base64 an toàn cho địa chỉ web rồi in ra thành JSON có định dạng: phần header cho biết thuật toán ký và loại token, phần payload chứa các khai báo. Các khai báo thời gian gồm thời điểm phát hành, thời điểm bắt đầu hiệu lực và thời điểm hết hạn được đổi sang giờ Việt Nam kèm khoảng cách so với hiện tại, và token quá hạn được đánh dấu rõ.
Lúc gỡ lỗi phiên đăng nhập
Khi một lệnh gọi trả về mã 401 và bạn cần biết token đã hết hạn hay chỉ thiếu quyền. Khi phân quyền chạy không như mong đợi và cần xem khai báo vai trò, phạm vi hay mã tổ chức thực tế nằm trong token. Khi muốn biết nhà cung cấp đăng nhập đang phát token sống bao lâu để cấu hình vòng làm mới cho đúng.
Đọc các mốc thời gian
Các khai báo thời gian tính bằng giây kể từ mốc năm 1970, không phải mili giây; nhân nhầm nghìn lần là lỗi kinh điển khi tự sinh token. Khai báo thời điểm bắt đầu hiệu lực nghĩa là token bị từ chối trước mốc đó, và đồng hồ máy chủ lệch vài phút đủ để gây lỗi khó hiểu ở chỗ này.
Ranh giới không nên vượt
Công cụ chỉ giải mã, tuyệt đối không xác minh chữ ký, vì việc đó cần khoá bí mật và phải làm ở phía máy chủ. Một payload trông hợp lệ hoàn toàn có thể thuộc về token giả. Phần payload không hề được mã hoá, chỉ là mã hoá dạng biểu diễn, nên bất kỳ ai cầm token đều đọc được; đừng nhét số căn cước, số tài khoản hay bất cứ dữ liệu nhạy cảm nào vào đó. Nếu thấy thuật toán khai là none thì đó là dấu hiệu của một kiểu tấn công cũ, hệ thống bắt buộc phải từ chối chứ không được tin.
Token không rời trình duyệt. Việc tách và giải mã chạy trong trình duyệt, token không được gửi đi đâu. Dù vậy một token còn hạn vẫn là chìa khoá mở phiên đăng nhập, nên đừng dán nó lên màn hình đang chia sẻ hoặc đang quay lại.
JWT decode: cấu trúc token, claim và chữ ký
JWT decode là gì
JWT (JSON Web Token, RFC 7519) là chuỗi gồm ba phần ngăn bởi dấu chấm: header.payload.signature. Header và payload là hai JSON object được mã hoá base64url; signature là chữ ký tính trên hai phần đầu.
JWT decode nghĩa là tách chuỗi theo dấu chấm và giải base64url hai phần đầu để đọc lại JSON. Việc này không cần khoá, ai cầm token cũng làm được, nên decode khác hoàn toàn với verify (xác minh chữ ký).
Cách dùng công cụ JWT decode
- Dán token vào ô nhập, chỉ phần chuỗi bắt đầu bằng eyJ (nếu chép từ header Authorization thì bỏ chữ Bearer phía trước).
- Đọc header: alg là thuật toán ký (HS256, RS256, ES256...), typ thường là JWT, kid là mã khoá dùng để ký nếu hệ thống có nhiều khoá.
- Đọc payload (token claims): các khai báo về người dùng và phiên, ví dụ sub là user id.
- Xem các mốc thời gian đã đổi sang ngày giờ theo đồng hồ máy bạn: token còn hạn hay đã hết hạn.
Các claim chuẩn trong payload
| Claim | Tên đầy đủ | Ý nghĩa |
|---|---|---|
| iss | issuer | Bên phát hành token, ví dụ địa chỉ máy chủ đăng nhập |
| sub | subject | Chủ thể của token, thường là user id |
| aud | audience | Bên được phép nhận token; API phải từ chối token không dành cho mình |
| exp | expiration time | Thời điểm hết hạn, tính bằng giây kể từ 01/01/1970 (UTC) |
| nbf | not before | Token chưa được chấp nhận trước thời điểm này |
| iat | issued at | Thời điểm phát hành |
| jti | JWT ID | Mã duy nhất của token, dùng để chống dùng lại hoặc thu hồi |
Ngoài các claim chuẩn, hệ thống thường thêm claim riêng như role, scope, tenant, email. Công cụ hiện đủ mọi claim có trong payload.
Thuật toán ký và cách verify the signature
- HS256 (HMAC SHA-256): ký và kiểm bằng cùng một secret key. Chỉ máy chủ giữ secret mới verify được; lộ secret là ai cũng tạo được token hợp lệ.
- RS256 (RSA) và ES256 (ECDSA): ký bằng khoá riêng, kiểm bằng khoá công khai. Dịch vụ nhận token chỉ cần khoá công khai, thường lấy từ địa chỉ JWKS của bên phát hành.
- Khi verify, máy chủ phải cố định thuật toán mong đợi thay vì tin alg trong header, kiểm exp, nbf, iss, aud, rồi mới dùng các claim. Token khai alg là none phải bị từ chối.
Công cụ này chỉ decode, không verify the signature, vì verify cần secret key hoặc khoá công khai của hệ thống và phải làm ở phía máy chủ. Payload đọc được không có nghĩa token là thật.
Lỗi thường gặp khi làm việc với JWT
- Đặt exp bằng mili giây (Date.now()) thay vì giây: token có hạn tới vài chục nghìn năm sau.
- Đồng hồ máy chủ lệch vài phút làm token vừa phát hành đã bị từ chối vì nbf hoặc iat; nên cho phép sai lệch nhỏ khi kiểm thời gian.
- Đưa dữ liệu nhạy cảm (số căn cước, số tài khoản, mật khẩu) vào payload: payload chỉ mã hoá dạng biểu diễn, không phải mã hoá bảo mật.
- Token sống quá lâu mà không có cơ chế thu hồi: nên dùng access token ngắn hạn kèm refresh token.
Tên claim theo RFC 7519 (JSON Web Token); thuật toán ký theo RFC 7518 (JSON Web Algorithms).
Câu hỏi thường gặp
JWT Decoder có xác minh chữ ký không?
Không. Công cụ chỉ giải mã header và payload để đọc nội dung, việc xác minh chữ ký cần khoá bí mật và phải làm ở phía máy chủ.
Vì sao payload trong JWT không được coi là bí mật?
Payload chỉ được mã hoá base64url chứ không mã hoá thật, bất kỳ ai cầm token đều đọc được nội dung bên trong.
Các mốc thời gian exp, iat, nbf tính theo đơn vị gì?
Tính bằng giây kể từ năm 1970, không phải mili giây - nhân nhầm nghìn lần là lỗi kinh điển khi tự sinh token.
JWT decode và JWT verify khác nhau thế nào?
Decode chỉ giải base64url phần header và payload để đọc, không cần khoá. Verify kiểm chữ ký bằng secret key (HS256) hoặc khoá công khai (RS256, ES256) và kiểm các claim exp, nbf, iss, aud; chỉ token verify thành công mới được tin.
Token dán vào công cụ này có an toàn không?
Việc giải mã chạy trong trình duyệt và token không được gửi đi đâu, nhưng một token còn hiệu lực vẫn là chìa khoá đăng nhập nên tránh dán lên màn hình đang chia sẻ.
