L46 — Authentication & JWT
Ba module tương tác để hiểu authentication trong thực tế:
1) JWT decoder — dán token, tách header.payload.signature, decode base64url, verify HMAC-SHA256 ngay trong trình duyệt;
2) Access vs Refresh timeline — mô phỏng vòng đời 2 loại token, rotation, expire;
3) Password hash compare — so sánh tốc độ và độ an toàn của plain / SHA-256 / bcrypt / argon2id.
1. JWT decoder & verifier (HS256)
Dán một JWT (hoặc bấm "Token mẫu"). Trang tách 3 phần, decode base64url, hiển thị header + payload,
rồi tính lại HMAC-SHA256(header.payload, secret) và so sánh chữ ký. Tất cả chạy bằng
Web Crypto API — không gửi token đi đâu cả.
(chưa có token)
(chưa có token)
2. Access token vs Refresh token — timeline
Access token sống ngắn (ở đây 15 "phút" mô phỏng), refresh sống dài và rotation mỗi lần dùng.
Bấm Tick để nhảy 5 phút. Khi access hết hạn, request API trả 401 → client tự gọi /refresh để lấy
pair mới (refresh cũ bị vô hiệu ngay).
3. Password hash — tốc độ vs an toàn
Hàm hash password tốt phải chậm có chủ đích. Cột tốc độ là thời gian/hash điển hình trên 1 CPU thread; brute-force ước tính cho 1 tỷ (10⁹) lần thử. Nhập password để xem ước tính thời gian bẻ khóa offline.
| Thuật toán | Thời gian/hash | Tốc độ tương đối | An toàn | Brute 10⁹ |
|---|
⚠ Đừng dùng plain / MD5 / SHA-256 cho password. Dùng bcrypt cost 12 hoặc argon2id. "Chậm" là tính năng: user login 1 lần/100ms không sao, nhưng attacker brute-force 10⁹ lần thì tốn hàng năm.