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ả.

HEADER · thuật toán
(chưa có token)
PAYLOAD · claims
(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).

⏱ t = 0 phút
Access (15') Refresh (60')

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ánThời gian/hashTốc độ tương đốiAn toànBrute 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.