[Hỏi] Cách sử dụng JsonWebToken để bảo mật API



  • Nếu không lưu ở server để so sánh, mình đặt thử 1 trường hợp như sau:

    • Người dùng X login và server sinh ra token T trả về cho người dùng X để các lần sau thực hiện request.
    • Hacker Y lấy được token T của người X và thực hiện các request.
      Giả sử có lưu trữ server thì người dùng X logout ra và token T sẽ bị xóa, hacker Y kia dùng token T không còn giá trì gì nữa.
      Mình nghĩ phải lưu lại token, chứ chỉ decode thành công token được gửi lên thì vẫn chưa bảo mật lắm.


  • @Bui-Minh-Phong Uhm phải lưu lại token, để nếu logout thì phải xóa đi.
    Vì json webtoken có chỉ encrypt và decrypt thui nên nó k kiểm tra được token có phải là của một người gửi không.
    Còn phải làm thêm 1 cái để refresh token nữa.

    Trong trường hợp người dùng đang dùng thì token expired.



  • Cảm ơn bạn nhé :D



  • Về cơ bản thì JWT nó cũng giống như việc sử dụng session thuần túy nhưng giảm thiểu số lượng request đến server.

    • Việc tạo Token thì bạn không cần mã hóa cũng được, chuỗi này có thể đặt random vài chục ký tự cùng việc set thời gian sống cho mỗi token.
    • Ở phía DB bạn lưu token bao gồm cả thông tin user luôn để sau lòa được token thì có thêm ít thông tin dùng luôn :).
    • Về token thì mình nghĩa bạn check và set time expired thui k cần xóa sau mình còn theo dõi login.
    • Nếu nói về bảo mật thì khi mất token, coi như người dùng tạch rùi :v.


  • Mình cũng mới tìm hiểu nên nhiều thứ còn chưa nắm rõ hết. Bạn giải thích giúp mình lý do cần đặt thời gian sống cho mỗi token được không? Mình thấy cứ người dùng login thì sinh token và trả lại cho họ, khi họ logout thì xóa token trong database đi, biết bao nhiêu mà đặt thời gian sống cho token?
    Cảm ơn bạn.



  • @Bui-Minh-Phong Sinh token cần có data của user A + secret key từ server, nên token đại diện cho user A đó. Khi bị lấy mất token thì rõ ràng người lấy token đó cũng chỉ sử dụng được dưới danh nghĩa của user A. Nếu ứng dụng của bạn có nhiều cái nhạy cảm thì jwt ko đảm bảo được, phải dùng thêm nhiều lớp bảo mật khác như bảo mật 2 lớp, ...
    Đặt expire time ko có nhiều ý nghĩa vì fb hay google bạn dùng có bao giờ nó bắt login lại ko nếu ko có gì đặc biệt xảy ra.
    Lưu db cũng ko cần thiết vì token linh hoạt, 1 user dùng nhiều device có thể có nhiều token, ko cần quan tâm.



  • Vậy chỉ cần decode token thành công là cho phép xử lý tiếp ak. Không lưu vào database thì giả sử user A dùng token của user B vẫn thực hiện được truy vấn ak?



  • @Bui-Minh-Phong Bạn có thể miêu tả rõ cách lưu token vào db được không. Mình cũng không thấy bảo mật nhưng không biết làm ntn ?



  • Mình đang làm là trong database lưu user thêm một trường nữa là token. Khi sinh token sẽ lưu luôn vào. Khi nhận request thì decode token thành công rồi kiểm tra xem token đó có tồn tại và ứng với user đó không thì mới xử lý tiếp.



  • @Bui-Minh-Phong em sẽ làm thêm event xóa token trong db khi logout. Mình hiểu rồi. cảm ơn bạn



  • Khi login mình sẽ xóa. Mình thấy làm thế API sẽ bảo mật hơn đôi chút rồi :D


Log in to reply