2009-09-22 36 views
9

Chúng tôi đang cố gắng quyết định quyết định tốt nhất để duy trì trạng thái trên ứng dụng web của chúng tôi. Chúng tôi có khuynh hướng sử dụng các cookie được mã hóa trên trình duyệt, nhưng một số nhà phát triển của chúng tôi nghĩ rằng chúng tôi nên đi với các biến Session trên máy chủ.Từ quan điểm của Kiến trúc, Cách tiếp cận tốt nhất Phiên [] hoặc Cookie được mã hóa là gì?

Lý do chính khiến tôi nghĩ Cookie là cách tiếp cận tốt nhất chỉ vì chúng tôi sẽ không phụ thuộc vào máy chủ ứng dụng trong tình huống cân bằng tải.

Lý do chính để sử dụng cookie là việc xử lý cookie có thể lộn xộn.

Bạn sẽ làm gì với chủ đề này?

CHỈNH SỬA 1:

Ok. Tôi thấy từ những bài viết đầu tiên mà không phải cách tiếp cận nào là tốt nhất. Vậy thì phương pháp tiếp cận mong muốn sẽ là gì?

Trả lời

5

Có hai vấn đề ở đây. Đầu tiên là sự khác biệt giữa cookie và phiên. Trừ khi bạn đang sử dụng các phiên không nấu ăn (như các ID duy nhất trong URL), phiên chỉ là một cookie với thời gian hết hạn rất ngắn. Bạn có thể dễ dàng cấu hình một ứng dụng chia sẻ phiên trên nhiều máy chủ bằng cách sử dụng một máy chủ bang (ScaleOut, Velocity, SQL Server)

Điều đó tất nhiên giả sử bạn đang sử dụng cookie của người dùng để lưu trữ chỉ là một ID duy nhất, và liên kết lại cho rằng tất cả dữ liệu thực sự trên máy chủ, có thể trong cơ sở dữ liệu. Tuy nhiên:

Lưu trữ dữ liệu nhạy cảm trong cookie của người dùng, ngay cả khi được mã hóa, không thực sự là anbom. Bất cứ khi nào bạn chọn sử dụng mã hóa hai chiều trong ứng dụng của mình, bạn đang gánh chịu một gánh nặng mật mã nặng hơn để duy trì cùng một mức độ bảo mật. Nếu bạn không có một số chuyên môn mã hóa đáng kể theo ý của bạn, nó có lẽ là tốt nhất để có những tuyến đường an toàn và chỉ không làm điều đó.

Vì vậy, trong ngắn hạn, hãy sử dụng phiên tích hợp hoặc cuộn của riêng bạn, hoặc là đảm bảo phần thông tin duy nhất bạn gửi cho khách hàng là ID không thể tránh khỏi mà bạn liên kết với dữ liệu được lưu trữ trên kết thúc của bạn.

Remembering a user with a cookie:

Assign ... một ID tạm thời gắn liền với người dùng rằng, giống như một GUID.Vì GUID là độc đáo về mặt thiên văn và thực tế chống va chạm, chúng hầu như không thể dự đoán hoặc dự đoán từ bên ngoài hệ thống.

Lợi thế để chạy chức năng dựa trên cookie của riêng bạn/"nhớ tôi" là nó cho phép bạn kiểm soát nhiều hơn thời gian thông tin được lưu giữ, phân phối, v.v. Mặt khác, nó đại diện cho nhiều công việc hơn , một số trong đó là thực hiện lại chức năng mà đi ra-of-the-box với ASP.NET Session. Thông thường tôi khuyên bạn nên sử dụng những gì đã có, trừ khi bạn có thể rõ ràng một số yêu cầu kinh doanh lái xe mà loại bỏ đó như là một lựa chọn.

+0

Xin chào Rex, cảm ơn sự ủng hộ và góp ý của bạn. Có thực hành nào tốt nhất để thực hiện các phiên bang không? – Geo

+0

