Chương 12 • Bài 2

JWT Security

Lý thuyết và Thực hành tương tác trực tiếp

📖 Hướng dẫn & Lý thuyết

1. Tổng quan về JWT

JWT dùng để chứng thực (Authentication) và phân quyền (Authorization). JWT gồm 3 phần: Header.Payload.Signature.

Phần Payload chỉ mã hóa Base64 nên ai cũng có thể đọc được. Do đó không bao giờ lưu mật khẩu ở đây. Phần Signature dùng để Server kiểm tra token có bị hacker sửa đổi hay không.

2. Demo Code: Tạo REST API login

Khi username/password đúng, Server ký token với SECRET_KEY và trả về cho Client.

// Ký token (server.js)
const payload = { userId: 1, username: 'admin', role: 'admin' };
const token = jwt.sign(payload, 'SECRET_KEY', { expiresIn: '5m' });
res.json({ token });

3. Demo Code: Decode JWT

Frontend nhận Token và dễ dàng xem nội dung Payload bằng JavaScript thuần túy.

// Decode Token (app.js)
const parts = token.split('.'); // Tách 3 phần
const payloadBase64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');
const jsonPayload = JSON.parse(decodeURIComponent(atob(payloadBase64)));
console.log(jsonPayload);

4. Demo Code: Fix (Verify Signature & Check Role)

Khi Client gọi API bảo vệ, Server bắt buộc phải xác thực (Verify) chữ ký và thời hạn. Sau đó đối chiếu Role thực tế dưới Database.

// Middleware Verify Token (server.js)
jwt.verify(token, 'SECRET_KEY', (err, decoded) => {
    if (err) return res.status(403).json({ msg: 'Token lỗi hoặc hết hạn' });
    
    // Check role từ DB để tránh trường hợp bị giáng quyền
    const userInDB = db.find(u => u.id === decoded.userId);
    if (userInDB.role !== 'admin') {
        return res.status(403).json({ msg: 'Chỉ Admin mới được phép!' });
    }
    
    next(); // Cho phép đi tiếp
});

🛠 Thực Hành 2: Decode Payload

Kết quả Decode (Không cần Secret Key):

Chưa có dữ liệu

🛠 Thực Hành 3: Thử sửa Token (Giả mạo)

Bạn hãy thử sửa vài ký tự trong chuỗi Token ở dưới đây (giả làm Hacker):

🛠 Thực Hành 4: Gửi Token tới Server

Lấy dữ liệu bảo mật (Yêu cầu Token hợp lệ & Quyền Admin).