Chuẩn rồi, JWT::encode / JWT::decode ký bằng HMAC hoặc RSA/ECDSA, tuỳ algorithm (alg) bạn chọn 👇
Nhưng mặc định & phổ biến nhất là HMAC (HS256).
JWT có 3 nhóm thuật toán chính:
HS256 / HS384 / HS512
👉 JWT::encode(..., $secret, 'HS256')
👉 JWT::decode(..., new Key($secret, 'HS256'))
✔️ Cái này chính xác là HMAC
RS256 / RS384 / RS512
👉 Auth Server ký
👉 Các service khác chỉ cần public key
ES256 / ES384 / ES512
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
$payload = [
'iss' => 'example.com',
'sub' => 123,
'iat' => time(),
'exp' => time() + 3600
];
$secret = 'super-secret-key';
$jwt = JWT::encode($payload, $secret, 'HS256');
$decoded = JWT::decode($jwt, new Key($secret, 'HS256'));
👉 Encode = hash_hmac() bên trong
👉 Decode = verify lại HMAC
👉 Nếu bạn:
➡️ HS256 là chuẩn bài
| Trường hợp | Nên dùng |
|---|---|
| SSO nhiều hệ | RS256 |
| Public verify | RS256 |
| Microservice lớn | RS256 / ES256 |
| App nhỏ / cá nhân | HS256 |
❌ Cho client biết secret
❌ Cho phép alg=none
❌ Decode mà không verify alg
❌ Dùng secret quá ngắn
✅ Secret ≥ 32 bytes
bin2hex(random_bytes(32))
JWT::encode / decode ký bằng HMAC nếu dùng HS256,
còn RSA/ECDSA nếu dùng RS256 / ES256.