Làm thế nào để giữ cho các ứng dụng không trạng thái


97

Đây có thể là một câu hỏi phức tạp, nhưng tôi đang cố gắng để hiểu rõ hơn về tình trạng không quốc tịch.

Dựa trên những gì tôi đã đọc, các ứng dụng web sẽ không trạng thái, nghĩa là mỗi yêu cầu được coi là một giao dịch độc lập. Do đó, nên tránh Phiên và Cookies (vì cả hai đều có trạng thái). Một cách tiếp cận tốt hơn là sử dụng Tokens, không trạng thái vì không có gì được lưu trữ trên máy chủ.

Vì vậy, tôi đang cố gắng để hiểu, làm thế nào các ứng dụng web có thể không trạng thái khi có dữ liệu được lưu giữ cho phiên của tôi (chẳng hạn như các mặt hàng trong giỏ hàng)? Đây có thực sự được lưu trữ trong một cơ sở dữ liệu ở đâu đó và sau đó định kỳ bị thanh trừng? Làm thế nào để nó hoạt động khi bạn đang sử dụng mã thông báo thay vì cookie?

Và sau đó là một câu hỏi liên quan, các trang web lớn (Amazon, Google, Facebook, Twitter, v.v.) có thực sự không trạng thái? Họ có sử dụng mã thông báo hoặc cookie (hoặc cả hai) không?


38
Gần đây tôi đã thấy và nói chuyện với các nhà phát triển, những người bị ám ảnh bởi tình trạng không quốc tịch đến mức mất tập trung. Thật tuyệt khi không có trạng thái sử dụng lại nhưng không thực tế để theo đuổi mục tiêu đó trong mọi tình huống so với mọi mục tiêu khác trừ khi bạn có rất nhiều tài nguyên để thực hiện điều đó vì một số lý do, như nhân rộng.
Mark Rogers

4
@MarkRogers Tại sao? Không quốc tịch không liên quan gì đến việc tái sử dụng. Và không quốc tịch không dẫn đến một nỗ lực cao hơn.
Paul Wasilewski

3
@PaulWasilewski: Và việc không quốc tịch không dẫn đến nỗ lực cao hơn. => nó có, với một ứng dụng trạng thái, bạn giữ mọi thứ trong bộ nhớ gắn liền với phiên. Điều này không có quy mô tốt, mặc dù hoạt động với ghim phiên, nhưng nó RẤT đơn giản. Khi các máy chủ cần bắt đầu trao đổi thông tin giữa nhau, rắc rối bắt đầu.
Matthieu M.

6
Nhìn vào amazon, bạn sẽ nhận thấy rằng giỏ hàng của bạn vẫn còn ngay cả khi bạn thay đổi máy tính, vì vậy nó không được lưu trữ trong cookie, mà là trong cơ sở dữ liệu.
njzk2

20
Nếu bạn không đi xung quanh để đọc câu trả lời của tôi. Đây là phiên bản ngắn: Các yêu cầu web vốn đã không trạng thái. Các ứng dụng web thì không. (Không có vấn đề gì với những người theo chủ nghĩa giáo điều "web không trạng thái" nói với bạn!)
svidgen

Câu trả lời:


95

"Các ứng dụng web nên không trạng thái" nên được hiểu là "các ứng dụng web nên không trạng thái trừ khi có một lý do rất chính đáng để có trạng thái" . Một "giỏ hàng" là một tính năng mang tính trạng thái theo thiết kế và phủ nhận rằng nó khá phản tác dụng. Toàn bộ điểm của mẫu giỏ hàng là duy trì trạng thái của ứng dụng giữa các yêu cầu.

Một thay thế mà tôi có thể tưởng tượng là một trang web không trạng thái thực hiện giỏ hàng sẽ là một ứng dụng một trang giữ cho giỏ hàng hoàn toàn ở phía khách hàng, lấy thông tin sản phẩm bằng các cuộc gọi AJAX và sau đó gửi nó đến máy chủ cùng một lúc người dùng thực hiện kiểm tra Nhưng tôi nghi ngờ tôi đã từng thấy ai đó thực sự làm điều đó, bởi vì nó không cho phép người dùng sử dụng nhiều tab trình duyệt và không giữ trạng thái khi họ vô tình đóng tab. Chắc chắn, có những cách giải quyết như sử dụng localst Storage, nhưng sau đó bạn lại có trạng thái, chỉ trên máy khách thay vì trên máy chủ.

Bất cứ khi nào bạn có một ứng dụng web yêu cầu duy trì dữ liệu giữa các lần xem trang, bạn thường làm điều đó bằng cách giới thiệu các phiên. Phiên yêu cầu thuộc về có thể được xác định bằng cookie hoặc bằng tham số URL bạn thêm vào mỗi liên kết. Cookie nên được ưu tiên vì chúng giữ URL của bạn tiện dụng hơn và ngăn người dùng của bạn vô tình chia sẻ URL với id phiên của họ trong đó. Nhưng việc có mã thông báo URL làm dự phòng cũng rất quan trọng đối với người dùng tắt cookie. Hầu hết các khung phát triển web đều có hệ thống xử lý phiên có thể thực hiện việc này.

