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::SessionStore
và ActionDispatch::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ự
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
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
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? –