JWT là gì và tại sao nó lại quan trọng?

Chào bạn, chúng ta hãy bắt đầu hành trình tìm hiểu về JSON Web Token (JWT). Hãy coi nó như một chiếc "thẻ căn cước kỹ thuật số" nhỏ gọn và an toàn. Nó cho phép các dịch vụ trong hệ thống của bạn tin tưởng lẫn nhau mà không cần phải hỏi đi hỏi lại "bạn là ai?". Điều này đặc biệt quan trọng trong kiến trúc microservices, nơi các dịch vụ cần giao tiếp liên tục với nhau.

JWT vs. Session-based Authentication

Đây là câu hỏi gợi mở quan trọng: “Bạn nghĩ tại sao JWT lại được ưa chuộng hơn session-based authentication trong microservices?”. Bảng so sánh dưới đây sẽ cho bạn câu trả lời rõ ràng nhất.

Xác thực dựa trên Session

Cách tiếp cận "stateful" (có trạng thái).

  • Lưu trữ: Server phải lưu trữ thông tin phiên (session) của người dùng.
  • Phụ thuộc: Các yêu cầu phải được kiểm tra với kho lưu trữ session.
  • Khả năng mở rộng: Khó mở rộng theo chiều ngang vì cần đồng bộ session giữa các server.
  • Ví dụ: Giống như việc bạn gửi xe và nhận một vé xe. Bảo vệ phải giữ lại cuống vé để đối chiếu.

Xác thực dựa trên JWT

Cách tiếp cận "stateless" (phi trạng thái).

  • Lưu trữ: Server không cần lưu gì cả. Mọi thông tin nằm trong token.
  • Tự chứa: Token mang theo thông tin người dùng và quyền hạn.
  • Khả năng mở rộng: Rất dễ mở rộng. Bất kỳ server nào cũng có thể xác thực token.
  • Ví dụ: Giống như bạn có một tấm thẻ VIP. Bất kỳ cửa hàng nào trong chuỗi cũng có thể nhận ra bạn mà không cần gọi về tổng đài.

Giải Phẫu một JWT

Một JWT bao gồm 3 phần, được phân tách bởi dấu chấm: Header.Payload.Signature. Hãy nhấp vào từng phần để xem bên trong có gì nhé!

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJyb2xlcyI6WyJBRE1JTiIsIlVTRVIiXX0.w3x_v0i-ax32iN2j3iE-E3a3b_x-C3b3a2a8c9d0e1f

Chọn một phần để khám phá

Luồng Hoạt Động của JWT

JWT hoạt động theo một quy trình rất logic. Hãy cùng theo dõi từng bước, từ lúc người dùng đăng nhập cho đến khi họ nhận được dữ liệu từ một API được bảo vệ. Nhấn "Bước Tiếp Theo" để xem luồng di chuyển.

👤

1. Client

Người dùng đăng nhập

🏢

2. Server

Xác thực & Cấp Token

💾

3. Client

Lưu trữ Token

📤

4. Client

Gửi yêu cầu với Token

🛡️

5. Server

Xác minh Token

📦

6. Server

Trả về dữ liệu

Triển Khai với Spring Boot

Bây giờ là phần thú vị nhất: áp dụng lý thuyết vào thực tế! Đây là cách bạn tích hợp JWT vào một ứng dụng Spring Boot. Tôi sẽ chỉ cung cấp các đoạn mã cốt lõi để bạn tập trung vào tư duy. Hãy chuyển qua lại giữa các tab để xem từng phần nhé.

Bảo Mật Tối Ưu (Best Practices)

Sử dụng JWT rất mạnh mẽ, nhưng "quyền lực lớn đi kèm với trách nhiệm lớn". Để đảm bảo hệ thống của bạn an toàn, hãy luôn ghi nhớ những nguyên tắc vàng sau. Hãy di chuột qua các thẻ để xem chi tiết.

Thời gian sống ngắn

Luôn đặt thời gian hết hạn (expiration time - `exp`) cho Access Token ngắn (ví dụ: 15-60 phút) để giảm thiểu rủi ro nếu token bị lộ.

Sử dụng Refresh Token

Dùng Refresh Token có thời gian sống dài hơn để lấy Access Token mới, giúp người dùng không phải đăng nhập lại liên tục.

Không lưu thông tin nhạy cảm

Payload của JWT có thể bị giải mã dễ dàng. Tuyệt đối không lưu mật khẩu, số thẻ tín dụng hay thông tin cá nhân nhạy cảm trong đó.

Luôn dùng HTTPS

Mọi giao tiếp phải được mã hóa qua HTTPS để ngăn chặn kẻ gian nghe lén và đánh cắp token trên đường truyền.

Lưu trữ Token an toàn

Ở phía client, ưu tiên lưu JWT trong cookie `HttpOnly` và `Secure` để chống lại các cuộc tấn công XSS.

Cơ chế thu hồi Token

Xây dựng một danh sách đen (blacklist) các token đã bị vô hiệu hóa (ví dụ khi người dùng đăng xuất) để ngăn chặn việc tái sử dụng.

Tình Huống Thực Tế: Hệ Thống Đặt Món Ăn

Hãy xem cách JWT tỏa sáng trong một hệ thống microservices đặt món ăn. Sơ đồ này minh họa luồng xác thực từ client đến các dịch vụ backend thông qua API Gateway. Nhấp vào các mũi tên để xem JWT đóng vai trò gì ở mỗi bước.

📱

Client App

🚪

API Gateway

👤
User Service
🍔
Order Service

Nhấp vào một mũi tên để xem chi tiết luồng.