2017-04-17 24 views

Trả lời

15

JWT không có lợi ích khi sử dụng "phiên" mỗi lần nói. JWT cung cấp một phương tiện duy trì trạng thái phiên trên máy khách thay vì thực hiện nó trên máy chủ.

gì người ta thường có nghĩa là khi yêu cầu này là

Với phiên server-side "những lợi ích của việc sử dụng JWTs qua sử dụng phiên phía máy chủ là gì" bạn hoặc sẽ phải để lưu trữ các định danh phiên trong một cơ sở dữ liệu hoặc giữ nó trong bộ nhớ và đảm bảo rằng máy khách luôn truy cập cùng một máy chủ. Cả hai đều có nhược điểm. Trong trường hợp của cơ sở dữ liệu (hoặc lưu trữ tập trung khác), điều này trở thành một nút cổ chai và một điều cần duy trì - về bản chất là một truy vấn bổ sung được thực hiện với mọi yêu cầu.

Với một giải pháp trong bộ nhớ bạn giới hạn tỉ lệ ngang của bạn, và các buổi sẽ bị ảnh hưởng bởi các vấn đề mạng (khách hàng chuyển vùng giữa Wifi và dữ liệu di động, máy chủ khởi động lại, vv)

Moving phiên cho khách hàng có nghĩa là bạn loại bỏ sự phụ thuộc vào một phiên phía máy chủ, nhưng nó áp đặt các thách thức riêng của nó.
- Lưu trữ mã thông báo an toàn
- vận chuyển an toàn
- JWTs Phiên đôi khi có thể khó làm mất hiệu lực.
- Tin tưởng khiếu nại của khách hàng.

Các vấn đề này được chia sẻ bởi JWT và các cơ chế phiên phía máy khách khác nhau.

JWT cụ thể là địa chỉ cuối cùng trong số này. Có thể giúp hiểu JWT là gì:

Đó là một chút thông tin. Đối với phiên người dùng, bạn có thể bao gồm tên người dùng và thời gian mã thông báo hết hạn. Nhưng nó có thể hình dung được bất cứ điều gì, ngay cả ID phiên hoặc toàn bộ hồ sơ của người dùng. (Vui lòng không làm điều đó) Nó có chữ ký bảo mật ngăn các bên độc hại tạo mã thông báo giả (Bạn cần truy cập khóa riêng của máy chủ để ký tên và bạn có thể xác minh rằng chúng không bị sửa đổi sau khi đã ký) Bạn gửi cho họ mọi yêu cầu, giống như cookie hoặc Authorization Tiêu đề sẽ được gửi. Trong thực tế, chúng thường được gửi trong tiêu đề HTTP Authorization nhưng việc sử dụng cookie cũng tốt.

Mã thông báo được ký và do đó máy chủ có thể xác minh nguồn gốc của nó. Chúng tôi sẽ giả định rằng máy chủ tin tưởng khả năng của mình để ký một cách an toàn (bạn nên sử dụng một thư viện chuẩn: đừng cố gắng tự mình thực hiện và bảo mật máy chủ đúng cách)

Về vấn đề này với việc gửi mã thông báo một cách an toàn thường được gửi qua kênh được mã hóa, thường là httpS.

Về lưu trữ an toàn mã thông báo trong ứng dụng khách, bạn cần đảm bảo rằng những kẻ xấu không thể truy cập được. Điều này (chủ yếu) có nghĩa là ngăn chặn JS từ các trang web xấu từ đọc mã thông báo để gửi lại cho họ. Điều này được giảm nhẹ bằng cách sử dụng các chiến lược tương tự được sử dụng để giảm thiểu các loại tấn công XSS khác.

