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. 1

    Dán token

    Ba chuỗi base64url được phân tách bởi ký hiệu `.` (header.payload.chữ ký).

  2. 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. 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. 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: none một cách vô điều kiện.
  • Từ chối alg: HS256 khi mã xác minh của bạn mong đợi RS256 (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ị kidalg đế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 nbfiat. Sai lệch đồng hồ có thể khiến iat > now xả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

Công cụ này có phiên bản bằng các ngôn ngữ khác