Về phía máy chủ, thông tin phiên thường được lưu trữ trong cơ sở dữ liệu. Bộ nhớ đệm phía máy chủ là tùy chọn. Nó có thể cải thiện đáng kể thời gian phản hồi, nhưng sẽ không cho phép bạn chuyển phiên giữa các máy chủ khác nhau. Vì vậy, bạn sẽ cần một cơ sở dữ liệu liên tục như một dự phòng.

các trang web lớn (Amazon, Google, Facebook, Twitter, v.v.) có thực sự không trạng thái? Họ có sử dụng mã thông báo hoặc cookie (hoặc cả hai) không?

Họ có cho phép bạn đăng nhập không? Khi bạn đóng tab và truy cập lại trang web, bạn vẫn đăng nhập chứ? Nếu là bạn thì họ đang sử dụng cookie để giữ danh tính của bạn giữa các phiên.


46
Tôi nghĩ một trong những nhầm lẫn ở đây là sự khác biệt giữa "ứng dụng web" theo nghĩa rộng của phối cảnh người dùng và "ứng dụng web" theo nghĩa hẹp là "mã chạy trên máy chủ web". Đó là cái sau thường được cho là không trạng thái không phải là cái trước. Như bạn nói, không có nghĩa là trước đây không có trạng thái nói chung vì nhà nước thường là một phần của logic kinh doanh. Để sau này không trạng thái đơn giản có nghĩa là trạng thái cần được lưu trữ trên máy khách hoặc máy chủ cơ sở dữ liệu hoặc cả hai và không phải trên máy chủ web.
Derek Elkins

16
"[...] nhưng sau đó bạn lại có trạng thái, chỉ trên máy khách thay vì trên máy chủ." Đó là về việc không có nhà nước ở phía máy chủ, để đạt được khả năng mở rộng và khả dụng tốt hơn. Nếu một trạng thái được lưu trữ ở phía khách hàng không thành vấn đề.
Paul Wasilewski

5
@ njzk2 bạn có thể giải thích sao cho điều này không có vẻ vô lý? Người dùng không vào Amazon để mua thêm tên. Và, sau khi họ mua hàng, một thứ gì đó biến mất chỉ tồn tại khi họ đang mua sắm. Nếu cái gì đó không phải là "trạng thái của ứng dụng", thì nó là gì? Nếu các ứng dụng không có trạng thái, chúng có gì?

3
@nocomprende: Tôi nghĩ ý chính chung của njzk2 là nội dung của giỏ hàng của bạn, giống như tên đầy đủ của bạn, là dữ liệu mà một ứng dụng web vẫn tồn tại ở phía máy chủ. Khi mọi người nói, "webapps nên không trạng thái", chúng thường có nghĩa khác với "webapps không nên truy cập cơ sở dữ liệu chứa tên đầy đủ của bạn được liên kết với tên người dùng của bạn". Một cách chính xác những gì họ làm có ý nghĩa bởi "không quốc tịch" có lẽ không được trivially xác định, kể từ khi bạn có cơ sở dữ liệu rằng có tất cả các loại vô nghĩa mà bạn có thể tồn tại ở đó, để hỗ trợ nhà nước ứng dụng quá phức tạp, nhưng không nên ;-)
Steve Jessop

4
@nocomprende: xắp xếp lại một quả trứng bằng cách khôi phục cơ sở dữ liệu: vì ứng dụng web của chúng tôi không trạng thái nên nó có thể tiếp tục như trước ;-)
Steve Jessop

56

Đúng là các ứng dụng web nên không trạng thái. Tuy nhiên, các biến phiên, cookie và mã thông báo không vi phạm điều này khi tất cả chúng được lưu trữ trên máy khách (trình duyệt web). Chúng có thể là các tham số trong yêu cầu.

Đây là một mô hình đơn giản hóa:

Web Browser (has state) <-> Web Server (stateless) <-> Database (has state)

Điều này có thể làm việc cho Trao đổi ngăn xếp kỹ thuật phần mềm . Câu trả lời này tôi đang gõ là một phần của trạng thái trình duyệt web của tôi. Chừng nào đó là nơi duy nhất ở đó, thì không ai có thể truy cập được ngoài tôi. Nhưng ngay khi tôi nhấn Post your Answertrình duyệt của tôi sẽ gửi nó đến máy chủ web. Máy chủ web xử lý bài đăng không sử dụng trạng thái của chính nó. Nó học tôi là ai từ trình duyệt của tôi và từ cơ sở dữ liệu. Khi kiểm tra xong bài đăng của tôi và thêm nó vào cơ sở dữ liệu, máy chủ web sẽ nhanh chóng quên tôi.