Chọn thuật toán mã hóa chính xác làm cho việc hack mã hóa cực kỳ khó khăn. Nó có nhiều khả năng ai đó sẽ cố gắng sử dụng cookie một cách vô ý để vi phạm hệ thống, nhưng mối đe dọa tồn tại với BẤT CỨ cookie, bao gồm cả cookie auth từ asp.net. –

+0

@Geo chắc chắn, hãy xem phần bổ sung cho câu trả lời của tôi –

1

Cách tiếp cận truyền thống là Phiên được SqlSessionStateProvider hỗ trợ.

Cách tiếp cận hiện đại dường như là sử dụng cơ sở dữ liệu để lưu trữ và sử dụng bộ đệm ẩn (memcached) ở phía trước cơ sở dữ liệu để tăng tốc độ tra cứu. Nhưng phiên là ra, như là các tập tin cookie được mã hóa (ngoại trừ cookie auth).

+0

Bộ nhớ cache được phân phối dường như là cách mới của sự vật ... –

0

Có, tôi nghi ngờ việc xử lý cookie của bạn có thể lộn xộn.

Tôi khuyên bạn nên sử dụng như ASP.NET StateService, có thể chạy trên bất kỳ máy nào, để xử lý các phiên.

Nếu bạn đi tuyến đường cookie, bạn cần phải rất cẩn thận về cách bạn làm điều đó, và trừ khi bạn là một chuyên gia, bạn gần như chắc chắn sẽ làm điều gì đó sai trái.

+0

Bạn có thể giải thích thêm về tuyến cookie không? –

2

Tôi không hiểu tại sao Cookie lại nhận được một đoạn rap tệ như vậy ở đây. Tôi đã nhìn thấy cách tiếp cận Cookie được sử dụng trong một số hệ thống rất lớn và tôi chưa bao giờ thấy nó bị tấn công.

+1

@Charles Tôi không nghĩ rằng bản thân cookie nhất thiết phải có một đoạn rap tồi - chỉ đơn giản là tạo ra đối số cho hai tùy chọn - gửi một khối dữ liệu mã hóa nhạy cảm qua dây để cư trú trên một hệ thống không kiểm soát được trong một khoảng thời gian không xác định thời gian; hoặc * không * làm điều đó, cái sau là an toàn hơn. Nó loại bỏ khả năng bao giờ có một "lỗi, chúng tôi đã làm rối loạn mã hóa của chúng tôi", IMO dễ dàng hơn nhiều đối với dev thông thường hơn "oops, GUID của tôi có thể dự đoán được". –

+0

Tôi đồng ý hết lòng. Tôi chưa bao giờ thấy bất cứ điều gì khác hơn là GUIDs ngẫu nhiên được lưu trữ trong cookie với một cái gì đó như AES áp dụng. –

+0

@Charles Tôi tò mò - những gì mã hóa GUID thực hiện? –

4

Từ điểm mốc Kiến trúc, bạn nên suy nghĩ về điều kiện là quy mô dự kiến ​​của ứng dụng này. Và rất có thể, điều thông minh nhất là bắt đầu với chức năng phiên bản tích hợp sẵn của ASP.NET. Sau đó, nếu bạn thấy rằng bạn đang thực sự cần nó, sau đó thêm một trong hai:

  1. Thấp đến khả năng mở rộng trung: Load balancing với phiên dính, hoặc cân bằng tải dựa trên địa chỉ yêu cầu IP (& vẫn sử dụng ASP. NET Session).
  2. Khả năng mở rộng trung bình đến cao: Cửa hàng phiên chia sẻ trong RAM, tức là chia sẻ ASP.NET StateService, dự án "Vận tốc", ScaleOut SessionServer, v.v.
  3. Khả năng mở rộng cao: Hệ thống phiên dựa trên cookie được tạo bằng 'không quốc tịch' giữa các máy chủ web, theo nghĩa là nó dựa trên các bí mật và băm được chia sẻ trước được xác thực mà không cần truy vấn một cửa hàng phiên trung tâm. Nếu bạn đi tuyến đường này, thì bạn cũng nên cân nhắc việc lưu trữ các thiết lập người dùng không nhạy cảm trong cookie, để mở rộng quy mô này.

