[RUBY] J'ai essayé d'organiser la session en Rails

Nous faisons beaucoup de tutoriels sur les rails. Concernant la "session" traitée au chapitre 8, j'ai cette fois écrit un article que je voudrais organiser pour ma propre compréhension. Étant donné que je suis débutant, je vous serais reconnaissant de bien vouloir signaler toute erreur dans les commentaires.

Qu'est-ce qu'une session en premier lieu? (répondre) Un "mécanisme" qui réalise une "communication avec état".

Qu'est-ce que l'état complet? Le HTML que nous utilisons habituellement communique sans état. * État moins = 1 fois 1 échange indépendant

Dans cette communication, la communication entre le navigateur et le serveur est indépendante pour chaque aller-retour. Les informations précédentes ne peuvent pas être héritées.

Cependant, vous vous demandez peut-être quand vous entendez cette histoire. Si toutes les communications HTML sont indépendantes, par exemple sur un site d'achat, Lorsque vous mettez l'article que vous souhaitez acheter dans le panier, les informations ne sont pas reportées, donc Le panier doit être vide lors de la transition des pages.

Donc, ** Le mécanisme de session est de rendre la communication HTML sans état "avec état". ** **

  • State (state) full (hold) = échange tout en "tenant" l'état tel que les informations utilisateur

Dans cette communication, des informations sont ajoutées à la communication entre le navigateur et le serveur pour échanger des informations. Il est possible de transformer tout cet échange en une série d'actions.

Dans l'exemple ci-dessus, sur le site où vous vous êtes connecté en tant que membre, vous pouvez accéder à différentes pages tout en conservant les informations du membre. C'est pratique car vous pouvez mettre de plus en plus de choses dans le panier sur le site d'achat.

La "communication avec état" en HTML consiste en un mécanisme appelé session.

Référence: session communication

Comment les sessions

sont-elles échangées? </ h2> (répondre) Généralement, l'identifiant de session inclus dans le "cookie" envoyé depuis le navigateur Il est acquis et assemblé côté serveur, et le contenu de la session est retiré et échangé. La fermeture du navigateur supprime la session.

Qu'est-ce qu'un cookie? En un mot, les cookies sont des informations détenues par le navigateur Web.

Les sessions ne gèrent pas toujours les cookies, mais ils sont certainement couramment utilisés. Rails utilise également des cookies en standard, nous allons donc accepter les cookies ici.

~ Flux approximatif de cookies ~

** ① Premier accès ** Le côté navigateur accède au côté serveur. Le côté serveur envoie les informations d'identification du navigateur (par exemple, les informations de connexion) incluses dans l'en-tête HTTP. Le navigateur enregistre ces informations (ce sont les informations du cookie)

** ② Accès après cela ** Le côté navigateur inclut les informations de cookie enregistrées dans l'en-tête HTTP et les envoie au côté serveur. Sur la base de ces informations, le côté serveur détermine qui y a accédé.

De cette manière, le cookie est l'information détenue du côté du navigateur, et en l'envoyant avec l'identifiant de session, le côté serveur peut comprendre "quel type de contenu avez-vous échangé?" Je vais. À propos, le contenu de la session elle-même est détenu par le serveur Web et l'ID de session dans le cookie est l'ID pour l'appel.

La session n'est que temporaire et est essentiellement supprimée lorsque le navigateur est fermé.

