2016-01-08 46 views
6

Tôi đang cố gắng hiểu token-based authentication những ngày này, tuyên bố là phương thức stateless authentication. Và tôi đã gặp khái niệm về stateless web application.Ứng dụng web không quốc tịch, một huyền thoại đô thị?

Dưới đây là một số bài tôi đọc về:

Lúc đầu, tôi đã vui mừng ở đây ý kiến. Nhưng ngày càng nhiều, tôi nghĩ rằng statelesspseudo-proposition. Ví dụ: giả sử chúng tôi sử dụng mã thông báo do khách hàng lưu trữ để xác thực, làm cách nào chúng tôi có thể thống kê người dùng trực tuyến (giả sử không có nhật ký)? Chúng ta sẽ lưu mã thông báo trong DB? Điều đó không có nghĩa là chúng tôi lưu trữ thông tin trạng thái trên máy chủ? Và thậm chí nhiều hơn, là thông tin người dùng đơn giản như tên, tuổi, vv trong DB cũng có một số loại thông tin trạng thái?

Tôi nghĩ câu hỏi thực sự ở đây không phải là làm cho một ứng dụng web không quốc tịch, nhưng để làm cho ứng dụng web xử lý đúng thông tin trạng thái sao cho nó sẽ không gây nguy hiểm cho khả năng mở rộng.

đó phụ thuộc vào cách giải thích từ stateless:

  1. ứng dụng Web không có nhà nước.
  2. Hoặc ứng dụng web không lưu trữ trạng thái chính nó.

Tôi thích 2 vì luôn có thể có một số inevitable global state (được trích dẫn từ nhận xét của @ deceze cho câu trả lời của anh ấy). Và bất kể chúng tôi lưu trữ thông tin trạng thái dưới dạng lưu trữ web HTML 5 hoặc tiêu đề HTTP hoặc trường biểu mẫu ẩn hoặc Cookie, trạng thái vẫn tồn tại. Chỉ rằng nó được lưu trữ ở đâu đó khác với trên máy chủ.

Tôi có thiếu thứ gì đó tuyệt vời không? Ai có thể làm sáng tỏ điều này để tôi có thể thoát khỏi cuộc đấu tranh tinh thần này?

ADD 1

Chỉ cần đọc về cuốn sách RESTful Web Services bởi Leonard Richardson. Trong chương 4, ở cuối phần Statelessness, nó phân loại trạng thái thành Application StateResource State. Vì vậy, thông tin người dùng đơn giản và dữ liệu tôi đã đề cập trước đây như hình ảnh, v.v ... có thể được phân loại là Resource State. Và những gì stateless đề cập đến là Application State. Vì vậy, nó không phá vỡ mã không quốc tịch để lưu trữ resource state trên máy chủ.

Nhưng cuốn sách cũng đề cập đến trường hợp trong đó an application key is used to restrict how many times a user can invoke a web service. Nó thừa nhận rằng thông tin đó không thể được lưu trữ ở phía máy khách. Và phải lưu trữ nó ở phía máy chủ sẽ phá vỡ mã không quốc tịch và giới thiệu vấn đề về mối quan hệ phiên. Nó tuyên bố không quốc tịch có thể tránh vấn đề quan hệ phiên nhưng không giải thích như thế nào.Tôi thực sự không thấy trạng thái phi trạng thái có thể xử lý tình huống này như thế nào. Bất cứ ai cũng có thể làm sáng tỏ ở đây?

+1

Ứng dụng web không trạng thái là gì? Bạn lấy từ đó từ đâu? Tôi chỉ biết kết nối/giao thức không quốc tịch. – freakish

+0

@freakish cảm ơn bạn đã trả lời. Tôi đọc nó từ một số chủ đề. Tôi tóm tắt một vài ở đây: http://stackoverflow.com/questions/34651801/how-to-make-stateless-web-applications-especially-with-spring-mvc – smwikipedia

+0

Tôi nghĩ rằng nếu bạn viết ra danh sách các nhược điểm statefull bạn sẽ có thể xác định những gì không trạng thái, phải không? Nhưng những nhược điểm đó là chủ quan, đó là lý do tại sao không có định nghĩa rõ ràng. –

Trả lời

10

"trạng thái" chỉ thực sự đề cập đến trạng thái giữa máy khách và máy chủ. Tất nhiên máy chủ sẽ lưu trữ dữ liệu và về mặt kỹ thuật, bạn có thể thấy bất kỳ sửa đổi nào của bất kỳ dữ liệu nào trên máy chủ là "trạng thái thay đổi". Do đó một ứng dụng "không quốc tịch" theo nghĩa này làm cho hoàn toàn không có ý nghĩa thực tế.

