2013-02-22 7 views
54

В Rails 3, в чем разница между хранением данных в cookie и хранением данных в сеансе, с хранилищем сеансов, установленным по умолчанию в CookieStore?Cookies vs Sessions with CookieStore

например.

cookie[:foo] = 'bar' 

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

Насколько я могу судить, оба в конечном итоге хранятся в клиентском cookie.

Когда вы решите использовать один над другим?

Спасибо.

ответ

93

Главное отличие состоит в том, что при использовании cookie[:foo] = 'bar' пользователь может видеть значение для файла cookie, т.е. 'bar'. Когда вы используете session[:foo] = 'bar', значение будет зашифровано рельсами и сохранено в файле cookie _myapp_session.

Вы должны использовать формат cookie[], если информация, которую вы хотите сохранить, не связана с сеансом, например. когда пользователи выбирают предпочтительный язык.

Вы должны использовать формат session[], если хотите сохранить информацию, относящуюся к текущему сеансу, например. id пользователя.

+10

коррекция; значение не зашифровывается, а кодируется (с базой 64) по умолчанию. – Cem

+12

Хотя вопрос был о Rails 3, в котором файлы cookie были только закодированы, стоит отметить, что Rails 4 шифрует их. – sheldonh

+0

Почему Rails 4 шифрует? Есть идеи? , Не будет ли это дорогостоящим для приложения rails, которое зашифровывает/делит все запросы? –

10

Rails предоставляет несколько механизмов хранения для хэшей сессии. Наиболее важными являются ActiveRecord::SessionStore и ActionDispatch::Session::CookieStore.

Существует множество хранилищ сеансов, то есть где Rails сохраняет хэш сеанса и идентификатор сеанса. Большинство приложений реального времени выбирают ActiveRecord::SessionStore (или одну из своих производных) по сравнению с файловыми хранилищами из-за причин производительности и обслуживания. ActiveRecord::SessionStore хранит идентификатор сеанса и хеш в таблице базы данных и сохраняет и извлекает хэш для каждого запроса.

Rails 2 представил новое хранилище сеансов по умолчанию, CookieStore. CookieStore сохраняет хэш сеанса непосредственно в файле cookie на стороне клиента. Сервер извлекает хэш сеанса из файла cookie и устраняет необходимость в идентификаторе сеанса. Это значительно увеличит скорость применения, но это спорный вариант хранения, и вам нужно подумать о последствиях его безопасности:

Cookies подразумевают строгий предел размера 4 КБ. Это нормально, так как вы не должны хранить большие объемы данных в сеансе в любом случае, как описано выше. Сохранение идентификатора базы данных текущего пользователя в сеансе обычно выполняется. Клиент может видеть все, что вы храните в сеансе, потому что он хранится в ясном тексте (на самом деле Base64-закодирован, поэтому не зашифрован). Поэтому, конечно, вы не хотите хранить секреты здесь. Чтобы предотвратить фальсификацию хеша сессии, дайджест вычисляется из сеанса с секретностью на стороне сервера и вставляется в конец файла cookie. Это означает, что безопасность этого хранилища зависит от этого секретного (и от алгоритма дайджеста, который по умолчанию не имеет SHA512, который еще не был скомпрометирован). Поэтому не используйте тривиальный секрет, то есть слово из словаря, или слово, которое короче 30 символов.