ti-enxame.com

Cookies vs Sessões com CookieStore

Em Rails 3, qual é a diferença entre armazenar dados em um cookie e armazenar dados em uma sessão, com o armazenamento de sessão definido como o padrão de CookieStore?

por exemplo.

cookie[:foo] = 'bar'

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

Tanto quanto posso dizer, ambos acabam armazenados em um cookie do lado do cliente.

Quando você escolheria usar um sobre o outro?

Obrigado.

63
gjb

A principal diferença é que quando você usa cookie[:foo] = 'bar' o usuário pode ver o valor do cookie, ou seja, 'bar'. Quando você usa session[:foo] = 'bar' o valor será criptografado por Rails e armazenado em _myapp_session biscoito.

Você usaria o cookie[] formato quando as informações que você deseja armazenar não estão vinculadas à sessão, por exemplo quando os usuários selecionam o idioma preferido.

Você usaria o session[] formato quando você deseja armazenar informações relacionadas à sessão atual, por exemplo o id do usuário.

110
Wolfgang

O Rails fornece vários mecanismos de armazenamento para os hashes da sessão. Os mais importantes são ActiveRecord::SessionStore e ActionDispatch::Session::CookieStore.

Existem vários armazenamentos de sessão, ou seja, onde Rails salva o hash e o ID da sessão. A maioria dos aplicativos em tempo real escolhe ActiveRecord::SessionStore (ou um de seus derivados) no armazenamento de arquivos devido a razões de desempenho e manutenção. ActiveRecord::SessionStore mantém o ID da sessão e o hash em uma tabela do banco de dados e salva e recupera o hash em cada solicitação.

O Rails 2 introduziu um novo armazenamento de sessão padrão, CookieStore. CookieStore salva o hash da sessão diretamente em um cookie no lado do cliente. O servidor recupera o hash da sessão do cookie e elimina a necessidade de um ID de sessão. Isso aumentará bastante a velocidade do aplicativo, mas é uma opção de armazenamento controversa e você deve pensar nas implicações de segurança dele:

Os cookies implicam um limite de tamanho estrito de 4kB. Tudo bem, pois você não deve armazenar grandes quantidades de dados em uma sessão, como descrito anteriormente. O armazenamento do ID do banco de dados do usuário atual em uma sessão geralmente é bom. O cliente pode ver tudo o que você armazena em uma sessão, porque é armazenado em texto não criptografado (na verdade, codificado em Base64, portanto, não criptografado). Então, é claro, você não deseja armazenar segredos aqui. Para evitar a violação do hash da sessão, um resumo é calculado a partir da sessão com um segredo do lado do servidor e inserido no final do cookie. Isso significa que a segurança desse armazenamento depende desse segredo (e do algoritmo de compilação, que é padrão no SHA512, que ainda não foi comprometido). Portanto, não use um segredo trivial, ou seja, uma palavra de um dicionário ou uma que tenha menos de 30 caracteres

11
danilodeveloper