Đó là những gì không quốc tịch. Máy chủ không chịu trách nhiệm ghi nhớ bất kỳ điều này. Đó không phải là công việc của nó.

Làm điều này có nhiều lợi thế. Nếu máy chủ web bị rò rỉ bộ nhớ thì có thể phát hiện được vì dấu chân bộ nhớ của nó không nên tăng lên. Nếu máy chủ web gặp sự cố, danh tính của tôi không đi cùng với nó. Nếu ai đó cố gắng thực hiện tấn công từ chối dịch vụ, họ không thể sử dụng tài nguyên trạng thái máy chủ web để thực hiện, vì máy chủ web không phân bổ bất kỳ trạng thái nào cho họ giữa các phiên. Đây là tất cả nhằm mục đích làm cho máy chủ web ổn định. Theo cách đó, khi nó bắt đầu chạy, nó vẫn chạy.

Bây giờ chắc chắn, tôi đang tiêu thụ tài nguyên trong cơ sở dữ liệu, nhưng những tài nguyên đó trước tiên đã được kiểm tra dựa trên trợ cấp của tôi bởi một thứ ổn định mà chúng ta có thể tin tưởng để bảo vệ cơ sở dữ liệu khỏi web hoang dã: máy chủ web không thực thi quy tắc.


8
Tôi không biết ... Câu trả lời này nghe có vẻ giống như nói: " Excel không lưu trữ bảng tính của bạn, ổ đĩa thì có!" Ha ha, không phải là một phần cơ sở dữ liệu của máy chủ web, theo như hầu hết mọi người có liên quan? Rõ ràng trạng thái không được lưu trữ trong CPU hoặc mã của máy chủ và việc giữ tất cả trong bộ nhớ là khá ngớ ngẩn.

7
@nocomprende Không, cơ sở dữ liệu thường không phải là một phần của máy chủ web của bạn. Có, trạng thái lưu trữ trong cơ sở dữ liệu hoàn toàn có thể hạn chế khả năng mở rộng của ứng dụng tổng thể, nhưng có khá ít ứng dụng có thể giảm tải tất cả trạng thái của chúng (hoặc thậm chí tất cả trạng thái "trên mỗi người dùng") trên máy khách. Các máy chủ cơ sở dữ liệu được thiết kế đặc biệt để xử lý có thể mở rộng trạng thái và, như CandiedOrange đề cập, chúng thường được bảo vệ, cung cấp và hiệu đính tốt hơn so với các máy chủ web. Có những lợi ích để có thể dễ dàng mở rộng quy mô máy chủ web mặc dù điều đó không giải quyết được tất cả các vấn đề về khả năng mở rộng.
Derek Elkins

9
@nocomprende: Điểm nói rằng cơ sở dữ liệu không phải là một phần của máy chủ web là bạn có thể có một cơ sở dữ liệu (hoặc cụm cơ sở dữ liệu) cho 1, 2, 3, .... máy chủ web. Đây là cách không trạng thái có nghĩa là tăng khả năng mở rộng: bạn có thể mở rộng quy mô cụm cơ sở dữ liệu và số lượng máy chủ web một cách độc lập.
Matthieu M.

6
"Đúng là các ứng dụng web nên không trạng thái." Không. Điều này hoàn toàn vô nghĩa.
svidgen

4
Câu trả lời này là câu tôi thích nhất vì nó minh họa rõ nhất cách sử dụng "không trạng thái" trong web dev. Máy chủ không duy trì trạng thái giữa các yêu cầu. Tất cả trạng thái phải đến từ máy khách (nghĩa là một phần của yêu cầu) hoặc từ cơ sở dữ liệu (có thể dựa trên yêu cầu). Bên cạnh đó, thường có một số trạng thái trong ứng dụng web (ví dụ: các trường hợp tĩnh của công cụ), nhưng nói chung, bạn muốn thiết kế mọi thứ không trạng thái. Câu trả lời này có vẻ tốt hơn câu trả lời được chấp nhận vì thực sự giải thích ý tưởng về trạng thái không trạng thái tốt nhất.
Kat

30

các ứng dụng web nên không trạng thái

Vô lý. Yêu cầu web nên không trạng thái. Hay chính xác hơn, các yêu cầu web không trạng thái.

Nhưng, nói rằng toàn bộ ứng dụng nên không trạng thái là hoàn toàn vô nghĩa.

mỗi yêu cầu được coi là một giao dịch độc lập.

Vâng, chính xác . Hay chính xác hơn là có, nhất thiết phải có . Qua HTTP, mỗi yêu cầu vốn đã độc lập với tất cả các yêu cầu khác. Việc thêm "trạng thái" vào HTTP yêu cầu bạn xác định rõ ràng, lưu trữ và truy xuất "trạng thái" cho mỗi yêu cầu "trạng thái". Và điều đó đòi hỏi nỗ lực, giảm hiệu suất và thêm phức tạp.

