Cookies vs сессии с CookieStore
в Rails 3, в чем разница между хранением данных в файле cookie и хранением данных в сеансе, при этом хранилище сеансов установлено по умолчанию CookieStore?
например
cookie[:foo] = 'bar'
# MyApp::Application.config.session_store :cookie_store, key: '_myapp_session'
session[:foo] = 'bar'
насколько я могу судить, оба они хранятся в файле cookie на стороне клиента.
когда бы вы решили использовать один над другим?
спасибо.
2 ответа:
основное отличие заключается в том, что при использовании
cookie[:foo] = 'bar'
пользователь может видеть значение для файла cookie, т. е.'bar'
. Когда вы используетеsession[:foo] = 'bar'
значение будет зашифровано rails и сохранено в_myapp_session
печенье.можно использовать
cookie[]
форматирование, когда информация, которую вы хотите сохранить, не привязана к сеансу, например, когда пользователи выбирают предпочтительный язык.можно использовать
session[]
формат, когда вы хотите сохранить информацию, которая связана с текущая сессия, напримерid
для пользователя.
Rails предоставляет несколько механизмов хранения для хэшей сеанса. Самые важные из них
ActiveRecord::SessionStore
иActionDispatch::Session::CookieStore
.существует несколько хранилищ сеансов, т. е. где Rails сохраняет хэш сеанса и идентификатор сеанса. Большинство реальных живых приложений выбирают
ActiveRecord::SessionStore
(или один из его производных) над хранилищем файлов из-за производительности и технического обслуживания причин.ActiveRecord::SessionStore
сохраняет идентификатор сеанса и хэш в таблице базы данных и сохраняет и извлекает хэш на каждом запрос.Rails 2 представила новое хранилище сеансов по умолчанию,
CookieStore
.CookieStore
сохраняет хэш сеанса непосредственно в файле cookie на стороне клиента. Сервер извлекает хэш сеанса из файла cookie и устраняет необходимость в идентификаторе сеанса. Это значительно увеличит скорость работы приложения, но это спорный вариант хранения, и вам нужно подумать о последствиях для безопасности:Cookies подразумевают строгий предел размера 4 КБ. Это прекрасно, как вы не следует хранить большие объемы данных в сеансе в любом случае, как описано выше. Хранение идентификатора базы данных текущего пользователя в сеансе обычно нормально. Клиент может видеть все, что вы храните в сеансе, потому что он хранится в открытом тексте (на самом деле Base64-закодирован, поэтому не зашифрован). Так что, конечно, вы не хотите хранить здесь никаких секретов. Чтобы предотвратить изменение хэша сеанса, дайджест вычисляется из сеанса с секретом на стороне сервера и вставляется в конец файла cookie. Это означает, что безопасность этого хранилища зависит от этого секрета (и от алгоритма дайджеста, который по умолчанию имеет значение SHA512, который еще не был скомпрометирован). Так что не используйте тривиальный секрет, т. е. слово из словаря, или тот, который короче 30 символов