Cách giải mã và kiểm tra mã thông báo JWT
Mã thông báo JSON Web Token (JWT) là cách phổ biến nhất để xử lý xác thực trong các ứng dụng web hiện đại. Khi điều gì đó sai về phía xác thực — một người dùng bị đăng xuất mà không có lý do, các quyền sai, hoặc một API trả về 401 — giải mã JWT thường là bước đầu tiên trong việc gỡ lỗi.
Một JWT chứa gì
Một JWT có ba phần được phân tách bằng dấu chấm:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
Header — chứa thuật toán (HS256, RS256, v.v.) và loại mã thông báo.
{"alg": "HS256", "typ": "JWT"}
Payload — chứa các claim (khẳng định) về người dùng và mã thông báo.
{"sub": "1234567890", "name": "Alice", "exp": 1700000000}
Chữ ký — một dấu vân tay mật mã đảm bảo rằng mã thông báo không bị thay đổi. Bạn không thể đọc nó mà không có khóa ký.
Các claim JWT phổ biến
| Claim | Tên đầy đủ | Nội dung |
|---|---|---|
sub |
Subject | ID hoặc định danh người dùng |
exp |
Expiration | Dấu thời gian Unix khi hết hạn |
iat |
Issued At | Dấu thời gian Unix khi tạo |
iss |
Issuer | Ai đã tạo mã thông báo (máy chủ xác thực của bạn) |
aud |
Audience | Mã thông báo dành cho ai |
nbf |
Not Before | Mã thông báo không hợp lệ trước ngày này |
jti |
JWT ID | Định danh duy nhất của mã thông báo |
Cách giải mã JWT
- Dán mã thông báo của bạn — nhập JWT đầy đủ (định dạng header.payload.chữ-ký) vào trình giải mã.
- Xem các phần được giải mã — công cụ hiển thị header (thuật toán), payload (các claim) và chữ ký dưới dạng JSON được định dạng.
- Xác minh các claim — kiểm tra ngày hết hạn, người phát hành, chủ thể và bất kỳ claim tùy chỉnh nào.
Gỡ lỗi với JWT
Mã thông báo đã hết hạn? Kiểm tra claim exp. Chuyển dấu thời gian Unix thành ngày dễ đọc. Nếu nó đã qua, mã thông báo đã hết hạn và phải được làm mới.
Quyền sai? Tìm các claim vai trò hoặc phạm vi trong payload. Chúng khác nhau tùy theo việc triển khai nhưng thường trông giống "role": "admin" hoặc "scope": "read write".
Vấn đề danh tính người dùng? Claim sub xác định người dùng. Xác minh rằng nó khớp với ID mong đợi.
Mã thông báo bị từ chối? Kiểm tra claim aud (audience). Nếu API mong đợi một audience cụ thể và mã thông báo có một audience khác, nó sẽ bị từ chối.
Lưu ý bảo mật quan trọng
- JWT không được mã hóa — bất kỳ ai cũng có thể giải mã payload. Đừng đặt mật khẩu, khóa API hoặc các bí mật khác vào một JWT.
- Luôn xác minh chữ ký phía máy chủ — một trình giải mã hiển thị cho bạn những gì mã thông báo tuyên bố, nhưng chỉ việc xác minh chữ ký mới chứng minh rằng nó không bị thay đổi.
- Xác minh hết hạn — các mã thông báo đã hết hạn phải luôn bị từ chối. Nếu ứng dụng của bạn chấp nhận các mã thông báo đã hết hạn, đó là một lỗ hổng bảo mật.
Câu hỏi thường gặp
Tôi có thể xác minh chữ ký JWT bằng trình giải mã không?
Không. Việc xác minh chữ ký yêu cầu bí mật ký hoặc khóa công khai, được lưu giữ trên máy chủ của bạn. Một trình giải mã cho bạn thấy những gì có trong mã thông báo, nhưng việc xác minh mật mã phải được thực hiện trên backend của bạn. Đừng bao giờ tin một JWT chưa được xác minh trong sản xuất.
Có an toàn khi dán JWT vào một công cụ trực tuyến không?
Có, khi công cụ chạy trong trình duyệt của bạn. Các trình giải mã trong trình duyệt xử lý mã thông báo cục bộ — không có gì được gửi đến máy chủ. Tránh các công cụ thực hiện các yêu cầu mạng với mã thông báo của bạn.
Claim exp là gì?
Claim exp (expiration) là một dấu thời gian Unix cho biết khi nào mã thông báo hết hạn. Sau ngày đó, mã thông báo phải bị từ chối. Luôn xác minh claim này để gỡ lỗi các vấn đề xác thực.
JWT có thể được mã hóa không?
Các JWT tiêu chuẩn (JWS) được ký nhưng không được mã hóa — bất kỳ ai cũng có thể giải mã payload. Các mã thông báo JWE (JSON Web Encryption) được mã hóa, nhưng ít phổ biến hơn. Đừng bao giờ đặt dữ liệu nhạy cảm (mật khẩu, bí mật) vào payload JWT tiêu chuẩn.