Và, vì những lý do đó, mỗi yêu cầu thể không trạng thái "nên" là không trạng thái.

Do đó, nên tránh Phiên và Cookies (vì cả hai đều có trạng thái). Cách tiếp cận tốt hơn là sử dụng Tokens

Một vài điều: Mã thông báo cũng có thể được gắn với lưu trữ phiên. Cookies không cần phải được gắn với lưu trữ phiên. Mã thông báo thường được lưu trữ trong cookie. Và, đôi khi một phiên chỉ đơn giản là công cụ phù hợp cho công việc.

Điều đó có nghĩa là ít nhất , đôi khi , phiên và cookie cũng "tốt hơn" như mã thông báo!

[Mã thông báo] không trạng thái vì không có gì được lưu trữ trên máy chủ.

Vâng, đó là nó. Đó là những gì giáo điều "không quốc tịch" thực sự là về. Mặc dù, rõ ràng, đó không phải là về việc lưu trữ "không có gì" trên máy chủ, mà là về việc không lưu trữ trạng thái phiên trên máy chủ.

Hộp thư đến Gmail của tôi đang ở trạng thái chẳng hạn. Và nó tốt hơn nên được lưu trữ trên máy chủ! Nhưng, đó không phải là trạng thái phiên .

Vì vậy, thay vì có một máy chủ có thể nhận một số nhận dạng nhỏ và tìm ra bạn là ai, các ứng dụng không trạng thái muốn được nhắc nhở bạn là ai và bạn đang làm gì với mọi yêu cầu đẫm máu. Trạng thái ứng dụng vẫn tồn tại, khách hàng chỉ chịu trách nhiệm giữ nó.

Bây giờ, nếu trạng thái đó là nhỏ, điều đó có thể ổn. Trong một số trường hợp, nó rất tốt.

Và sau đó, tất nhiên, có những điều chúng ta chỉ đơn giản mong đợi là trạng thái ...

làm thế nào các ứng dụng web có thể không trạng thái khi có dữ liệu được lưu giữ cho phiên của tôi (chẳng hạn như các mặt hàng trong giỏ hàng)? Đây có thực sự được lưu trữ trong một cơ sở dữ liệu ở đâu đó và sau đó định kỳ bị thanh trừng?

Hai lựa chọn. Hoặc là bạn có một phiên, hoặc bạn đang từ chối!

... Nhưng nghiêm túc đấy. Bạn thường không lưu trữ một giỏ hàng trong một cookie. Một cái gì đó như giỏ hàng sẽ được lưu trữ trong phiên "truyền thống" hoặc nó sẽ được lưu trữ dưới dạng Cartđối tượng, với một số loại ID mà máy chủ sử dụng để kéo nó vào các yêu cầu tiếp theo. Kiểu như một .. uhh ... ... err ... phiên.

Thực sự nghiêm túc: Có một mức độ lớn mà "tính trạng thái" chỉ là cái mà chúng ta gọi nó khi hai tác nhân giao tiếp có thể bối cảnh hóa các tin nhắn trong một cuộc trò chuyện. Và một phiên, theo truyền thống được hiểu, chỉ là những gì chúng ta thường gọi là cơ chế mà điều này xảy ra.

Tôi tranh luận rằng, bất kể bạn sử dụng mã thông báo hay "phiên", cho mỗi yêu cầu máy chủ của bạn xử lý, bạn cần phải bối cảnh hóa yêu cầu đó để thực hiện nó, hoặc bạn không. Nếu bối cảnh không cần thiết, đừng lấy nó. Nếu bối cảnh cần thiết, tốt hơn bạn nên có nó gần đó!

Và sau đó là một câu hỏi liên quan, các trang web lớn (Amazon, Google, Facebook, Twitter, v.v.) có thực sự không trạng thái? Họ có sử dụng mã thông báo hoặc cookie (hoặc cả hai) không?

Có lẽ là cả hai. Nhưng, nói chung, họ làm chính xác những gì bạn làm: Họ đặt cookie để xác định các bản ghi "trạng thái" trong cơ sở dữ liệu "phiên" lớn.

Khi có thể, tôi nghi ngờ họ chuyển các khiếu nại nhận dạng cơ bản vào các "mã thông báo" ngắn hạn để tránh sự tranh chấp không cần thiết trên bộ lưu trữ tập trung. Nhưng, thực tế là nhiều dịch vụ trong số này cho phép tôi "đăng xuất khỏi tất cả các địa điểm khác" là một chỉ báo tốt cho thấy, nếu họ đang sử dụng mã thông báo, ít nhất họ sẽ được "hỗ trợ" bởi mô hình phiên bán truyền thống .


3
Đồng ý. Nó làm tôi nhớ đến ý tưởng "dữ liệu bất biến". Nếu nó là bất biến, hãy khắc nó trong một tảng đá, đừng lãng phí máy tính để làm điều đó. Hãy để máy tính làm công cụ với dữ liệu! Đó là lý do tại sao chúng tôi xây dựng chúng! Các ứng dụng hoạt động với dữ liệu. Dữ liệu không đổi là vô ích.

