Công cụ làm gì
JSON Web Token (JWT, RFC 7519) là một chuỗi gọn, an toàn cho URL, gồm ba phần ngăn bởi dấu chấm: header ghi thuật toán ký, payload chứa các claim, và chữ ký trên hai phần đầu. API dùng JWT làm bearer token, nhà cung cấp danh tính dùng làm ID token.
Công cụ này tạo và ký token từ payload JSON. Hỗ trợ:
- HS256, HS384, HS512: HMAC với khóa bí mật chung, dạng văn bản hoặc Base64.
- RS256, RS384, RS512 và PS256, PS384, PS512: chữ ký RSA với khóa riêng PEM.
- ES256, ES384, ES512: chữ ký ECDSA với khóa riêng EC.
Cách sử dụng
- Viết payload dưới dạng đối tượng JSON, hoặc bấm Ví dụ.
- Chọn Thuật toán rồi nhập khóa bí mật hoặc dán khóa riêng PEM ở đầu ô nhập.
- Tùy chọn đặt iat là thời điểm hiện tại, thêm thời hạn (exp) hoặc trường header bổ sung như mã khóa.
- Sao chép token ở đầu ra. Dán vào trình giải mã JWT để xem nội dung.
Ví dụ
Với khóa bí mật your-256-bit-secret, payload dưới đây ký bằng HS256 cho ra token ví dụ quen thuộc trên jwt.io:
{"sub":"1234567890","name":"John Doe","iat":1516239022}
Header luôn được ghi là {"alg":"HS256","typ":"JWT"}, theo sau là các trường bổ sung bạn thêm; alg luôn theo thuật toán đã chọn.
Thực hành tốt
Giữ token sống ngắn bằng claim exp, và đặt iss cùng aud để token của dịch vụ này không bị dùng lại ở dịch vụ khác. Trên máy chủ, luôn xác minh chữ ký với danh sách thuật toán cho phép rõ ràng và từ chối none. Khóa bí mật HMAC nên dài và ngẫu nhiên, ít nhất bằng độ dài đầu ra của hàm băm (32 byte với HS256).
Câu hỏi thường gặp
› Nên chọn thuật toán nào?
Chọn thuật toán máy chủ của bạn dùng để xác minh. HS256 dùng khóa bí mật chung và phổ biến trong một hệ thống. RS256 và ES256 ký bằng khóa riêng và ai cũng xác minh được bằng khóa công khai, phù hợp với token được nhiều dịch vụ kiểm tra. Chữ ký ES256 ngắn hơn RS256 rất nhiều.
› Hỗ trợ những định dạng khóa riêng nào?
Khóa PEM dạng PKCS#8 (BEGIN PRIVATE KEY), PKCS#1 RSA (BEGIN RSA PRIVATE KEY) và SEC1 EC (BEGIN EC PRIVATE KEY). Khóa đã mã hóa cần được xuất lại không có mật khẩu trước. Với ES256, ES384 và ES512, khóa phải thuộc đường cong P-256, P-384 hoặc P-521 tương ứng.
› Payload của JWT có bí mật không?
Không. Header và payload chỉ được mã hóa Base64URL, ai có token đều đọc được. Chữ ký ngăn chỉnh sửa chứ không ngăn đọc. Đừng bao giờ đưa mật khẩu hay bí mật khác vào payload JWT.
› Khóa bí mật hoặc khóa riêng của tôi có bị lưu hay gửi đi không?
Không. Việc ký chạy trong trình duyệt bằng Web Crypto API. Khóa chỉ nằm trong bộ nhớ của trang này: không được lưu, không ghi lên thanh địa chỉ và không đưa vào liên kết chia sẻ. Dù vậy, đừng dán khóa môi trường thật vào trang web mà bạn không kiểm soát.