JWT gồm ba phần header.payload.signature phân tách bằng dấu chấm, mỗi phần encode base64url — base64url là encoding chứ không phải mã hóa: ai cầm token đều đọc được payload.
- Cấu trúc — header (
{ 'alg': 'RS256', 'typ': 'JWT' }— thuật toán ký); payload (claims:sub,exp,iss,aud...); signature ký trênheader.payloadđể chống sửa đổi. - Tấn công
alg: none— attacker sửa header thành'alg': 'none'và bỏ signature; thư viện cấu hình sai vẫn chấp nhận → bypass verify. Fix: chỉ định danh sách thuật toán cho phép khi verify. - HS256/RS256 confusion — server ký RS256 nhưng verify chấp nhận cả HS256: attacker dùng public key (vốn công khai) làm HMAC secret để ký token giả → verify pass. Fix: pin đúng một thuật toán.
kidinjection — headerkid(key id) bị lợi dụng để trỏ bước lookup key sang key attacker kiểm soát (path traversal, SQL injection trong bước tra key).- Verify thiếu claim — signature đúng chưa đủ: phải kiểm tra
exp(hết hạn),iss(issuer) vàaud(audience) — nếu không, token cấp cho service khác vẫn bị dùng lại được.