Appearance
JWT — cấu trúc và cách xác minh
JWT (JSON Web Token) là một chuỗi gồm ba phần, phân cách bằng dấu chấm: header.payload.signature. Mỗi phần được mã hoá base64url từ một đối tượng JSON.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTYiLCJuYW1lIjoiUmludGMiLCJleHAiOjE3MzAwMDAwMDB9.4f8a2c...
└──────────── header ────────────┘ └──────────────── payload ────────────────┘ └── signature ──┘- Header: khai báo thuật toán ký (
alg, ví dụHS256hoặcRS256) và loại token (typ: JWT). - Payload: chứa các claim (thông tin) — ví dụ
sub(subject, tức user id),exp(thời điểm hết hạn),iss(issuer, ai cấp token),aud(audience, token dành cho service nào). Lưu ý: payload chỉ được encode base64, không mã hoá — ai cũng đọc được nội dung này nếu có token, vì vậy tuyệt đối không nhét dữ liệu nhạy cảm (mật khẩu, số thẻ...) vào claim. - Signature: phần đảm bảo token không bị chỉnh sửa và đúng là do bên phát hành cấp.
Cách ký và xác minh phụ thuộc vào thuật toán khai báo trong header:
| HS256 (đối xứng) | RS256 (bất đối xứng) | |
|---|---|---|
| Cơ chế | Dùng một khoá bí mật (secret) duy nhất cho cả ký và xác minh | Dùng cặp khoá riêng/công khai (private/public key) — private key để ký, public key để xác minh |
| Ai ký được | Chỉ bên giữ secret | Chỉ bên giữ private key |
| Ai xác minh được | Chỉ bên giữ cùng secret đó (thường chỉ có 1 server) | Bất kỳ ai có public key — không cần biết private key |
| Phù hợp khi | Hệ thống nhỏ, chỉ một service phát hành và kiểm tra token | Hệ thống phân tán, nhiều service độc lập cần tự xác minh token mà không cần hỏi lại service phát hành |
Quá trình xác minh (verify) một JWT ký bằng RS256, ví dụ:
- Server nhận token, tách
header.payloadvàsignature. - Server dùng public key của bên phát hành, áp dụng thuật toán xác minh RSA lên
signatuređể lấy lại giá trị hash gốc. - Server tự tính hash SHA-256 của chuỗi
header.payloadnhận được. - So sánh hai giá trị hash: khớp → token hợp lệ, chưa bị sửa; không khớp → từ chối ngay lập tức.
Ngoài chữ ký, một hệ thống xác minh JWT đúng cách còn phải kiểm tra thêm: exp (chưa hết hạn), aud (token đúng dành cho service này), iss (token đến từ nguồn tin cậy) — thiếu các bước này là lỗi phổ biến dù chữ ký vẫn đúng.