Lợi ích của phiên hoàn toàn dựa trên cookie là phiên có khả năng mở rộng vô hạn. Mỗi lần chúng tôi có một người dùng mới, chúng tôi cũng nhận được một máy tính từ xa mới có thể lưu trữ trạng thái phiên của anh ấy cho chúng tôi, cho 'miễn phí'. Tất nhiên, băm trong các máy chủ giao diện người dùng web của chúng tôi mất một số CPU, nhưng tầng đầu tiên là không trạng thái và dễ dàng mở rộng. Nhược điểm là nó là công việc phát triển hơn.

Yêu cầu Bjørn Hansen có tổng quan về các phiên trong cookie in these presentation slides, from around slide 16 and forward. Theo Schlossnagle đã viết về chúng trong his book Scalable Internet Architectures. Here is a good scientific paper để tạo các cookie thực sự an toàn, bảo mật tốt hơn so với các đề xuất từ ​​Ask và Theo, nếu bộ nhớ phục vụ tôi.

Lưu ý rằng bạn có thể không cần nhiều khả năng mở rộng như bạn nghĩ. Ví dụ, Stack Overflow được phục vụ bởi chỉ 2 máy chủ frontend, với một bộ cân bằng tải chia lưu lượng truy cập theo địa chỉ IP của người dùng. Điều này làm cho ASP.NET Session cục bộ trên mỗi máy chủ webserver frontend như bình thường, miễn là tất cả các máy chủ web đang hoạt động - một giải pháp chấp nhận được và rất đơn giản cho hầu hết các trang web với 2-5 máy chủ web.

Có một sự cân nhắc có thể ghi đè lên ở trên. Nếu bạn thấy rằng bạn cần bộ nhớ cache dùng chung cho dữ liệu khác (kết quả truy vấn SQL, kết quả có thể sử dụng lại nhưng tính toán tốn kém CPU), và bạn đã sẵn sàng thực hiện bộ nhớ cache, cũng có nghĩa là cũng dính các phiên vào bộ nhớ cache này.Ví dụ về loại bộ nhớ cache dùng chung mà tôi đang nói đến là Memcached, Microsoft project "Velocity", Shared Cache, ScaleOut StateServer và các loại khác. Nhiều trang web sẽ không cần điều này, nhưng nó là một giải pháp rất tốt. Giải pháp này có thể dễ tiếp cận hơn về giá cả & thời gian phát triển khi dự án "Vận tốc" được phát hành, tùy thuộc vào ý định của Microsoft với "Vận tốc".

Kết luận

  1. Bạn chỉ cần buổi chia sẻ trên máy chủ frontend web, hay bạn cần điều này cho các dữ liệu khác cũng (kết quả SQL bộ nhớ đệm vv)? Bạn có cần bộ nhớ cache chung trong RAM không? Nếu vậy, bạn sẽ phải nhìn vào phần đệm trung gian/phân cụm chung được chia sẻ nói chung.
  2. Nếu không, bạn có biết bạn sẽ hoạt động ở quy mô nào không? Nếu bạn làm như vậy, sau đó sẽ có thể quyết định lựa chọn nào trong số 4 tùy chọn cho dữ liệu phiên (từ Phiên làm việc tích hợp ASP.NET đến cookie) phù hợp với bạn nhất.
  3. Nếu bạn mới bắt đầu và không biết bạn sẽ thu hút bao nhiêu người dùng, thì tôi sẽ bắt đầu với chức năng phiên bản tích hợp sẵn của ASP.NET và chỉ thêm các giải pháp phức tạp sau này.
0

nếu người dùng xóa cookie trên thông tin trình duyệt sẽ bị mất chắc chắn. Đây không phải là trường hợp cho phiên

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