web-dev-qa-db-fra.com

Cookies vs sessions avec CookieStore

Dans Rails 3, quelle est la différence entre le stockage de données dans un cookie et le stockage de données dans une session, avec le magasin de sessions défini par défaut sur CookieStore?

par exemple.

cookie[:foo] = 'bar'

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

Autant que je sache, les deux finissent par être stockés dans un cookie côté client.

Quand choisiriez-vous d'utiliser l'un plutôt que l'autre?

Merci.

63
gjb

La principale différence est que lorsque vous utilisez cookie[:foo] = 'bar' l'utilisateur peut voir la valeur du cookie, c'est-à-dire 'bar'. Lorsque vous utilisez session[:foo] = 'bar' la valeur sera chiffrée par Rails et stockée dans le _myapp_session biscuit.

Vous utiliseriez le cookie[] format lorsque les informations que vous souhaitez stocker ne sont pas liées à la session, par exemple lorsque les utilisateurs sélectionnent la langue préférée.

Vous utiliseriez le session[] format lorsque vous souhaitez stocker des informations liées à la session en cours, par exemple le id de l'utilisateur.

110
Wolfgang

Rails fournit plusieurs mécanismes de stockage pour les hachages de session. Les plus importants sont ActiveRecord::SessionStore et ActionDispatch::Session::CookieStore.

Il existe un certain nombre de stockages de session, c'est-à-dire où Rails enregistre le hachage de session et l'ID de session. La plupart des applications réelles choisissent ActiveRecord::SessionStore (ou l'un de ses dérivés) sur le stockage de fichiers pour des raisons de performances et de maintenance. ActiveRecord::SessionStore conserve l'ID de session et le hachage dans une table de base de données et enregistre et récupère le hachage à chaque demande.

Rails 2 a introduit un nouveau stockage de session par défaut, CookieStore. CookieStore enregistre le hachage de session directement dans un cookie côté client. Le serveur récupère le hachage de session à partir du cookie et élimine le besoin d'un identifiant de session. Cela augmentera considérablement la vitesse de l'application, mais c'est une option de stockage controversée et vous devez penser aux implications de sécurité:

Les cookies impliquent une limite de taille stricte de 4 Ko. C'est très bien car vous ne devez de toute façon pas stocker de grandes quantités de données dans une session, comme décrit précédemment. Le stockage de l'ID de la base de données de l'utilisateur actuel dans une session est généralement correct. Le client peut voir tout ce que vous stockez dans une session, car il est stocké en texte clair (en fait codé en Base64, donc non chiffré). Donc, bien sûr, vous ne voulez pas stocker de secrets ici. Pour empêcher la falsification de hachage de session, un résumé est calculé à partir de la session avec un secret côté serveur et inséré à la fin du cookie. Cela signifie que la sécurité de ce stockage dépend de ce secret (et de l'algorithme de résumé, qui est par défaut SHA512, qui n'a pas encore été compromis). N'utilisez donc pas un secret trivial, c'est-à-dire un mot d'un dictionnaire ou un texte de moins de 30 caractères

11
danilodeveloper