@nocomprende FYI, tôi sẽ làm phụ lục cho phần này sau. Tôi cảm thấy như câu trả lời của tôi bị thiếu trong câu hỏi cơ bản của OP. Bởi vì, có một mối quan tâm legit nổi đằng sau những "ứng dụng không quốc tịch" ý tưởng. Nhưng, câu trả lời nằm dọc theo dòng, khi mọi người nói 'không quốc tịch', điều họ muốn nói là 'phụ thuộc tối thiểu vào các phiên phía máy chủ'.
Svidgen

4
@nocomprende: cấu trúc dữ liệu bất biến là một cái gì đó khác biệt và là một công cụ được sử dụng để quản lý vòng đời của các đối tượng bộ nhớ.
whatsisname

1
Yêu dòng giải thích đầu tiên của bạn. Khi chúng ta thảo luận về một cái gì đó, mỗi tuyên bố bằng lời nói chúng ta thực hiện ngay lập tức bị lãng quên. Nhưng bằng cách nào đó, chúng ta vẫn có thể tiếp tục một cuộc trò chuyện, nhỉ? Đó là phép thuật!

1
@nocomprende Đây là một cuộc thảo luận thú vị, nhưng tôi đoán chúng ta không nên tiếp tục nó ở đây.
pabram

14

Trạng thái không nhất thiết là một điều xấu, nhưng bạn cần hiểu sự khác biệt giữa các ứng dụng trạng thái và trạng thái. Nói tóm lại, các ứng dụng trạng thái duy trì thông tin về phiên hiện tại và các ứng dụng không trạng thái thì không. Thông tin được lưu trữ vĩnh viễn như một phần của tài khoản người dùng có thể hoặc không được lưu trữ trong một phiên, nhưng việc lưu trữ thông tin liên quan đến tài khoản người dùng không tự nó làm cho ứng dụng trở nên trạng thái. Tính trạng thái yêu cầu máy chủ duy trì thông tin về phiên của người dùng hiện tại ngoài những gì trình duyệt máy khách đang duy trì. Chẳng hạn, một khách hàng có thể xác thực và được cung cấp một cookie JSESSIONID, sau đó nó sẽ gửi đến máy chủ với mỗi yêu cầu. Nếu máy chủ bắt đầu lưu trữ nội dung trong phạm vi phiên của ứng dụng dựa trên JSESSIONID này, nó sẽ trở thành trạng thái.

Không quốc tịch

Theo trạng thái không trạng thái, chúng tôi có nghĩa là máy chủ và máy khách không duy trì thông tin hiện tại về phiên người dùng. Máy khách và máy chủ có thể sử dụng một số dạng mã thông báo để cung cấp xác thực giữa các yêu cầu, nhưng không có thông tin hiện tại nào khác được lưu trữ. Trường hợp sử dụng thông thường cho giải pháp như vậy có thể là một trang web tin tức nơi hầu hết người dùng (người tiêu dùng mới) sử dụng thông tin nhưng không tạo ra thông tin quay lại trang web. Trong những trường hợp như vậy, trang web không cần duy trì bất kỳ thông tin nào về phiên người dùng hiện tại. Lưu ý rằng trang web vẫn có thể sử dụng cookie để xác định người dùng và lưu trữ thông tin về việc sử dụng trang web của người dùng đó, nhưng điều đó vẫn có thể được coi là không trạng thái vì mọi thứ được ghi có thể là giao dịch, ví dụ như liên kết mà người dùng đã nhấp, có thể được ghi lại bởi máy chủ, nhưng không được duy trì trong phiên người dùng.

Trạng thái trên máy chủ

Trên máy chủ, một ứng dụng trạng thái lưu thông tin trạng thái về người dùng hiện tại. Cách tiếp cận này thường liên quan đến việc sử dụng cookie để xác định hệ thống của người dùng để trạng thái có thể được duy trì trên máy chủ giữa các yêu cầu. Các phiên có thể hoặc không thể được xác thực, tùy thuộc vào ngữ cảnh của ứng dụng. Các ứng dụng máy chủ trạng thái cung cấp lợi thế của bộ nhớ đệm thông tin trạng thái người dùng trên máy chủ, tăng tốc độ tra cứu và thời gian phản hồi trang. Về mặt trái, việc lưu trữ thông tin trong phạm vi phiên là tốn kém, và ở quy mô, nó trở nên rất tốn tài nguyên. Nó cũng tạo ra một vectơ tấn công tiềm năng cho tin tặc thử và chiếm quyền điều khiển phiên định danh và đánh cắp phiên của người dùng. Các ứng dụng máy chủ trạng thái cũng có thách thức trong việc bảo vệ các phiên của người dùng trước các gián đoạn dịch vụ không mong muốn, ví dụ như lỗi máy chủ.

