JWT co ban
🚀 Cách Invalidate JWT trong Backend API bằng Redis Blacklist – .NET
Làm thế nào để vô hiệu hóa JWT Access Token ngay khi người dùng logout?
Một trong những ưu điểm của JWT (JSON Web Token) là Backend API có thể xác thực token mà không cần truy vấn database ở mỗi request. Tuy nhiên, JWT thường là stateless, nên khi token đã được phát hành, việc logout không tự động làm token mất hiệu lực.
Vậy làm thế nào để invalidate JWT ngay lập tức mà không cần chờ Access Token hết hạn?
Một giải pháp phổ biến là kết hợp JWT + Refresh Token + Redis Blacklist.
🔹 1. Ứng dụng này làm gì?
Ứng dụng Backend API được xây dựng với các chức năng:
-
Đăng ký và đăng nhập người dùng.
-
Sinh
accessTokenvàrefreshToken. -
Cấp mới Access Token thông qua Refresh Token.
-
Logout và vô hiệu hóa Access Token.
-
Bảo vệ API bằng cơ chế xác thực JWT.
-
Sử dụng Redis để lưu danh sách Access Token bị thu hồi, với TTL tương ứng thời gian hết hạn của token.
🔹 2. Cơ chế invalidate JWT khi logout
Khi người dùng thực hiện logout, Backend xử lý hai bước chính:
Bước 1: Thu hồi Refresh Token
Xóa hoặc đánh dấu Refresh Token đã bị thu hồi trong database để ngăn phiên đăng nhập đó tiếp tục sử dụng Refresh Token để cấp Access Token mới.
Bước 2: Đưa Access Token vào Redis Blacklist
Lưu định danh của Access Token vào Redis cùng TTL tương ứng với thời gian còn lại trước khi token hết hạn.
Ví dụ:
-
Access Token còn hạn 15 phút.
-
Người dùng logout.
-
Backend thêm token vào Redis Blacklist với TTL 15 phút.
-
Những request tiếp theo sử dụng token này sẽ bị từ chối.
Khi TTL kết thúc, Redis tự động xóa khóa blacklist, tránh lưu trữ dữ liệu không cần thiết.
🔹 3. Luồng xử lý request
Khi client gọi một API được bảo vệ, Backend thực hiện:
-
Kiểm tra chữ ký JWT và các claim cần thiết.
-
Kiểm tra thời hạn của Access Token.
-
Kiểm tra token có nằm trong Redis Blacklist hay không.
-
Nếu token hợp lệ và chưa bị thu hồi, cho phép tiếp tục xử lý request.
-
Nếu token hết hạn hoặc nằm trong blacklist, từ chối truy cập.
Lưu ý: Redis Blacklist nên lưu một định danh như jti hoặc hash của token thay vì lưu nguyên JWT. Nếu sử dụng jti, cần bảo đảm token có định danh duy nhất và kiểm tra blacklist theo đúng định danh đó.
🔹 4. Kiến trúc đề xuất
Client
|
| Login
v
Backend API
|
|-- Generate Access Token
|-- Generate Refresh Token
|
+----> Database (Refresh Token)
+----> Redis (Token Blacklist)
Client
|
| Logout
v
Backend API
|
|-- Revoke Refresh Token
|-- Add Access Token ID to Redis
|
v
Access Token Invalidated
🔹 5. Vì sao nên dùng Redis Blacklist?
✅ Invalidate ngay lập tức: Không phải chờ Access Token hết hạn.
✅ Hiệu năng tốt: Redis hỗ trợ tra cứu theo key nhanh, phù hợp với các API có lượng request lớn.
✅ Tự động dọn dữ liệu: TTL giúp blacklist chỉ tồn tại trong khoảng thời gian token còn hiệu lực.
✅ Phù hợp kiến trúc Microservices: Nhiều Backend API có thể dùng chung Redis để kiểm tra trạng thái thu hồi token, nếu được cấu hình và phân quyền phù hợp.
🔹 6. Một số lưu ý khi triển khai production
-
Luôn kiểm tra chữ ký,
iss,aud,expvà các claim cần thiết của JWT. -
Chỉ đưa token hợp lệ vào blacklist khi logout.
-
Tính TTL dựa trên thời gian hết hạn thực tế của token.
-
Không cho phép cấp mới Access Token bằng Refresh Token đã bị thu hồi.
-
Với hệ thống có nhiều thiết bị đăng nhập, cần quản lý Refresh Token theo từng session để logout một thiết bị không ảnh hưởng các thiết bị khác.
-
Nếu Redis gặp lỗi, cần có chính sách fail-closed hoặc xử lý lỗi phù hợp với yêu cầu bảo mật; không nên âm thầm bỏ qua kiểm tra blacklist.
Lưu ý quan trọng: Redis Blacklist không loại bỏ hoàn toàn tính stateless của JWT. Nó bổ sung một bước kiểm tra trạng thái thu hồi, đổi lại khả năng vô hiệu hóa token ngay lập tức.
🎯 Kết luận
Nếu hệ thống sử dụng JWT nhưng vẫn cần logout an toàn, JWT + Refresh Token + Redis Blacklist là một phương án đáng cân nhắc.
Giải pháp này cân bằng giữa hiệu năng, khả năng mở rộng và yêu cầu thu hồi token ngay lập tức trong Backend API.
Bạn đang triển khai JWT Authentication cho .NET 8 Web API, Microservices hay API Gateway Ocelot? Hãy chia sẻ cách bạn đang xử lý logout và revoke token nhé!
#DotNet #DotNetCore #NET8 #BackendDevelopment #JWT #Redis #Authentication #Authorization #WebAPI #Microservices #Security #RefreshToken