Giải mã JWT
Xem header, các claim và thời hạn của một JSON Web Token. Token là thông tin xác thực dùng được, nên ở đây không có gì được gửi đi đâu hay lưu trữ, không bao giờ.
- Không bao giờ lưu trữ
- Không xếp hàng, không phải chờ
- Không cần đăng ký, không watermark
Token của bạn không bao giờ rời khỏi trang này. Nó được giải mã ngay tại đây, không gửi yêu cầu nào đến máy chủ — điều này quan trọng, vì JWT thường là một thông tin xác thực đang dùng được. Hãy tắt Wi-Fi sau khi trang đã tải xong, việc giải mã vẫn chạy: không có gì được gửi đi.
Có tiền tố “Bearer ” cũng không sao — nó sẽ được bỏ qua.
Cách hoạt động
Dán token
Có hay không có tiền tố “Bearer ” đều được. Token chỉ nằm trong trang này; không có yêu cầu nào được gửi đi.
Đọc ba phần
Header, payload và chữ ký, mỗi phần đều được giải mã và định dạng. Dấu thời gian được chuyển thành ngày giờ thực và bạn biết còn bao lâu nữa.
Xem các cảnh báo
Token đã hết hạn, thiếu thời hạn, thuật toán “none” và các vấn đề khác đều được chỉ ra kèm ý nghĩa của chúng.
Những gì được kiểm tra, và những gì chỉ được đọc
Mọi thứ trên trang này, trừ hai phép so sánh ngày giờ, đều chỉ là chép lại. Header và payload được giải mã Base64URL rồi in ra; chữ ký được sao chép ra và không bao giờ bị động đến, vì ở đây không có khóa và hoàn toàn không có phép mã hóa nào chạy. Hai phán đoán mà trang có đưa ra là phép tính dựa trên đồng hồ của chính thiết bị bạn — claim hết hạn so với hiện tại, và claim chưa hợp lệ trước (not-before) so với hiện tại. Không có khoảng dung sai cho độ lệch đồng hồ, trong khi một máy chủ kiểm tra cùng token đó thường cho phép lệch một hai phút. Một chiếc laptop chạy nhanh năm phút sẽ hiển thị một token còn hiệu lực là đã hết hạn, trong khi token hoàn toàn bình thường.
Hai chi tiết phân tích quyết định thứ bạn thực sự thấy. Các claim thời gian chỉ được đọc khi chúng là số JSON: một token có thời hạn được viết dưới dạng chuỗi "1699999999" sẽ bị coi như không có thời hạn, và nhận cảnh báo rằng nó không bao giờ tự hết hạn — trái ngược hoàn toàn với sự thật. Và payload được phân tích bằng trình phân tích JSON có sẵn của trình duyệt chứ không phải trình phân tích giữ nguyên chữ số đằng sau các công cụ JSON của chúng tôi, nên một claim số 64-bit như ID người dùng dạng snowflake trong subject sẽ hiển thị với các chữ số cuối bị làm tròn. Định danh trong JWT thường là chuỗi chính vì lý do này; khi không phải vậy, hãy đọc nó từ payload thô thay vì từ bảng claim.
Token có năm phần bị từ chối vì được coi là JWE đã mã hóa, và phán đoán đó chỉ dựa vào số phần chứ không đọc header — đúng trong thực tế, và đáng biết rằng đó là một lối tắt. Mọi thứ không có đúng ba phần đều bị từ chối thẳng, cũng như payload giải mã ra một mảng JSON hay một chuỗi trơn thay vì một object. Cảnh báo được đưa ra cho thuật toán “none” và cho họ HS, nơi khóa ký là một bí mật dùng chung chứ không phải khóa công khai. Token ký bằng RS, ES hay PS không nhận cảnh báo nào, nên việc trang này im lặng chỉ nghĩa là không có dạng nguy hiểm đã biết, không phải sự chấp thuận.
Khi bạn cần công cụ khác
Ở đây không lưu trữ gì cả, đó là lý do duy nhất khiến trang này có thể tồn tại một cách hợp lý — và nó vẫn không phải là thói quen nên hình thành. Một lời cam kết về quyền riêng tư không thể được kiểm chứng bằng cách đọc nó: hãy ngắt mạng sau khi trang tải xong và xem bộ giải mã vẫn tiếp tục hoạt động, đó chính là điều mà một công cụ có máy chủ phía sau không làm được. Và nếu một token bạn đã dán vào nơi không thể kiểm tra vẫn còn hiệu lực, hãy thay nó thay vì suy xét về nó. Thay token mất một phút. Còn cách kia là một cuộc tranh luận dài với chính mình về một thông tin xác thực vẫn đang mở được cửa. Để đọc token trên máy thay vì trong một tab, payload chỉ cần một dòng lệnh shell: cắt trường thứ hai được phân tách bằng dấu chấm, chạy base64 -d, rồi chuyển qua jq.
Khi câu hỏi là token có thật hay không chứ không phải nó nói gì, thì về bản chất đây là trang sai, và mọi công cụ giải mã online khác cũng vậy. Việc xác minh thuộc về nơi đã có sẵn khóa — thư viện JWT của ngôn ngữ bạn dùng trên máy chủ của bạn, đối chiếu với JWKS mà bên phát hành công bố. Chỉ cần vài dòng code, đó là câu trả lời duy nhất có ý nghĩa, và bất kỳ trang nào đề nghị làm việc đó thay bạn đều đang đòi đúng thứ bí mật mà bạn không bao giờ nên đưa cho một website.
Câu hỏi thường gặp
Token của tôi có bị gửi đi đâu không?
Không — và với trang này, đó là toàn bộ ý nghĩa của nó chứ không phải một tính năng. JWT thường là thông tin xác thực đang có hiệu lực: ai nắm giữ nó đều có thể hành động với tư cách là bạn cho đến khi nó hết hạn. Dán một token vào công cụ giải mã online có gửi nó lên máy chủ là trao đi một chiếc chìa khóa dùng được, và không lời hứa không ghi log nào có thể xóa bỏ điều đó. Bộ giải mã này là JavaScript thuần trong chính trang bạn đang xem. Không lưu trữ gì cả, không ghi log gì cả, không có yêu cầu nào được gửi đi. Sau khi trang tải xong, hãy tắt Wi-Fi và nó vẫn hoạt động y như cũ. Đó là cách đơn giản nhất để tự mình xác nhận lời cam kết về quyền riêng tư thay vì chỉ tin lời chúng tôi.
Công cụ có xác minh chữ ký không?
Không, và không công cụ giải mã online nào làm được việc đó một cách trung thực nếu không có khóa ký của bạn. Giải mã và xác minh là hai thao tác hoàn toàn khác nhau. Giải mã chỉ là gỡ lớp Base64 của token — ai cũng làm được với bất kỳ token nào, và nó hoàn toàn không chứng minh được token có thật hay không. Xác minh nghĩa là tính lại chữ ký bằng khóa bí mật hoặc khóa công khai đã ký nó, và khóa đó không bao giờ nên được dán vào một website. Thứ bạn thấy ở đây là điều token KHAI BÁO. Những khai báo đó có đáng tin hay không là câu hỏi mà chỉ máy chủ của bạn, nơi giữ khóa, mới trả lời được.
Người khác có đọc được JWT tôi gửi cho họ không?
Có — đọc được toàn bộ, và điều này khiến nhiều người bất ngờ. JWT được ký, không được mã hóa. Header và payload là Base64, một kiểu mã hóa ký tự không chứa bí mật nào, nên bất kỳ ai chặn được token đều đọc được mọi claim bên trong. Chữ ký ngăn họ SỬA token; nó không ngăn được họ ĐỌC token. Đừng bao giờ đưa thứ gì bí mật vào payload của JWT: không mật khẩu, không số thẻ, không dữ liệu cá nhân mà bạn không muốn viết lên một tấm bưu thiếp.
Cảnh báo thuật toán “none” nghĩa là gì?
Nghĩa là token tự nhận mình không được ký, và đó là một trong những phát hiện nghiêm trọng nhất mà trang này báo. `alg: none` là một kiểu vượt qua xác thực đã được ghi nhận: kẻ tấn công lấy một token thật, sửa payload để nói họ là quản trị viên, đặt thuật toán thành “none”, bỏ chữ ký, và một thư viện tin vào header sẽ chấp nhận nó. Mọi thư viện JWT nghiêm túc hiện nay đều chặn điều này theo mặc định, nhưng những cách triển khai tin vào `alg` vẫn còn tồn tại. Một token đến với `alg: none` nên được coi là một cuộc tấn công cho đến khi chứng minh được điều ngược lại.
Làm sao để đọc thời hạn?
Việc đó đã được làm sẵn cho bạn. `exp`, `iat` và `nbf` là dấu thời gian Unix — số giây tính từ năm 1970 — nên không thể đọc được khi ở dạng số thô. Mỗi giá trị được hiển thị thành ngày giờ thực theo múi giờ của bạn, kèm cách đây bao lâu hoặc còn bao lâu nữa, và token đã hết hạn được nói rõ ràng thay vì để bạn tự tính. Token hoàn toàn không có `exp` cũng được đánh dấu: một JWT không bao giờ hết hạn thì không thể bị vô hiệu hóa nhờ hết hạn, và vẫn hợp lệ chừng nào khóa ký còn hợp lệ.
Token của tôi có năm phần, không phải ba
Vậy thì đó là JWE — được mã hóa chứ không chỉ được ký — và nội dung của nó thực sự không thể đọc được nếu không có khóa giải mã. Trang nhận ra hình dạng này và cho bạn biết thay vì hiển thị dữ liệu vô nghĩa. Năm phần nghĩa là payload là bản mã thực sự; không có gì để giải mã cả.
Các claim tiêu chuẩn là gì?
Các claim đã đăng ký gồm: `iss` bên phát hành, `sub` token nói về ai (thường là ID người dùng), `aud` token dành cho ai, `exp` thời điểm hết hạn, `nbf` chưa hợp lệ trước thời điểm này, `iat` thời điểm phát hành, và `jti` ID duy nhất của token. Mọi thứ khác là tùy chỉnh của bên xây dựng hệ thống. Mỗi claim đã đăng ký đều được ghi chú ý nghĩa trong kết quả, nên bạn không cần nhớ chữ viết tắt ba ký tự nào là gì.
Nên biết: Công cụ này giải mã, không xác minh. Chữ ký của JWT chứng minh token chưa bị sửa đổi, và việc kiểm tra nó cần khóa bí mật hoặc khóa công khai của bên phát hành — thứ bạn không bao giờ nên dán vào một trang web. Hãy coi mọi thứ hiển thị ở đây là điều được khai báo, chưa được chứng minh, và xác minh trên máy chủ của bạn.
Đặt công cụ này lên website của bạn
Miễn phí cho mọi blog, trang lớp học hay bài viết hướng dẫn. Chỉ cần dán một đoạn mã là khách truy cập có thể dùng ngay trên trang của bạn.