JSON Web Token là gì?
Một JSON Web Token (JWT) là một lớp bọc gọn, an toàn cho URL chứa một payload claims nhỏ. Đây là định dạng thông tin xác thực tiêu chuẩn cho các phiên web không trạng thái, ID token OAuth/OIDC, xác thực API giữa máy với máy và liên kết magic đã được ký. Một JWT luôn gồm ba phân đoạn base64url được nối bằng dấu chấm: header.payload.signature. Header và payload là JSON; chữ ký là một MAC nhị phân hoặc chữ ký số trên hai phân đoạn đầu tiên.
JWT hoạt động như thế nào?
Khi công cụ này giải mã một token, nó đi theo cùng một quy trình ba bước mà mọi thư viện JWT đều tuân thủ:
- Chia token theo dấu chấm thành đúng ba phân đoạn không rỗng. Bất kỳ hình dạng nào khác đều là sai cấu trúc.
- Giải mã base64url các phân đoạn 0 và 1, sau đó
JSON.parsemỗi cái. Header mang thuật toán (alg) và loại token (typ). Payload mang các claims (sub,exp,iat, các khóa tùy chỉnh). - Nếu khóa bí mật được cung cấp, tính lại MAC trên
<segment0>.<segment1>bằng thuật toán trong header. So sánh byte với phân đoạn thứ ba. - Hiển thị kết quả xác minh cùng với các claims đã giải mã, bao gồm chỉ báo hạn sử dụng dễ đọc được tính từ claim
exp.
Tại sao nên giải mã JWT trong trình duyệt?
Dán một JWT thật, đang được sử dụng vào trình gỡ lỗi từ xa sẽ làm rò rỉ thông tin xác thực vào nhật ký của dịch vụ đó, ngăn xếp quan sát của nó, và bất kỳ đối tác nào mà dịch vụ chuyển dữ liệu tới. Ngay cả khi trang bên thứ ba tuyên bố không ghi nhật ký token, bạn cũng không có cách nào để xác minh điều đó. Công cụ này được xây dựng để bạn không bao giờ phải đánh đổi như vậy:
- Không có mạng: thời gian chạy không có cuộc gọi
fetch,XMLHttpRequesthaysendBeaconnào. Mở DevTools khi bạn giải mã và xác minh — bảng Network vẫn yên lặng. - Web Crypto gốc: xác minh HMAC sử dụng
crypto.subtle.importKeyvàcrypto.subtle.sign, cùng những nguyên hàm mà thời gian chạy của bạn sẽ gọi. - Triển khai tĩnh: mỗi trang là một tệp HTML tĩnh đơn lẻ không có điểm cuối máy chủ nào có thể bị xâm phạm. Không có token nào để rò rỉ vì không có máy chủ nào để rò rỉ tới.
Công cụ này xác minh điều gì, và không xác minh điều gì?
Phiên bản 1 của công cụ này chỉ xác minh chữ ký họ HMAC-SHA. Cụ thể:
- Được hỗ trợ: HS256, HS384, HS512. Cung cấp khóa bí mật chung và công cụ sẽ tính lại và so sánh MAC.
- Chưa được hỗ trợ: RS256/384/512 (RSA), ES256/384/512 (ECDSA), EdDSA, và PS256/384/512 (RSA-PSS). Những thuật toán này yêu cầu khóa công khai ở dạng PEM hoặc JWK và được cố ý hoãn lại cho bản phát hành tiếp theo.
- Từ chối:
alg: "none". Công cụ giải mã token nhưng đánh dấu rõ ràng là không an toàn — không có xác thực chữ ký nào diễn ra, và bất kỳ hệ thống sản xuất nào chấp nhận token như vậy đều có lỗ hổng nghiêm trọng.
Ví dụ về giải mã JWT trông như thế nào?
Dán token mẫu chuẩn của RFC 7519 vào trường nhập ở trên:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Header giải mã thành {"alg":"HS256","typ":"JWT"} và payload thành {"sub":"1234567890","name":"John Doe","iat":1516239022}. Nhập your-256-bit-secret vào bảng xác minh và kết quả kiểm tra chữ ký trả về hợp lệ. Đổi một ký tự duy nhất của khóa bí mật thì kết quả trở thành không hợp lệ. Không có gì trong số này rời khỏi trình duyệt của bạn.
Đây là bộ giải mã JWT mà chúng tôi ước có khi cần gỡ lỗi một token trong môi trường sản xuất: tôn trọng quyền riêng tư, nhanh chóng, và được xây dựng trên cùng các nguyên hàm mà thời gian chạy sử dụng.