Nếu bạn có nhu cầu làm mất hiệu lực JWT, chắc chắn bạn có thể đạt được những cách này.Lưu trữ kỷ nguyên cho mỗi người dùng chỉ cho những người dùng đã yêu cầu "chấm dứt các phiên khác của họ" là một phương pháp rất hiệu quả có thể sẽ đủ tốt. Nếu một ứng dụng cần vô hiệu hóa mỗi phiên, thì ID phiên có thể được duy trì theo cùng một cách và bảng "mã thông báo bị giết" vẫn có thể được duy trì nhỏ hơn nhiều so với bảng người dùng đầy đủ (Bạn chỉ cần giữ lại các bản ghi mới hơn Vì vậy, khả năng làm mất hiệu lực mã thông báo một phần phủ nhận lợi ích của các phiên phía máy khách trong đó bạn sẽ phải duy trì trạng thái bị giết phiên này. Điều này sẽ nhiều hơn khả năng là một bảng nhỏ hơn nhiều so với bảng trạng thái phiên ban đầu, do đó, các tra cứu vẫn hiệu quả hơn mặc dù.

Một lợi ích khác của việc sử dụng mã thông báo JWT là việc triển khai thực hiện dễ dàng bằng cách sử dụng các thư viện có sẵn trong mọi ngôn ngữ bạn có thể mong đợi. Nó cũng hoàn toàn bị ly dị khỏi sơ đồ xác thực người dùng ban đầu của bạn - nếu bạn di chuyển sang hệ thống dựa trên ngón tay, bạn không cần thực hiện bất kỳ thay đổi nào đối với lược đồ quản lý phiên.

Một lợi ích tinh tế hơn: Vì JWT có thể mang "thông tin" và điều này có thể được truy cập bởi ứng dụng khách, bây giờ bạn có thể bắt đầu thực hiện một số việc thông minh. Ví dụ: nhắc nhở người dùng rằng phiên của họ sẽ hết hạn một vài ngày trước khi họ đăng xuất, cung cấp cho họ tùy chọn xác thực lại, dựa trên ngày hết hạn trong mã thông báo. Bất cứ điều gì bạn có thể tưởng tượng.

Vì vậy, trong ngắn hạn: JWTs trả lời một số câu hỏi và thiếu sót của các kỹ thuật phiên khác.
1. Xác thực "rẻ hơn" vì bạn có thể loại bỏ một chuyến đi vòng DB (hoặc ít nhất có một bảng nhỏ hơn nhiều để truy vấn!), Mà lần lượt cho phép khả năng mở rộng ngang.
2. Xác nhận quyền sở hữu của khách hàng giả mạo.

Trong khi JWT không trả lời các vấn đề khác như lưu trữ hoặc vận chuyển an toàn, nó không giới thiệu bất kỳ vấn đề bảo mật mới nào.

Rất nhiều phiền toái tồn tại xung quanh JWT nhưng nếu bạn thực hiện cùng một bảo mật mà bạn sẽ cho các loại xác thực khác, bạn sẽ ổn.

Lưu ý cuối cùng: Đây cũng không phải là Cookie so với Thẻ. Cookies là một cơ chế để lưu trữ và vận chuyển các bit thông tin và có thể được sử dụng để lưu trữ và vận chuyển các thẻ JWT.

+0

Cám ơn TL của bạn; DR trả lời! : D – Pourya8386

4

Câu trả lời ngắn gọn là: Không có gì.

Bản dài hơn là:

tôi thực hiện JWTs để quản lý phiên sau khi đọc đề nghị này trong the GraphQL docs:

Nếu bạn không quen thuộc với bất kỳ của các cơ chế xác thực, chúng tôi khuyên bạn sử dụng express-jwt vì nó đơn giản mà không phải hy sinh mọi tính linh hoạt trong tương lai.

Triển khai thực sự đơn giản vì nó chỉ thêm một chút phức tạp. Sau một thời gian tuy nhiên, tôi (như bạn) bắt đầu tự hỏi những lợi ích là gì. Hóa ra có rất ít (hoặc có thể không có) cho JWT như xa như quản lý phiên đi, như bài viết trên blog này giải thích một cách chi tiết:

Stop using JWT for sessions

+1

Đối số hấp dẫn, cảm ơn bạn đã liên kết. – Tom

Các vấn đề liên quan