Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
JWT (JSON Web Token) xuất hiện trong hầu hết hướng dẫn về xác thực API hiện đại. Nó tiện, nhưng cũng bị dùng sai khá nhiều. Hiểu cấu trúc và giới hạn của JWT giúp bạn dùng nó đúng chỗ và tránh những lỗ hổng phổ biến.
JWT là chuỗi gồm ba phần cách nhau bằng dấu chấm: header.payload.signature, mỗi phần mã hóa base64url.
{"alg":"HS256","typ":"JWT"}.sub (chủ thể, thường là id người dùng), exp (thời điểm hết hạn), iat (thời điểm phát hành), cùng dữ liệu tùy chỉnh.Điểm hay bị hiểu lầm: payload chỉ được mã hóa base64, không được bảo mật. Bất kỳ ai có token đều đọc được nội dung. Vì vậy tuyệt đối không đặt mật khẩu hay thông tin nhạy cảm vào đó. Chữ ký chỉ đảm bảo toàn vẹn, không đảm bảo bí mật.
Authorization: Bearer <token> ở các request sau.Vì server không cần lưu trạng thái phiên, JWT được gọi là xác thực phi trạng thái (stateless), thuận lợi khi hệ thống có nhiều server.
const jwt = require('jsonwebtoken');const SECRET = process.env.JWT_SECRET; // chuỗi dài, ngẫu nhiên// Tạo token sống 15 phútconst token = jwt.sign({ sub: user.id, role: user.role }, SECRET, { algorithm: 'HS256', expiresIn: '15m',});// Kiểm tra trong middlewarefunction auth(req, res, next) { const raw = (req.get('Authorization') || '').replace('Bearer ', ''); try { req.user = jwt.verify(raw, SECRET, { algorithms: ['HS256'] }); next(); } catch (e) { res.status(401).json({ error: 'Token không hợp lệ hoặc đã hết hạn' }); }}Lưu ý chỉ định rõ danh sách thuật toán được chấp nhận khi xác minh, để tránh tấn công đánh lừa thuật toán (ví dụ chấp nhận alg: none).
Vấn đề lớn nhất của JWT: một khi đã phát hành, bạn khó thu hồi trước khi hết hạn vì server không lưu trạng thái. Cách làm phổ biến:
Nếu cần đăng xuất ngay hoặc khóa tài khoản tức thì, bạn có thể duy trì danh sách token bị thu hồi, nhưng như thế đã mất một phần lợi thế phi trạng thái.
Lưu ở localStorage dễ bị đánh cắp nếu trang dính lỗ hổng XSS. Cookie với cờ HttpOnly, Secure và SameSite an toàn hơn trước XSS nhưng cần cân nhắc bảo vệ CSRF. Không có lựa chọn hoàn hảo, quan trọng là hiểu đánh đổi và chống XSS thật tốt.
JWT hợp với API được gọi bởi ứng dụng di động, SPA hoặc giữa các dịch vụ, nơi muốn xác thực không cần tra trạng thái. Với website truyền thống một server, session phía server thường đủ tốt, dễ thu hồi và ít rủi ro hơn. Đừng chọn JWT chỉ vì nó phổ biến.
Một payload gọn gàng thường chỉ chứa vài claim cần thiết, ví dụ id người dùng, vai trò, thời điểm phát hành và hết hạn. Hãy tránh kiểu nhét cả hồ sơ người dùng vào token; mỗi request đều mang theo token đó nên kích thước lớn gây lãng phí băng thông, và dữ liệu trong token sẽ cũ nếu hồ sơ thay đổi. Nếu cần thông tin chi tiết, hãy tra theo id khi xử lý request. Khi gỡ lỗi, bạn có thể giải mã phần payload bằng bất kỳ công cụ base64 nào để xem claim, nhưng chỉ làm với token của chính mình trong môi trường phát triển, và đừng dán token thật của hệ thống production lên các trang web bên thứ ba.
JWT là công cụ hữu ích khi hiểu đúng: ký để toàn vẹn chứ không để giấu, sống ngắn, kèm cơ chế làm mới và thu hồi hợp lý. Hãy tự tạo và giải mã một token trên trang công cụ debug JWT hoặc bằng code để thấy rõ ba phần của nó.
Nếu muốn luyện tập cùng bài tập thực tế, hãy ghé các khóa học tại codebem.com khi bạn sẵn sàng.
Nguyễn Đình Cường
0 comment