Điều gì "không quốc tịch" là liệu máy chủ có ở bất kỳ thời điểm cụ thể nào trong trạng thái cho phép một khách hàng cụ thể gửi yêu cầu cụ thể đến nó hay không.

Hãy xem xét: với phiên đăng nhập dựa trên cookie truyền thống, máy chủ chỉ là trong trạng thái chấp nhận yêu cầu từ khách hàng trong thời gian giới hạn; miễn là phiên hiện tại là hợp lệ. Khách hàng không thể dự đoán được bao lâu. Bất cứ lúc nào, yêu cầu từ khách hàng có thể không thành công, vì một số trạng thái trên máy chủ đã hết thời gian chờ. Trong trường hợp này, máy khách cần đặt lại trạng thái của máy chủ bằng cách đăng nhập lại.

Tương phản điều này với xác thực dựa trên mã thông báo. Mã thông báo phải hợp lệ vô thời hạn. Nó chủ yếu là một sự thay thế cho một tên người dùng và mật khẩu. Vì mục đích thảo luận, chỉ cần giả định khách hàng gửi tên người dùng và mật khẩu của họ với mọi yêu cầu. Điều này có nghĩa là mọi yêu cầu có thể được xác thực dựa trên giá trị riêng của nó, không yêu cầu máy chủ phải ở trong một số trạng thái "thời gian" cụ thể.

Lý do tại sao bạn sử dụng thẻ thay vì tên người dùng và mật khẩu là gồm hai phần:

  1. bạn có thể ủy quyền cho nhiều khách hàng sử dụng cùng một tài khoản, nhưng mỗi với các thông tin được quản lý riêng của họ
  2. bạn không muốn gửi "mật khẩu chính" qua lại theo yêu cầu

Tất nhiên máy chủ sẽ cần phải theo dõi mã thông báo được tạo và xác thực dựa vào một số cơ sở dữ liệu với từng yêu cầu. Đó là một chi tiết triển khai không liên quan. Điều này không khác với việc sử dụng cookie phiên; tuy nhiên, vì mã thông báo có giá trị vô thời hạn, các yêu cầu có thể được lưu vào bộ nhớ cache dễ dàng hơn thay vì cần phải sao chép kho lưu trữ phiên tạm thời.

Một đối số tiềm năng cuối cùng cần đếm ngược: sự khác nhau giữa phiên không xác định và mã thông báo không xác định là gì và điểm khác biệt khi phiên kết thúc so với khi mã thông báo có thể bị thu hồi?
Khi phiên kết thúc, nó có thể được thiết lập lại bằng một số "thông tin đăng nhập chính" khác (đăng nhập lại). Một mã thông báo có thể/chỉ nên kết thúc khi bị thu hồi chủ động, tương tự như thu hồi ủy quyền truy cập dịch vụ hoàn toàn cho thông tin xác thực chính và không phải là một phần của luồng ứng dụng thông thường.


Nói chung hơn: tương phản giao thức HTTP không trạng thái với giao thức trạng thái như FTP. Trong FTP, máy chủ và máy khách cần phải giữ trạng thái chia sẻ đồng bộ. Ví dụ, giao thức FTP có, trong số nhiều thứ khác, lệnh CWD để thay đổi thư mục làm việc hiện tại. Tức là, có một khái niệm về thư mục mà một khách hàng "đang ở" tại bất kỳ thời điểm nào. Các lệnh tiếp theo hoạt động khác nhau tùy thuộc vào thư mục nào đang ở. Đó là trạng thái có trạng thái. Bạn không thể tự ý gửi các lệnh mà không nhận thức được trạng thái đó, nếu không bạn sẽ không thể dự đoán kết quả sẽ là gì.


Stateless truyền thông client/server đơn giản hoá các mặt hàng đầu tiên của tất cả, kể từ khi khách hàng có thể giả định bất cứ lúc nào để có thể yêu cầu bất cứ điều gì của máy chủ, mà không cần phải biết bang của máy chủ ("phiên của tôi vẫn hoạt động hay không?", "thư mục nào sẽ tác động này?"). Nó có thể giúp mở rộng việc triển khai máy chủ vì chỉ có thông tin tĩnh cần được nhân rộng giữa tất cả các máy chủ, thay vì một nhóm phiên thay đổi liên tục và các dữ liệu liên quan của chúng.


