JWT và câu chuyện Revoke Token

I. GIỚI THIỆU

JWT (JSON Web Token) được sinh ra như một công cụ giúp truyền tải thông tin giữa client và server một cách bảo mật, nhất là trong các hệ thống stateless. Tuy nhiên, cũng với tính stateless khiến việc revoke token trở thành thách thức, nhất là trong các tình huống như:

  • Cần thu hồi token khi hệ thống bị tấn công.
  • Giới hạn số thiết bị hoặc phiên đăng nhập cùng lúc.
  • Thu hồi quyền truy cập của một số user nhất định.

JWTstateless, nên bản thân nó không dựa vào server. Muốn revoke một JWT, chúng ta cần tùy biến cách xử lý. Bài viết này tôi sẽ chia sẻ một số phương pháp và phân tích ưu nhược điểm của chúng.

II. NHỮNG QUAN ĐIỂM VÀ TRANH LUẬN VỀ LƯU TRỮ TOKEN

Rất nhiều thảo luận xoay quanh việc “có nên lưu token lên server hay không?”. Một số người cho rằng việc này làm mất đi bản chất stateless của JWT, trong khi đối lập lại cho rằng không lưu token sẽ không thể revoke được. -> Dưới đây là một số giải pháp thường gặp và đánh giá về từng phương pháp.

  • Lưu Full Token Lên Database: Mỗi JWT được lưu trực tiếp lên database. Khi có yêu cầu revoke, server xóa token khỏi database và từ chối các request mang token đó.
    • Ưu điểm: Đơn giản, dễ hiểu.
    • Hạn chế: Đánh mất tính stateless, tăng nguy cơ bị tấn công (lộ full token tương đương việc lộ mật khẩu plain text). Trong hệ thống microservice, leak database của một component đồng nghĩa hacker có đầy đủ quyền truy cập.
  • Lưu Chữ Ký Số Token: Thay vì lưu full JWT, server chỉ lưu phần chữ ký số (signature) của token. Khi nhận được request, server verify chữ ký số xem token đã bị revoke hay chưa.
    • Ưu điểm: Giảm dung lượng lưu trữ, tăng bảo mật (không để lộ payload).
    • Hạn chế: Vẫn phải truy vấn database mỗi request, ảnh hưởng đến hiệu suất.
  • Lưu JWT ID Lên Database: Mỗi token được gán một ID duy nhất (jti) trong payload. Server chỉ cần lưu ID này và đánh dấu token đã revoke hay chưa.
    • Ưu điểm: Tối ưu bảo mật, tiết kiệm dung lượng lưu trữ.
    • Hạn chế: Đồng bộ hệ thống sinh ID duy nhất, vẫn bị ảnh hưởng hiệu suất khi truy vấn database.

III. SUGGEST GIẢI PHÁP KHÁC (NẾU KHÔNG LƯU TOKEN)

Nếu không chấp nhận các nhược điểm của các giải pháp trên, ta có thể:

Thiết Lập Thời Gian Hết Hạn Ngắn

  1. Thiết lập thời gian hết hạn ngắn cho JWT.
  2. Lưu refresh token trong blacklist bằng Redis để tăng tốc truy vấn-> Redis cung cấp tính năng backup dữ liệu, đảm bảo an toàn khi hệ thống gặp sự cố.
  3. Thường xuyên xóa refresh token hết hạn trong danh sách đen để tiết kiệm bộ nhớ.

Thay Đổi Cặp Key

Trong trường hợp cần vô hiệu hóa hết tất cả jwt, ta có thể thay đổi cặp private key – public key trên server để vô hiệu hoá tất cả JWT đã cấp phát. Tuy nhiên, giải pháp này cần thận trọng để tránh ảnh hưởng đến người dùng.

Kết Luận

-> Việc đề xuất giải pháp xử lý token phụ thuộc vào yêu cầu nghiệp vụ. Nếu sử dụng JWT, hãy tận dụng tính stateless của nó để giảm tải cho server. Trên đây là một số giải pháp thường gặp, hy vọng ae có thêm góc nhìn trong việc xây dựng hệ thống bảo mật.

Published by Nhat Truong

Hi

Leave a comment