Tìm kiếm trang web

bảo mật - xác thực chữ ký token JWT trong javascript


Tôi đang tạo một client javascript kết nối với một API sử dụng token JWT. Ở phía máy chủ không có vấn đề gì, tôi có thể tạo token, ký nó và sau đó xác minh chữ ký để đảm bảo rằng không ai thay đổi token.

Nhưng làm thế nào tôi thực hiện điều này phía client. Tôi chỉ có thể giải mã token JWT và xem header, payload và signature. Nhưng làm thế nào tôi xác minh chữ ký ở phía client? Có thư viện nào cho việc này không, làm thế nào tôi chuyển khóa công khai sang client?

Nếu tôi không xác minh chữ ký thì làm sao tôi biết token không bị giả mạo?

Câu trả lời #1

nếu tôi không xác thực chữ ký ở phía client thì làm thế nào tôi có thể đảm bảo rằng token thực sự từ server? Có thể có ai đó ở giữa đang thay đổi token

Việc xác thực chữ ký không ngăn chặn được tấn công Man In The Middle. Kẻ tấn công có thể nghe lén kênh để lấy thông tin xác thực hoặc thay đổi tin nhắn ngay cả khi sử dụng các token hợp lệ

Sử dụng kênh SSL/TLS (https)

Nếu tôi không xác minh chữ ký thì làm sao tôi biết token không bị giả mạo?

Một mã thông báo do máy chủ được TLS tin cậy cung cấp có thể hợp lệ (nó có thể đã bị thay đổi trong bộ nhớ cục bộ). Bạn có thể xác thực chữ ký. Hoạt động này thường được thực hiện phía máy chủ (xem câu trả lời của @sakuto), nhưng bạn có thể thực hiện nó hoàn toàn trong trình duyệt.

Nhưng làm sao tôi kiểm tra chữ ký tại trang khách hàng?

Đây là các bước

  1. Tải khóa công khai từ một máy chủ đáng tin cậy
  2. trích xuất chữ ký từ JWT và giải mã nó (base64url)
  3. xác minh chữ ký số bằng cách sử dụng thư viện mã hóa

Tôi đề nghị sử dụng Webcrypto. Xem ví dụ về việc nhập khóa RSA và xác thực tại đây: https://github.com/diafygi/webcrypto-examples/blob/master/README.md#rsassa-pkcs1-v1_5

Câu trả lời số 2

Bạn thường không thực hiện kiểm tra xác thực phía client, cũng như không lưu trữ dữ liệu quan trọng trên token. Mọi quyền kiểm soát và quyền truy cập đều được kiểm tra ở phía back-end. Điều này có nghĩa là ngay cả khi người dùng giả mạo token của mình, họ cũng sẽ không thể vượt qua các kiểm soát của back-end, chỉ có thể thấy thêm một tùy chọn trên giao diện phía trước.