Trạng thái của khách hàng

Sử dụng JavaScript và các công nghệ trình duyệt hiện đại như sessionStorage, giờ đây, ứng dụng có thể dễ dàng lưu trữ thông tin trạng thái về phiên người dùng trên thiết bị của người dùng đó. Nhìn chung, ứng dụng có thể vẫn được coi là trạng thái, nhưng công việc duy trì trạng thái đã được chuyển sang máy khách. Cách tiếp cận này có một lợi thế lớn (đối với người duy trì ứng dụng Web) so với việc duy trì trạng thái trên máy chủ trong đó mỗi người dùng, trên thực tế, duy trì trạng thái của riêng họ và không có gánh nặng nào đối với cơ sở hạ tầng máy chủ. Ở quy mô web, loại lựa chọn kiến ​​trúc đó có tác động rất lớn đối với chi phí phần cứng và điện. Nó có thể có giá hàng triệu đô la một năm để duy trì trạng thái trên máy chủ. Chuyển sang trạng thái duy trì hệ thống trên máy khách sau đó có thể tiết kiệm hàng triệu đô la mỗi năm.

Mã thông báo v. Cookies

Cookies hoạt động như định danh cho các thiết bị / trình duyệt của khách hàng. Chúng có thể được sử dụng để lưu trữ tất cả mọi thứ, nhưng nhìn chung chúng lưu trữ một số dạng định danh, như CFID / CFTOKEN trong các ứng dụng CFML. Cookies có thể được thiết lập để tồn tại trong trình duyệt của người dùng trong một thời gian dài, giúp bạn có thể thực hiện những việc như duy trì xác thực trên một ứng dụng giữa các phiên trình duyệt. Cookies cũng có thể được đặt thành chỉ bộ nhớ để chúng hết hạn khi người dùng đóng trình duyệt.

Mã thông báo nói chung là một số loại thông tin nhận dạng về người dùng được tạo trên máy chủ (sử dụng mã hóa để xáo trộn thông tin), chuyển đến máy khách và trả lại cho máy chủ với yêu cầu tiếp theo. Chúng có thể được chuyển trong tiêu đề của yêu cầu và phản hồi, đây là một mẫu phổ biến trong các ứng dụng trang đơn. Lý tưởng nhất là mỗi yêu cầu / phản hồi dẫn đến việc tạo ra một mã thông báo mới, do đó, các mã thông báo không thể bị chặn và sử dụng sau đó bởi kẻ tấn công.

Ứng dụng trang đơn và trạng thái máy khách

Với các SPA, thông tin trạng thái được tải vào trình duyệt máy khách và được duy trì ở đó. Khi trạng thái thay đổi, ví dụ: bạn đăng cập nhật lên tài khoản truyền thông xã hội của mình, khách hàng sẽ chuyển tiếp giao dịch mới đó đến máy chủ. Trong trường hợp này, máy chủ lưu bản cập nhật đó vào kho lưu trữ dữ liệu liên tục như cơ sở dữ liệu và chuyển tiếp bất kỳ thông tin nào trở lại máy khách mà nó cần để đồng bộ hóa với máy chủ dựa trên bản cập nhật (ví dụ: ID cho bản cập nhật).

Lưu ý rằng mô hình trạng thái lưu trữ này trên máy khách mang lại lợi thế cho trải nghiệm trực tuyến / ngoại tuyến ở chỗ bạn có thể bị ngắt kết nối với máy chủ trong khi vẫn có một ứng dụng có thể sử dụng được. Twitter là một ví dụ điển hình cho trường hợp này, nơi bạn có thể xem lại mọi thứ được tải về phía máy khách trong nguồn cấp dữ liệu Twitter của mình ngay cả khi bạn bị ngắt kết nối với ứng dụng máy chủ Twitter. Mẫu này cũng tạo ra sự phức tạp trong đồng bộ hóa giữa máy chủ và máy khách, là một chủ đề của riêng nó. Sự phức tạp của giải pháp là một sự đánh đổi để có thể duy trì trạng thái trên máy khách.

Tính trạng thái trên máy khách làm cho các ứng dụng web cảm thấy và hoạt động giống như các ứng dụng máy tính để bàn truyền thống. Không giống như các ứng dụng trên máy tính để bàn, thông thường bạn sẽ không tải tất cả thông tin tài khoản của mình vào phiên khách trong trình duyệt. Làm như vậy trong nhiều trường hợp là không thực tế và tạo ra trải nghiệm xấu. Bạn có thể tưởng tượng việc cố gắng tải toàn bộ hộp Gmail vào trình duyệt không? Thay vào đó, khách hàng duy trì thông tin như nhãn / thư mục bạn đang xem và vị trí trong danh sách email trong thư mục mà bạn đang tìm kiếm. Cân bằng những thông tin trạng thái cần duy trì và những gì cần yêu cầu là một thách thức kỹ thuật khác của mẫu này, và một lần nữa, nó thể hiện sự đánh đổi giữa thực tiễn và cung cấp trải nghiệm người dùng tốt.