Qu'est-ce qu'une session dans Rails? Maintenant que nous avons parlé de concepts, trions le contenu des sessions dans Rails. rails vous permet de configurer une session pour chaque utilisateur. Les sessions ne sont disponibles que pour les contrôleurs et les vues. Vous pouvez également sélectionner les stockages suivants.
espace de rangement La description
ActionDispatch::Session::CookieStore: Enregistrer toutes les sessions dans un cookie sur le navigateur côté client
ActionDispatch::Session::CacheStore: Enregistrer les données dans le cache Rails
ActionDispatch::Session::ActiveRecordStore: Enregistrer dans la base de données à l'aide de l'enregistrement actif(activerecord-session_Besoin d'un bijou de magasin)
ActionDispatch::Session::MemCacheStore: Stocker les données dans un cluster Memcached(Cette implémentation est ancienne, vous devriez donc envisager CacheStore)

Comme expliqué précédemment, l'ID de session est essentiellement stocké dans un cookie et transmis au serveur, Pour le CookieStore utilisé par défaut, les ** informations de session elles-mêmes sont enregistrées du côté des cookies. ** **

Le CookieStore présente les ** avantages ** suivants. ・ Très léger ・ Un ensemble a été préparé pour l'utilisation de la session avec l'application Web. -Les données du cookie reçoivent une signature cryptée pour empêcher la falsification, et le cookie lui-même est également crypté, de sorte que le contenu ne peut pas être lu par d'autres (le cookie falsifié est rejeté par Rails).

Cependant, il existe également les ** inconvénients ** suivants. ・ La limite supérieure des cookies est de 4 Ko -Depuis que le cookie est enregistré côté client (navigateur), le contenu du cookie expiré peut rester. ・ Les cookies clients peuvent être copiés sur d'autres ordinateurs ・ Les cookies de session n'expirent pas d'eux-mêmes, ils peuvent donc être réutilisés à des fins d'utilisation abusive.

En gros, je pense qu'il vaut mieux utiliser le Cookie Store recommandé par Rails, J'ai pensé qu'il fallait l'utiliser correctement en fonction de la situation.

Référence: session de guidage des rails

opération de session

Voici toutes les opérations dans le magasin de cookies qui est utilisé par défaut.

** ・ Créer une session **

session[:user_id] = @user.id

La méthode de session peut être définie avec une valeur de hachage. En paramétrant, un cookie crypté contenant les informations de cette session sera généré.

** ・ Référez-vous à la session **

user = User.find(id: session[:user_id])

Les informations sur la session peuvent être facilement référencées. Lorsque la méthode de session est appelée, les informations du cookie sont décryptées en interne et la valeur peut être obtenue avec session [: symbol].

** - Supprimer la session **

#Tout ce que tu fais est pareil
session[:user_id] = nil
session[:user_id].clear
session.delete(:user_id)

Il est possible de réécrire avec nil ou de supprimer des informations avec clear ou delete.

À la fin La plus grande question que j'avais lors de la session d'apprentissage était la relation entre la session et le cookie. Le comportement de la méthode de session de Rails (CookieStore) est différent de ce qui est dit dans le concept. Je ne comprends pas bien,? Est plein ... lol

Quand je l'ai réorganisé, j'ai pu identifier les points que je ne comprenais pas et c'était rafraîchissant. Je souhaite continuer à travailler sur le tutoriel Rails.

Site de référence Je vous remercie! https://ja.wikipedia.org/wiki/HTTP_cookie https://qiita.com/hththt/items/07136ad74127999df271 https://qiita.com/hot_study_man/items/147f8b767b4135fe6fe4 https://www.justinweiss.com/articles/how-rails-sessions-work/ https://railsguides.jp/security.html

Recommended Posts

J'ai essayé d'organiser la session en Rails
Tri des données Décroissant, croissant / Rails
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
J'ai essayé d'expliquer la méthode
[Rails] J'ai essayé de supprimer l'application
J'ai essayé de résumer les méthodes utilisées
J'ai essayé le nouveau yuan à Java
J'ai essayé d'implémenter le modèle Iterator
J'ai essayé de résumer l'API Stream
J'ai essayé la bibliothèque AutoValue avec Intellij
J'ai essayé d'implémenter le traitement Ajax de la fonction similaire dans Rails
J'ai essayé d'illuminer le sapin de Noël dans un jeu de la vie
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
J'ai essayé de comprendre comment la méthode des rails "redirect_to" est définie
J'ai essayé de comprendre comment la méthode des rails "link_to" est définie
J'ai essayé d'implémenter des relations polymorphes à Nogizaka.
Code utilisé pour connecter Rails 3 à PostgreSQL 10
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby, avec récurrence.
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
Après avoir appris Progate, j'ai essayé de créer une application SNS en utilisant Rails dans l'environnement local
J'ai essayé de configurer tomcat pour exécuter le servlet.
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
J'ai essayé de développer une application en 2 langues
J'ai essayé de créer une compétence Alexa avec Java
[Ruby] J'ai essayé de résumer les méthodes fréquentes dans paiza
[Ruby] J'ai essayé de résumer les méthodes fréquentes avec paiza ②
Comment vérifier les commandes Rails dans le terminal
Je veux obtenir la valeur en Ruby
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby (temps limite 10 minutes)
À propos du cas où "Docker" freeter a tenté de mettre Docker dans l'application Rails existante
J'étais accro à NoSuchMethodError dans Cloud Endpoints
Comment régler l'heure d'affichage sur l'heure japonaise dans les rails
Je veux intégrer n'importe quel TraceId dans le journal
J'ai essayé d'implémenter la notification push Firebase en Java
05. J'ai essayé de supprimer la source de Spring Boot
# 2 [Note] J'ai essayé de calculer quatre-vingt-dix-neuf avec Java.
Je veux utiliser une petite icône dans Rails
J'ai essayé de réduire la capacité de Spring Boot
[Rails] Je ne sais pas comment utiliser le modèle ...
J'ai essayé de créer une compétence Clova en Java
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé d'installer le plug-in d'intégration Docker dans IntelliJ
Je souhaite définir une fonction dans la console Rails
Rails6 J'ai essayé d'introduire Docker dans une application existante
~ J'ai essayé d'apprendre la programmation fonctionnelle avec Java maintenant ~
[Rails] Comment afficher les images dans la vue
J'ai essayé de découvrir ce qui avait changé dans Java 9
J'ai essayé Rails débutant [Chapitre 1]