Mã giải mã JWT
Hãy dán một JWT (gồm ba phần được mã hóa bằng định dạng base64, tách biệt bởi dấu chấm). Bộ giải mã sẽ hiển thị phần tiêu đề, dữ liệu tải và chữ ký – đã được giải mã và in rõ ràng – cùng với thuật toán được phát hiện, thời điểm hết hạn của token theo giờ địa phương, và việc các giá trị nbf (thời điểm không trước), iat (thời điểm cấp phát) và exp (thời điểm hết hạn) có nhất quán hay không. Có thể thực hiện xác minh chữ ký tùy chọn nếu bạn sở hữu khóa bí mật hoặc khóa công khai.
Cách giải mã JWT
-
1
Dán token
Ba chuỗi base64url được phân tách bởi ký hiệu `.` (header.payload.chữ ký).
-
2
Đọc phần tiêu đề đã được giải mã
Thuật toán, loại và mã khóa (`kid`): Thuật toán cho biết bạn cần loại khóa nào để thực hiện xác minh.
-
3
Đọc nội dung tải (payload)
Các yêu cầu tiêu chuẩn (`iss`, `sub`, `aud`, `exp`, `iat`, `nbf`, `jti`) cùng các yêu cầu tùy chỉnh mà ứng dụng của bạn đưa ra.
-
4
Xác minh (tùy chọn)
Hãy cung cấp mật khẩu HMAC (đối với HS256/384/512) hoặc khóa công khai (đối với RS256, ES256, v.v.) để xác nhận chữ ký hợp lệ.
Giải phẫu của JWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNjAwMDAwMDAwfQ
.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Mỗi đoạn dữ liệu đều được mã hóa theo định dạng base64url (khác với base64 tiêu chuẩn). Phần đầu dữ liệu có cấu trúc JSON như {"alg":"HS256","typ":"JWT"}; phần nội dung chính cũng có cấu trúc JSON như {"sub":"1234567890","name":"Alice","iat":1600000000}; còn chữ ký thì là chữ ký HMAC hoặc RSA của header.payload.
Các yêu cầu tiêu chuẩn (RFC 7519)
| Yêu cầu | Tên | Ghi chú |
|---|---|---|
iss |
Người phát hành | Đơn vị đã tạo token |
sub |
Chủ đề | Token này nói về điều gì |
aud |
Đối tượng sử dụng | Mục đích của token là gì |
exp |
Thời gian hết hạn | Dấu thời gian Unix; bị từ chối sau thời điểm này |
nbf |
Trước thời điểm này | Dấu thời gian Unix; bị từ chối trước thời điểm này |
iat |
Được phát hành tại | Thời điểm tạo token theo chuẩn Unix |
jti |
Mã JWT | Mã định danh duy nhất cho các danh sách hủy bỏ |
Các thuật toán được hỗ trợ
Giá trị alg |
Loại khóa |
|---|---|
HS256/HS384/HS512 |
Bí mật HMAC chung |
RS256/RS384/RS512 |
Chìa khóa công cộng của RSA |
ES256/ES384 |
Chìa khóa công cộng ECDSA |
PS256/PS384 |
Chìa khóa công cộng RSA-PSS |
EdDSA / Ed25519 |
Đường cong Edwards |
none |
Đừng bao giờ tin vào thứ này, token chưa được ký |
Cạm bẫy alg: none
Các thư viện JWT thời kỳ đầu cho phép token "alg": "none" và ngây thơ coi chúng là hợp lệ. Hãy luôn:
- Đưa vào danh sách cho phép các thuật toán mà ứng dụng của bạn chấp nhận.
- Từ chối
alg: nonemột cách vô điều kiện. - Từ chối
alg: HS256khi mã xác minh của bạn mong đợiRS256(tấn công “nhầm lẫn thuật toán”).
JWT không phải là gì
- Không được mã hóa. Phần tiêu đề và payload chỉ được mã hóa bằng base64, vốn rất dễ giải mã. Đừng bao giờ đặt thông tin bí mật vào JWT mà không bọc nó trong JWE.
- Mặc định không thể thu hồi. Sau khi được cấp, JWT có hiệu lực cho đến
exp. Để thu hồi, bạn cần một danh sách đen, hoặc thời hạn ngắn kèm token làm mới. - Không phải là giải pháp thay thế cookie phiên cho mọi trường hợp sử dụng. Token mờ (opaque) lưu ở phía máy chủ thường đơn giản và an toàn hơn.
Các lỗi phổ biến
- Tin tưởng phần tiêu đề. Giá trị
kidvàalgđến từ chính token. Một máy chủ bị xâm nhập có thể đặt chúng tùy ý; hãy luôn xác minh dựa trên một danh sách cố định. - Bỏ qua độ lệch của
nbfvàiat. Sai lệch đồng hồ có thể khiếniat > nowxảy ra. Hãy cho phép một khoảng dung sai nhỏ (30–60 giây). - Ghi log toàn bộ JWT. Payload thường chứa ID người dùng, địa chỉ email, quyền hạn, những PII không nên xuất ra stdout.
- Dùng HS256 với khóa bí mật yếu. Một khóa bí mật 16 ký tự có thể bị bẻ khóa bằng brute-force trong vài phút. Hãy dùng ít nhất 256 bit entropy ngẫu nhiên.
Câu hỏi thường gặp
Không. Quá trình giải mã được thực hiện trực tiếp trong trình duyệt của bạn. Token được lưu trữ tại hệ thống cục bộ – điều này rất quan trọng vì các JWT thường chứa dữ liệu phiên làm việc, ID người dùng và quyền truy cập.
Đúng vậy. Khi bạn dán mật khẩu HMAC được chia sẻ hoặc khóa công khai đã được mã hóa bằng PEM, quá trình xác minh sẽ được thực hiện ngay trong trình duyệt của bạn; khóa này sẽ không bao giờ rời khỏi máy tính của bạn.
Điều này có nghĩa là token không được ký. Không bao giờ chấp nhận các token như vậy trong môi trường sản xuất – chúng có thể bị giả mạo một cách dễ dàng. Một số lỗ hổng bảo mật nổi bật (CVE) chính xác liên quan đến các thư viện vốn mặc định chấp nhận định dạng alg: none.
Việc ký bằng JWT chứng minh tính xác thực, chứ không phải tính bảo mật. Phần tiêu đề và dữ liệu nội dung đều được mã hóa theo định dạng URL Base64 – một quá trình có thể đảo ngược được. Để đảm bảo tính kín đáo, hãy sử dụng JWE (JSON Web Encryption) xung quanh JWT, hoặc tránh đặt các dữ liệu nhạy cảm vào phần nội dung.
Công cụ liên quan
Bảng tham chiếu ASCII
Bảng ASCII đầy đủ từ 0 đến 127 với giá trị thập phân, thập lục phân, bát phân, nhị phân và ký hiệu tham chiếu ký tự số HTML, gồm NUL, LF và DEL.
Tham chiếu ký tự HTML
Danh sách có thể tìm kiếm các thực thể HTML, mã tên và mã số tương ứng của chúng, cùng chức năng sao chép chỉ với một cú nhấp cho các ký tự đặc biệt và biểu tượng.
Bảng tham khảo phím tắt
Tìm phím tắt mặc định theo tài liệu của VS Code, Chrome và Bash dùng GNU Readline trên macOS, Windows và Linux.
Bảng tra cứu nhanh Markdown
Tài liệu Markdown thực dụng với bản xem trước thực tế và ví dụ có thể sao chép cho tiêu đề, danh sách, bảng, mã, liên kết, hình ảnh và cú pháp GFM.
Trình định dạng HTML
Định dạng HTML cục bộ trong trình duyệt với thụt lề hai hoặc bốn khoảng trắng. HTML không được tải lên hoặc xác thực.
Công cụ đổi PX sang PT
Đổi giá trị pixel CSS không âm sang điểm chữ theo công thức 1 px = 0,75 pt. Kết quả hiển thị tối đa bốn chữ số thập phân.
Công cụ này có phiên bản bằng các ngôn ngữ khác
- Decoder JWT [ID]
- JWTデコーダ [JA]
- ตัวถอดรหัส JWT [TH]
- JWT-Dekoder [DE]
- JWT 해독기 [KO]
- Dekoder JWT [PL]
- Decodificador JWT [PT]
- Decodificador JWT [ES]
- JWT-avkodare [SV]
- مُفكّك JWT [AR]
- Décodeur JWT [FR]
- JWT-decoder [NL]
- Декодировщик JWT [RU]
- JWT Dekoderi [TR]
- JWT 解码器 [ZH]
- JWT Decoder [EN]
- Decoder JWT [IT]