Подтвердить что ты не робот

Cookies против сеансов с CookieStore

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

например.

cookie[:foo] = 'bar'

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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