JWT là gì? Giải thích đầy đủ về Mã thông báo Web JSON
Trả lời nhanh
JWT là chuỗi với ba phần mã hóa Base64URL phân tách bởi dấu chấm: header.payload.signature. Header chỉ định thuật toán, payload chứa claim (user ID, roles, expiration) và signature chứng minh tính xác thực. Dùng JWT Decoder miễn phí để inspect nội dung token.
Giới thiệu
JWT (JSON Web Token) là định dạng token compact, URL-safe định nghĩa bởi RFC 7519 để truyền thông tin an toàn giữa các bên as object JSON. JWT được dùng phổ biến cho authentication trong ứng dụng web: sau login server cấp JWT mà client включить trong request tiếp theo. JWT stateless —server không cần lookup token trong cơ sở dữ liệu; token tự chứa claim và signature.
Từng bước một
-
Hiểu cấu trúc ba phần
JWT có ba phần: tiêu đề (thuật toán và loại), tải trọng (xác nhận quyền sở hữu) và chữ ký (chứng minh tính toàn vẹn). Mỗi phần được mã hóa Base64URL và phân tách bằng dấu chấm: eyJhbGciOi...J9.eyJzdWIi...J9.signature. Bất kỳ ai có mã thông báo đều có thể đọc được hai phần đầu tiên; chỉ có chữ ký yêu cầu khóa bí mật.
-
Tìm hiểu các yêu cầu tiêu chuẩn
Tải trọng chứa các xác nhận quyền sở hữu - các tuyên bố về chủ đề này. Xác nhận quyền sở hữu tiêu chuẩn: 'sub' (chủ đề/ID người dùng), 'iat' (được phát hành vào thời điểm dấu thời gian), 'exp' (hết hạn), 'nbf' (không phải trước đó), 'iss' (nhà phát hành), 'aud' (đối tượng). Xác nhận quyền sở hữu tùy chỉnh có thể bao gồm vai trò, quyền hoặc bất kỳ dữ liệu nào khác.
-
Hiểu thuật toán ký
JWT sử dụng ký hiệu đối xứng (HS256 - bí mật chung) hoặc bất đối xứng (RS256, ES256 - cặp khóa chung/riêng). Chữ ký ngăn chặn việc giả mạo: việc thay đổi bất kỳ phần nào của mã thông báo sẽ làm mất hiệu lực chữ ký. Chỉ người nắm giữ khóa bí mật/riêng tư mới có thể tạo mã thông báo hợp lệ.
-
Sử dụng JWT để xác thực
Sau khi đăng nhập, máy chủ tạo JWT và gửi nó cho khách hàng. Máy khách bao gồm JWT trong tiêu đề Ủy quyền (Mã thông báo mang) cho các yêu cầu tiếp theo. Máy chủ xác minh chữ ký và kiểm tra ngày hết hạn — không cần tra cứu cơ sở dữ liệu.
Ví dụ
Cấu trúc JWT
đầu vào: Một JWT điển hình
đầu ra: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMSIsImV4cCI6MTY5MzYxMjgwMH0.signature
Tiêu đề được giải mã
đầu vào: Phần đầu tiên được giải mã
đầu ra: {"alg": "HS256", "typ": "JWT"}
Tải trọng được giải mã
đầu vào: Phần thứ hai được giải mã
đầu ra: {"sub": "user1", "name": "Alice", "iat": 1693526400, "exp": 1693612800}
Các vấn đề thường gặp
- Giải mã và xác minh — giải mã JWT (đọc nội dung của nó) KHÔNG chứng minh nó là xác thực. Luôn xác minh phía máy chủ chữ ký bằng khóa bí mật trước khi tin cậy các xác nhận quyền sở hữu.
- Lưu trữ JWT trong localStorage —điều này khiến chúng có thể truy cập được bằng JavaScript, dễ bị tấn công XSS. Lưu trữ trong cookie httpOnly để bảo mật tốt hơn.
- Mã thông báo tồn tại lâu dài —nếu mã thông báo bị đánh cắp, mã thông báo đó vẫn có hiệu lực cho đến khi hết hạn. Sử dụng mã thông báo truy cập có thời gian sử dụng ngắn (15-60 phút) cùng với mã thông báo làm mới cho các phiên dài.
- Dữ liệu nhạy cảm trong tải trọng — bất kỳ ai có mã thông báo đều có thể đọc được tải trọng này (nó là Base64, không được mã hóa). Không bao giờ đặt mật khẩu, thẻ tín dụng hoặc bí mật vào trọng tải.
Mẹo
- Luôn xác minh chữ ký JWT phía máy chủ trước khi tin cậy bất kỳ xác nhận quyền sở hữu nào — chỉ giải mã thôi thì không phải là xác thực.
- Sử dụng mã thông báo truy cập có thời gian sử dụng ngắn (15-60 phút) cùng với mã thông báo làm mới trong các phiên dài để giảm thiểu thiệt hại do bị đánh cắp mã thông báo.
- Lưu trữ JWT trong cookie httpOnly, Secure, SameSite thay vì localStorage để ngăn chặn các cuộc tấn công XSS.
- Sử dụng Bộ giải mã JWT của chúng tôi để kiểm tra nội dung mã thông báo nhằm gỡ lỗi — mã thông báo của bạn không bao giờ rời khỏi trình duyệt.