(sinh ra từ chủ đề này vì đây thực sự là một câu hỏi của riêng nó và không dành riêng cho NodeJS, v.v.)
Tôi đang triển khai máy chủ REST API có xác thực và tôi đã triển khai thành công xử lý mã thông báo JWT để người dùng có thể đăng nhập thông qua điểm cuối / đăng nhập bằng tên người dùng / mật khẩu, trên đó mã thông báo JWT được tạo từ bí mật máy chủ và được trả về khách hàng. Sau đó, mã thông báo được chuyển từ máy khách đến máy chủ trong mỗi yêu cầu API được xác thực, trên đó bí mật máy chủ được sử dụng để xác minh mã thông báo.
Tuy nhiên, tôi đang cố gắng tìm hiểu các phương pháp hay nhất để biết chính xác cách thức và mức độ mã thông báo nên được xác thực để tạo ra một hệ thống thực sự an toàn. Chính xác thì những gì nên liên quan đến việc "xác thực" mã thông báo? Có đủ để chữ ký có thể được xác minh bằng cách sử dụng bí mật của máy chủ hay tôi cũng nên kiểm tra chéo mã thông báo và / hoặc trọng tải mã thông báo với một số dữ liệu được lưu trữ trong máy chủ?
Hệ thống xác thực dựa trên mã thông báo sẽ chỉ an toàn bằng cách chuyển tên người dùng / mật khẩu trong mỗi yêu cầu với điều kiện là việc lấy mã thông báo sẽ khó hơn hoặc bằng cách lấy mật khẩu của người dùng. Tuy nhiên, trong các ví dụ tôi đã thấy, thông tin duy nhất cần thiết để tạo mã thông báo là tên người dùng và bí mật phía máy chủ. Điều này không có nghĩa là giả sử trong một phút rằng một người dùng độc hại có được kiến thức về bí mật máy chủ, giờ đây anh ta có thể tạo ra các mã thông báo thay mặt cho bất kỳ người dùng nào , do đó có quyền truy cập không chỉ vào một người dùng nhất định như thực tế nếu có mật khẩu thu được, nhưng trên thực tế cho tất cả các tài khoản người dùng?
Điều này đưa tôi đến những câu hỏi:
1) Việc xác thực mã thông báo JWT có nên được giới hạn trong việc xác minh chữ ký của chính mã thông báo, chỉ dựa vào tính toàn vẹn của bí mật máy chủ hoặc đi kèm với cơ chế xác thực riêng?
Trong một số trường hợp, tôi đã thấy việc sử dụng kết hợp mã thông báo và phiên máy chủ, khi đăng nhập thành công qua điểm cuối / đăng nhập, một phiên được thiết lập. Yêu cầu API xác thực mã thông báo và cũng so sánh dữ liệu đã giải mã được tìm thấy trong mã thông báo với một số dữ liệu được lưu trữ trong phiên. Tuy nhiên, sử dụng phiên có nghĩa là sử dụng cookie và theo một nghĩa nào đó, nó đánh bại mục đích của việc sử dụng phương pháp dựa trên mã thông báo. Nó cũng có thể gây ra vấn đề cho một số khách hàng.
Người ta có thể tưởng tượng máy chủ lưu giữ tất cả các mã thông báo hiện đang được sử dụng trong một bộ nhớ cache hoặc tương tự, để đảm bảo rằng ngay cả khi bí mật máy chủ bị xâm phạm để kẻ tấn công có thể tạo mã thông báo "hợp lệ", chỉ các mã thông báo chính xác được tạo thông qua điểm cuối / đăng nhập sẽ được chấp nhận. Điều này là hợp lý hay chỉ là dư thừa / quá mức cần thiết?
2) Nếu xác minh chữ ký JWT là phương tiện duy nhất để xác thực mã thông báo, có nghĩa là tính toàn vẹn của bí mật máy chủ là điểm phá vỡ, thì bí mật máy chủ nên được quản lý như thế nào? Đọc từ một biến môi trường và được tạo (ngẫu nhiên?) Một lần cho mỗi ngăn xếp được triển khai? Được làm mới lại hoặc xoay vòng theo định kỳ (và nếu vậy, cách xử lý các mã thông báo hợp lệ hiện có đã được tạo trước khi xoay vòng nhưng cần được xác thực sau khi xoay vòng, có lẽ là đủ nếu máy chủ giữ bí mật hiện tại và trước đó tại bất kỳ thời điểm nào) ? Thứ gì khác?
Có lẽ tôi chỉ đơn giản là quá hoang tưởng khi nói đến nguy cơ bí mật máy chủ bị xâm phạm, đó tất nhiên là một vấn đề chung hơn cần được giải quyết trong tất cả các tình huống mật mã ...
RSAPrivateKey privateKey
??