Ces dernières années, le terme "cookie" a souvent été perçu négativement, régulièrement associé à l'espionnage des utilisateurs sans leur consentement.
Cependant, tous les cookies ne se valent pas et certains sont même essentiels au bon fonctionnement des applications.
Aujourd'hui, examinons l'un des cookies indispensables au bon fonctionnement d'une application Laravel : le cookie de session.
À quoi sert le cookie de session
Lorsque vous naviguez sur une application Laravel, il est essentiel que le framework puisse vous identifier parmi la multitude d'autres utilisateurs en simultanés, sans cookie de session, de nombreuses fonctionnalités, comme l'authentification, seraient indisponibles.
Afin de vous identifier, un cookie spécifique à votre session est donc stocké sur votre navigateur et sera automatiquement transmis au serveur à chaque changement de page.
La valeur de ce cookie est donc extrêmement critique et ne doit en aucun cas être visible ou modifiable, si un utilisateur malveillant modifiait cette valeur il pourrait tout simplement ... se connecter à la place d'un autre utilisateur !
Pour garantir cette confidentialité, le cookie est donc chiffré en AES-256 via OpenSSL avec un grain de sel, ou salt, unique à votre application généré par la commande key:generate
... le salt utilisé est donc le APP_KEY
de votre application !
Voici à quoi ressemble la valeur chiffrée d'un cookie de session de Laravel présent sur votre navigateur ... une longue chaine, de plus de 300 caractères :
1eyJpdiI6IjgyOGNlWEZDZzM4YnFUbXVmWHRXMWc9PSIsInZhbHVlIjoiRlBBNXV1enhQbGlrbUlCYmYwVDVnR2xqNmFSUlg2UlhicjFkTFFRaVNRRGJ1T0p2MDduZDVDL2FRNjVuM09oVnprVHpUc1lIWi9kM0N3c0NSMHVJQXVLK0hYNmUvaWdZYjFYbm4yMDVVMS8vWFFkWWJvUTlhTDNpSEZMV0xXZ1AiLCJtYWMiOiJlNDE2NjIxNzIyNThmMGZhMDBiYTdhMzdiNWJhYmM2YzEyYjc0ZjAwNGY0OTM0MTUxNGJjOGI2Y2I1ZDYwMjFmIiwidGFnIjoiIn0%3D
Maintenant que nous en savons un peu plus sur l'origine et la forme du cookie de session, essayons de voir ce qu'il contient véritablement.
Que contient le cookie de session
La manière la plus simple de décoder le cookie sera d'utiliser le helper request, par défaut, le cookie sera nommé laravel_session
:
1$cookie = request()->cookie('laravel_session');2 3dd($cookie);
Le nom du cookie est modifiable dans le fichier
config/session.php
Récupéré depuis le helper, le cookie sera automatiquement déchiffré, la valeur affichée par le dump sera donc le véritable contenu du cookie :
1Fb01dN6BZp9Me4EsIWCXJrKNtuh0yiM2gJjbIXiD
À première vue, cette valeur déchiffrée peut sembler aussi cryptique que la précédente ... mais pour le framework, cette valeur fera office d'identifiant unique et correspondra au nom d'un fichier contenant davantage d'informations sur votre session.
Par défaut, Laravel est configuré avec le driver de session "file" et les fichiers de session se trouveront dans le répertoire de stockage de votre application :
Dans le cadre de ce tutoriel, nous retrouverons donc un fichier denommé Fb01dN6BZp9Me4EsIWCXJrKNtuh0yiM2gJjbIXiD
et présent à la racine dans le dossier storage/framework/sessions/
.
Le contenu de ce fichier est sérialisé, nous pouvons facilement le décoder à l'aide de la méthode unserialize de PHP :
1$file = file('storage/framework/sessions/Fb01dN6BZp9Me4EsIWCXJrKNtuh0yiM2gJjbIXiD');2 3unserialize($file)
Nous y sommes, nous obtenons enfin le contenu du fichier de session d'une application Laravel à partir du cookie présent sur votre navigateur :
1[ 2 "_token" => "6TdBP7McW3A1nCu1tSzalgpZ8Jbqjkiv37lRUGd8", 3 "_previous" => [ 4 "url" => "https://session-cookie.test", 5 ] 6 "_flash" => [ 7 "old" => [], 8 "new" => [], 9 ]10 "url" => [11 "intended" => "https://session-cookie.test/dashboard",12 ]13 "login_web_59ba36addc2b2f9401580f014c7f58ea4e30989d" => 2,14]
Le fichier de session contient un tableau à plusieurs dimensions avec les informations suivantes :
-
_token
: Un identifiant unique alloué à votre session utilisé par le framework. -
_previous
: L'URL précédemment visitée, cette valeur est notamment utile pour effectuer unredirect()->back()
; -
_flash
: Les messages de session en flash. -
url
: L'URL que vous cherchez à atteindre.
La dernière ligne de ce tableau, préfixée par login_web_
, est probablement la plus cruciale et critique.
Cet entier, qui dans notre exemple est d'une valeur "2", représente l'identifiant de votre compte utilisateur en base de données, c'est grâce à cette valeur que le framework peut vous identifier !
Vous retrouverez à plusieurs reprises des occurrences de cette valeur dans le code source de Laravel, notamment dans la classe SessionGuard
qui gère la persistance de session de l'utilisateur.
Une méthode dédiée à la récupération de cette valeur est présente dans le SessionGuard
:
1/**2 * Illuminate\Auth\SessionGuard3 */4public function getName()5{6 return 'login_'.$this->name.'_'.sha1(static::class);7}
Cette valeur sera par la suite utilisé par le framework pour retrouver l'utilisateur en question en base de données :
1/** 2 * Illuminate\Auth\SessionGuard 3 */ 4public function user() 5{ 6 if ($this->loggedOut) { 7 return; 8 } 9 10 if (! is_null($this->user)) {11 return $this->user;12 }13 14 /**15 * L'identifiant de votre compte utilisateur récupéré16 * depuis le fichier de session.17 */18 $id = $this->session->get($this->getName()); 19 20 /**21 * Un identifiant permettant à Laravel de retrouver22 * une instance du model User.23 */24 if (! is_null($id) && $this->user = $this->provider->retrieveById($id)) { 25 $this->fireAuthenticatedEvent($this->user);26 }27 28 if (is_null($this->user) && ! is_null($recaller = $this->recaller())) {29 $this->user = $this->userFromRecaller($recaller);30 31 if ($this->user) {32 $this->updateSession($this->user->getAuthIdentifier());33 34 $this->fireLoginEvent($this->user, true);35 }36 }37 38 return $this->user; 39}
Vous en savez désormais un peu plus sur le fonctionnement du cookie de session et de son importance cruciale dans l'authentification 🍪
A lire
Autres articles de la même catégorie
Les Seeders
Créez rapidement des jeux de données grâce aux seeders !
Antoine Benevaut
Les bases 5/6 : Contrôle d’accès
Découverte du contrôle des accès de nos utilisateurs à travers les Policies.
William Suppo
Debugger les requêtes SQL dans Laravel
Comment faire pour debugger efficacement vos requêtes SQL dans Laravel ?
Mathieu De Gracia