Về mặt kiến ​​trúc, mục tiêu của bạn nên có càng nhiều thành phần stateless càng tốt. Điều này sẽ đơn giản hóa việc mở rộng quy mô. Ví dụ: nếu máy chủ web của bạn đang lưu trữ một phiên lưu trữ cục bộ, điều đó làm cho việc mở rộng máy chủ web của bạn trở thành rất nhiều trường hợp sau một trình cân bằng tải/CDN rất khó. Một cải tiến là tập trung kho lưu trữ phiên thành cơ sở dữ liệu độc lập; bây giờ bạn có thể có một số máy chủ web không quốc tịch biết cách lấy dữ liệu (bao gồm dữ liệu phiên) từ đâu đó và có thể hiển thị mẫu, nhưng nếu không có thể hoán đổi cho nhau hoàn toàn.

Tuy nhiên, một cửa hàng phiên phải được giữ đồng bộ hóa hoàn hảo trên tất cả mọi người đang cố gắng truy cập, điều này gây khó khăn cho việc chia tỷ lệ . Tokens cải thiện điều này bằng cách thực hiện thay đổi dữ liệu ít hơn (chỉ khi thẻ được thêm hoặc xóa), có nghĩa là bạn có thể sử dụng cơ sở dữ liệu được phân phối hoặc cơ chế sao chép đơn giản khác nếu bạn muốn có nhiều cửa hàng mã thông báo trong nhiều vị trí và/hoặc làm cho dữ liệu đó có thể lưu vào bộ nhớ cache.

+0

Cảm ơn bạn đã trả lời. Bởi bây giờ, tôi nghĩ rằng có một số ** không thể tránh khỏi ** giá cho khả năng mở rộng. Là người không quốc tịch chỉ có thể giảm giá mà không giảm giá. Nếu ứng dụng được thiết kế là không trạng thái (ngoại trừ phần mã thông báo), chỉ thông tin mã thông báo cần được chú ý khi mở rộng quy mô, đơn giản hơn nhiều so với việc sao chép dữ liệu phiên tạm thời. (btw, tôi đã nêu bật một phần câu trả lời của bạn). – smwikipedia

+1

Phải, bất kỳ "trạng thái toàn cầu" nào thường là nút cổ chai trong khả năng mở rộng. Điều đó có nghĩa là lưu trữ dữ liệu cần nhất quán trên toàn cầu. Dữ liệu trong cửa hàng đó càng thường xuyên thay đổi thì càng khó cập nhật dữ liệu trong tất cả các trường hợp. Do đó, loại bỏ càng nhiều càng tốt để ở lại với càng nhiều thành phần không trạng thái càng tốt. – deceze

4

OK, tôi không nghĩ rằng cụm từ ứng dụng web không quốc tịch có ý nghĩa gì. Điều gì làm cho cảm giác là giao thức không quốc tịch. Và giao thức không quốc tịch là một giao thức xử lý từng yêu cầu một cách độc lập.

Vì vậy, trong trường hợp của bạn nếu bạn gửi một mã thông báo xác thực với mỗi yêu cầu hơn là yêu cầu không quốc tịch. Đó là cách xác thực HTTP được cho là hoạt động.

Mặt khác, nếu bạn chỉ gửi mã xác thực một lần và mỗi yêu cầu liên tiếp sẽ không phải (ví dụ vì máy chủ biết rằng kết nối TCP này đã được xác thực) thì điều này có nghĩa là mỗi yêu cầu phụ thuộc vào yêu cầu xác thực . Điều này làm cho giao thức có trạng thái.

giao thức không quốc tịch được dễ dàng hơn để mở rộng quy mô, dễ dàng hơn để proxy vv

Bây giờ như đối với các ứng dụng web thuật ngữ có thể hoặc không thể làm cho cảm giác tùy thuộc vào định nghĩa. Tôi không biết bất kỳ hợp lý mặc dù.

Lưu ý bên: là trạng thái/trạng thái không liên quan đến việc chia sẻ dữ liệu giữa máy khách và máy chủ.

1

Tôi không nghĩ rằng xác thực không quốc tịch và các ứng dụng không quốc tịch có liên quan theo cách bạn nghĩ; từ không trạng thái đang được sử dụng trong hai ngữ cảnh khác nhau ở đây.

Xác thực không quốc tịch là một phương pháp xác định ai là khách hàng không mang bất kỳ thông tin/trạng thái nào từ yêu cầu hoặc tương tác của khách hàng trước đó, không giống như cookie chẳng hạn.

Ứng dụng web không quốc tịch? Chắc chắn, họ có thể, nhưng nó hoàn toàn phụ thuộc hay không dữ liệu người dùng phải được duy trì, có nghĩa là, nó thực sự phụ thuộc vào các ứng dụng trong câu hỏi.

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