Giỏ hàng và những thứ tương tự

Đối với các chi tiết cụ thể như giỏ hàng, nó thực sự phụ thuộc vào giải pháp. Một giỏ hàng có thể được lưu trữ trong cơ sở dữ liệu trên máy chủ, nó chỉ có thể được lưu trữ trong phạm vi phiên trên máy chủ hoặc thậm chí có thể được lưu trữ trong máy khách. Amazon có các giỏ mua hàng liên tục cho người dùng đã đăng nhập và giỏ hàng "tạm thời" cho người dùng ẩn danh, mặc dù các giỏ hàng này vẫn tồn tại ở một mức độ nào đó.

Khi bạn nói về một cái gì đó giống như Google, thực sự là một loạt các ứng dụng khác nhau sống dưới cùng một thương hiệu, chúng có thể không chia sẻ một kiến ​​trúc chung và mỗi ứng dụng được xây dựng theo cách đáp ứng tốt nhất nhu cầu của người dùng. Nếu bạn muốn tìm hiểu cách xây dựng một trang web, hãy mở các công cụ dành cho nhà phát triển trong trình duyệt của bạn và xem xét nó. Kiểm tra cookie, xem lưu lượng truy cập mạng và xem cách nó chạy.

Xin lỗi nếu câu trả lời này lan man một chút, nhưng trạng thái là một chủ đề phức tạp.


6

Phiên và cookie không phải tránh. Bạn vẫn có thể có chúng với các ứng dụng web phi trạng thái.

Có một sự khác biệt lớn giữa Java và Ruby on Rails. Các ứng dụng Java sẽ lưu trữ phiên trong bộ nhớ bằng khóa phiên được lưu trữ trong cookie. Điều này là nhanh chóng để lấy trạng thái người dùng và giỏ hàng. Tuy nhiên, bạn phải luôn nhấn cùng một máy chủ với phiên của bạn.

Ứng dụng Rails lưu trữ id người dùng trong một cookie được mã hóa, đã ký. Nó không thể bị giả mạo. Khi bạn tải một trang, ứng dụng web sẽ tìm nạp trạng thái, người dùng và giỏ hàng của bạn từ cơ sở dữ liệu. Điều này chậm hơn, nhưng điều quan trọng là, bạn có thể nhấn bất kỳ trường hợp nào ! Điều này cho phép bạn khởi động lại, chia tỷ lệ, tắt các trường hợp tùy ý. Rât thuận tiện. Nó cũng có thể được thực hiện nhanh hơn với cơ sở dữ liệu bộ nhớ cache được chia sẻ, trong bộ nhớ, như Redis. Hoặc bạn có thể lưu trữ giỏ hàng trong cookie, miễn là nó đủ nhỏ.

Vì vậy, bạn có thể đạt được trạng thái không trạng thái, thông qua các kỹ thuật thông minh và thêm khả năng mở rộng theo ý muốn.


5

Các giao thức là quốc tịch.

Nhưng từ đó, nó không nhất thiết phải tuân theo các ứng dụng sử dụng giao thức nên không trạng thái.

Dưới đây là một số câu trả lời StackOverflow liên quan giải thích rõ sự khác biệt:


5

Khi đề cập đến trạng thái không trạng thái - ví dụ: trong Dịch vụ HTTP RESTful - điều đó sẽ tránh việc lưu trữ trạng thái ở phía máy chủ. Tốt nhất, điều đó cũng bao gồm tránh lưu trữ bất kỳ trạng thái nào trong cơ sở dữ liệu hoặc các kho lưu trữ liên tục khác trên phụ trợ. Để làm rõ, tôi đang nói về một trạng thái không phải là dữ liệu nói chung. Có vẻ như một số kẻ đang trộn lẫn mọi thứ.

Một giao tiếp phi trạng thái có một số lợi ích đặc biệt là về khả năng mở rộng và tính sẵn sàng.

Một cách tiếp cận tốt hơn là sử dụng Tokens, không trạng thái vì không có gì được lưu trữ trên máy chủ.

Điều đó đúng (đối với các giao thức xác thực và ủy quyền nhất định). Mã thông báo có thể (nhưng không phải mỗi lần) cung cấp tất cả thông tin trong yêu cầu cần thiết để xác thực người dùng hoặc ủy quyền cho một hành động. Để biết ví dụ, hãy xem JWT .

Vì vậy, tôi đang cố gắng để hiểu, làm thế nào các ứng dụng web có thể không trạng thái khi có dữ liệu được lưu giữ cho phiên của tôi (chẳng hạn như các mặt hàng trong giỏ hàng)? Đây có thực sự được lưu trữ trong một cơ sở dữ liệu ở đâu đó và sau đó định kỳ bị thanh trừng? Làm thế nào để nó hoạt động khi bạn đang sử dụng mã thông báo thay vì cookie?

