2013-02-22 26 views
54

Trong Rails 3, sự khác biệt giữa lưu trữ dữ liệu trong cookie và lưu trữ dữ liệu trong phiên là gì, với kho phiên được đặt thành mặc định của CookieStore?Cookies vs Sessions với CookieStore

ví dụ:

cookie[:foo] = 'bar' 

# MyApp::Application.config.session_store :cookie_store, key: '_myapp_session' 
session[:foo] = 'bar' 

Theo tôi có thể biết, cả hai đều được lưu trữ trong cookie phía máy khách.

Khi nào bạn chọn sử dụng cái kia?

Cảm ơn.

Trả lời

93

Sự khác biệt chính là khi bạn sử dụng cookie[:foo] = 'bar' người dùng có thể thấy giá trị cho cookie, tức là 'bar'. Khi bạn sử dụng session[:foo] = 'bar' giá trị sẽ được mã hóa bằng đường ray và được lưu trữ trong cookie _myapp_session.

Bạn sẽ sử dụng định dạng cookie[] khi thông tin bạn muốn lưu trữ không bị ràng buộc trong phiên, ví dụ: khi người dùng chọn ngôn ngữ ưa thích.

Bạn sẽ sử dụng định dạng session[] khi bạn muốn lưu trữ thông tin có liên quan đến phiên hiện tại, ví dụ: số id của người dùng.

+10

chỉnh sửa; giá trị không được mã hóa nhưng được mã hóa (với base64) theo mặc định. – Cem

+12

Mặc dù câu hỏi là về Rails 3, trong đó cookie chỉ được mã hóa, đáng chú ý là Rails 4 mã hóa chúng. – sheldonh

+0

Tại sao Rails 4 mã hóa? Bất kỳ ý tưởng? , Sẽ không tốn kém cho ứng dụng đường ray mã hóa/giải mã mọi yêu cầu? –

10

Rails cung cấp một số cơ chế lưu trữ cho băm phiên. Điều quan trọng nhất là ActiveRecord::SessionStoreActionDispatch::Session::CookieStore.

Có một số bộ nhớ phiên, tức là nơi Rails lưu hàm băm phiên và id phiên. Hầu hết các ứng dụng thực tế đều chọn ActiveRecord::SessionStore (hoặc một trong các dẫn xuất của nó) trên lưu trữ tệp do lý do hiệu suất và bảo trì. ActiveRecord::SessionStore giữ id phiên và hàm băm trong bảng cơ sở dữ liệu và lưu và truy lục hàm băm trên mọi yêu cầu.

Rails 2 đã giới thiệu bộ nhớ phiên mặc định mới, CookieStore. CookieStore lưu băm phiên trực tiếp trong cookie ở phía máy khách. Máy chủ truy xuất băm phiên từ cookie và loại bỏ nhu cầu về id phiên. Điều đó sẽ làm tăng đáng kể tốc độ của ứng dụng, nhưng nó là một lựa chọn lưu trữ gây tranh cãi và bạn phải suy nghĩ về các tác động an ninh của nó:

Cookies ngụ ý giới hạn kích thước nghiêm ngặt là 4kB. Điều này là tốt như bạn không nên lưu trữ số lượng lớn dữ liệu trong một phiên anyway, như được mô tả trước đây. Việc lưu trữ id cơ sở dữ liệu của người dùng hiện tại trong một phiên thường là ok. Khách hàng có thể xem mọi thứ bạn lưu trữ trong một phiên, bởi vì nó được lưu trữ trong văn bản rõ ràng (thực sự được mã hóa Base64, do đó không được mã hóa). Vì vậy, tất nhiên, bạn không muốn lưu trữ bất kỳ bí mật nào ở đây. Để ngăn chặn giả mạo băm phiên, thông báo được tính từ phiên có bí mật phía máy chủ và được chèn vào cuối cookie. Điều đó có nghĩa là tính bảo mật của bộ nhớ này tùy thuộc vào bí mật này (và trên thuật toán thông báo, mặc định là SHA512, chưa được thỏa hiệp). Vì vậy, không sử dụng bí mật tầm thường, tức là một từ trong từ điển hoặc một từ ngắn hơn 30 ký tự

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