Que cache le cookie de session de Laravel

Publié le 4 juin 2024 par Mathieu De Gracia
Couverture de l'article Que cache le cookie de session de Laravel

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 :

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\SessionGuard
3 */
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 retrouver
22 * 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 🍪

Mathieu De Gracia avatar
Mathieu De Gracia
Des fois, mon chat code à ma place 🐱

A lire

Autres articles de la même catégorie