Về ví dụ giỏ hàng. Không có vấn đề gì khi lưu trữ tất cả các mục trong giỏ hàng mà không cần sử dụng phiên hoặc cookie. Bạn có thể tìm thấy một ví dụ trên smashingmagazine.com . Nhưng bạn cũng có thể nhận ra một giỏ mua hàng không trạng thái với cookie (ít nhất là nếu loại của bạn không quá lớn và dung lượng 4kb là đủ cho bạn).

Đừng hiểu sai ý tôi, điều đó không có nghĩa là bạn nên triển khai giỏ hàng không trạng thái với bất kỳ giá nào. Amazon hoặc các nền tảng mua sắm trực tuyến lớn khác đang sử dụng các triển khai giỏ hàng có trạng thái vì trải nghiệm người dùng và khả năng sử dụng là quan trọng đối với họ hơn là phù hợp với các yêu cầu phi chức năng kỹ thuật như khả năng mở rộng.

Nói chung, mã thông báo không được sử dụng để lưu trữ thông tin như các mặt hàng trong giỏ hàng. Chúng được sử dụng để xác thực và ủy quyền không quốc tịch.

Và sau đó là một câu hỏi liên quan, các trang web lớn (Amazon, Google, Facebook, Twitter, v.v.) có thực sự không trạng thái? Họ có sử dụng mã thông báo hoặc cookie (hoặc cả hai) không?

Nếu bạn đang hỏi liệu họ có đang sử dụng cookie hoặc mã thông báo để xác thực hay không, câu trả lời là họ sử dụng cả hai. Đối với người dùng, phần lớn cookie cho khách hàng kỹ thuật, phần lớn mã thông báo được sử dụng.


-2

OK, quy tắc bạn trích dẫn là không chính xác về mặt kỹ thuật. Tất cả các lớp của một ứng dụng web có trạng thái.

Mục đích của quy tắc là "không giữ phía máy chủ trạng thái mỗi phiên".

Tức là, các biến phiên trong ASP , thường được sử dụng để làm những việc như các mục trong giỏ / tên người dùng, v.v.

Lý do là bạn sẽ hết bộ nhớ trên máy chủ khi ứng dụng của bạn có được nhiều người dùng hơn. Di chuyển bộ lưu trữ vào cơ sở dữ liệu hoặc bộ đệm chia sẻ không giải quyết được vấn đề vì bạn vẫn còn một nút cổ chai.

Để duy trì trạng thái ứng dụng cho mỗi người dùng mà không gặp phải sự cố này, hãy chuyển trạng thái sang phía máy khách. Ví dụ: đặt các mục trong giỏ vào cookie hoặc bộ lưu trữ phía máy khách nâng cao hơn.

Bởi vì số lượng khách hàng chia tỷ lệ với số lượng người dùng, toàn bộ ứng dụng của bạn sẽ không có nút cổ chai và sẽ mở rộng tốt.


2
Mặc dù rò rỉ bộ nhớ và từ chối các vấn đề dịch vụ là một yếu tố, tôi nghĩ rằng một trình điều khiển quan trọng hơn hiện nay là tính đàn hồi và mạnh mẽ đối với sự thất bại của máy chủ web, tất nhiên, cũng liên quan đến khả năng mở rộng. Ý tưởng là nếu một máy chủ bị quá tải hoặc thậm chí gặp sự cố, tôi chỉ có thể định tuyến lại các yêu cầu trong tương lai (và cẩn thận hơn một chút thậm chí phát lại các yêu cầu không thành công) đến các máy chủ web mới mà không cần phối hợp hoặc mất trạng thái (như người dùng nhìn thấy).
Derek Elkins

hmm loại. Nếu bạn có mỗi thông tin người dùng trên máy chủ, ngay cả khi nó được phân phối, bạn vẫn gặp vấn đề về khả năng mở rộng.
Ewan

Có rất nhiều thứ bạn có thể làm nếu việc kéo dữ liệu từ đĩa là nút cổ chai như bộ nhớ đệm.
JeffO

không, có một vấn đề cố hữu nếu bạn giữ dữ liệu đó trên mỗi phiên. hoặc bạn chuyển nó ra khỏi máy chủ web đến hệ thống có sẵn cao của riêng nó hoặc loại bỏ tất cả cùng nhau bằng cách di chuyển nó đến máy khách
Ewan

1
Tất cả các cuộc thảo luận về việc cố gắng tránh khoai tây nóng thực sự làm tôi bối rối. Bất cứ điều gì đã xảy ra với câu nói cũ, "The buck dừng ở đây"? Một cái gì đó phải quản lý dữ liệu, ngân hàng của tôi sẽ không muốn tôi chỉ giữ tất cả thông tin giao dịch tài chính trên máy tính xách tay của mình. Tại sao mọi người chạy đi la hét từ dữ liệu? Đó là lý do tại sao chúng ta có máy tính! Khùng.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.