JavaScript et les cookies
Cet article explique JavaScript et les cookies.
Nous expliquerons tout en détail étape par étape, des bases des cookies, de la lecture et de l'écriture, de la sécurité, jusqu’à des exemples pratiques.
YouTube Video
javascript-cookie.html
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <title>JavaScript & HTML</title>
6 <style>
7 * {
8 box-sizing: border-box;
9 }
10
11 body {
12 margin: 0;
13 padding: 1em;
14 padding-bottom: 10em;
15 font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
16 background-color: #f7f9fc;
17 color: #333;
18 line-height: 1.6;
19 }
20
21 .container {
22 max-width: 800px;
23 margin: 0 auto;
24 padding: 1em;
25 background-color: #ffffff;
26 border: 1px solid #ccc;
27 border-radius: 10px;
28 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
29 }
30
31 .container-flex {
32 display: flex;
33 flex-wrap: wrap;
34 gap: 2em;
35 max-width: 1000px;
36 margin: 0 auto;
37 padding: 1em;
38 background-color: #ffffff;
39 border: 1px solid #ccc;
40 border-radius: 10px;
41 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
42 }
43
44 .left-column, .right-column {
45 flex: 1 1 200px;
46 min-width: 200px;
47 }
48
49 h1, h2 {
50 font-size: 1.2rem;
51 color: #007bff;
52 margin-top: 0.5em;
53 margin-bottom: 0.5em;
54 border-left: 5px solid #007bff;
55 padding-left: 0.6em;
56 background-color: #e9f2ff;
57 }
58
59 button {
60 display: block;
61 margin: 1em auto;
62 padding: 0.75em 1.5em;
63 font-size: 1rem;
64 background-color: #007bff;
65 color: white;
66 border: none;
67 border-radius: 6px;
68 cursor: pointer;
69 transition: background-color 0.3s ease;
70 }
71
72 button:hover {
73 background-color: #0056b3;
74 }
75
76 #output {
77 margin-top: 1em;
78 background-color: #1e1e1e;
79 color: #0f0;
80 padding: 1em;
81 border-radius: 8px;
82 min-height: 200px;
83 font-family: Consolas, monospace;
84 font-size: 0.95rem;
85 overflow-y: auto;
86 white-space: pre-wrap;
87 }
88
89 .highlight {
90 outline: 3px solid #ffc107; /* yellow border */
91 background-color: #fff8e1; /* soft yellow background */
92 transition: background-color 0.3s ease, outline 0.3s ease;
93 }
94
95 .active {
96 background-color: #28a745; /* green background */
97 color: #fff;
98 box-shadow: 0 0 10px rgba(40, 167, 69, 0.5);
99 transition: background-color 0.3s ease, box-shadow 0.3s ease;
100 }
101 </style>
102</head>
103<body>
104 <div class="container">
105 <h1>JavaScript Console</h1>
106 <button id="executeBtn">Execute</button>
107 <div id="output"></div>
108 </div>
109
110 <script>
111 // Override console.log to display messages in the #output element
112 (function () {
113 // Override console.log
114 const originalLog = console.log;
115 console.log = function (...args) {
116 originalLog.apply(console, args);
117 const message = document.createElement('div');
118 message.textContent = args.map(String).join(' ');
119 output.appendChild(message);
120 };
121
122 // Override console.error
123 const originalError = console.error;
124 console.error = function (...args) {
125 originalError.apply(console, args);
126 const message = document.createElement('div');
127 message.textContent = args.map(String).join(' ');
128 message.style.color = 'red'; // Color error messages red
129 output.appendChild(message);
130 };
131 })();
132
133 document.getElementById('executeBtn').addEventListener('click', () => {
134 // Prevent multiple loads
135 if (document.getElementById('externalScript')) return;
136
137 const script = document.createElement('script');
138 script.src = 'javascript-cookie.js';
139 script.id = 'externalScript';
140 //script.onload = () => console.log('javascript-cookie.js loaded and executed.');
141 //script.onerror = () => console.log('Failed to load javascript-cookie.js.');
142 document.body.appendChild(script);
143 });
144 </script>
145</body>
146</html>
JavaScript et les cookies
Un cookie
désigne de petites portions de données stockées dans le navigateur de l’utilisateur. Ils sont principalement utilisés pour les raisons suivantes :.
- Authentification de l’utilisateur (maintien de l’état de connexion)
- Sauvegarde des paramètres utilisateur (langue, thème, etc.)
- Suivi (historique de navigation, etc.)
En JavaScript, vous pouvez lire et écrire des cookies en utilisant document.cookie
.
Créer (écrire) des cookies
Les cookies sont créés avec la syntaxe suivante :.
1document.cookie = "username=JohnDoe";
- Ce code enregistre un cookie nommé
"username=JohnDoe"
dans le navigateur.
Créer des cookies avec une date d’expiration
Les cookies peuvent avoir une date d’expiration définie. Si aucune date d’expiration n’est définie, il s’agit d’un cookie de session et il est supprimé lorsque le navigateur est fermé.
1const date = new Date();
2date.setTime(date.getTime() + (7 * 24 * 60 * 60 * 1000)); // 7 days
3const cookieText = "username=JohnDoe; expires=" + date.toUTCString() + "; path=/; SameSite=None; Secure"
4document.cookie = cookieText;
5console.log(`Cookie Text : ${cookieText}`);
6console.log(`Cookie Value : ${document.cookie}`);
- L’attribut
expires
spécifie la date d’expiration du cookie au format UTC. - L’attribut
path
spécifie le chemin pour lequel le cookie sera envoyé./
signifie l’ensemble du site. - Si vous spécifiez
SameSite=None
, leCookie
sera envoyé même lors de requêtes intersites. Cependant, dans ce cas, vous devez toujours inclure l'attributSecure
. - Spécifier
Secure
limite leCookie
à la communication HTTPS uniquement, renforçant ainsi la sécurité. - En consultant
document.cookie
, vous pouvez obtenir tous lesCookies
disponibles sur la page courante sous forme de chaîne. - En utilisant
console.log
, vous pouvez vérifier la différence entre les valeurs réelles desCookies
définies dans le navigateur et les valeurs pouvant être récupérées.
Lire (récupérer) des cookies
Vous pouvez récupérer tous les cookies sous forme de chaîne avec document.cookie
.
1const date = new Date();
2date.setTime(date.getTime() + (7 * 24 * 60 * 60 * 1000)); // 7 days
3document.cookie = "theme=dark; expires=" + date.toUTCString() + "; path=/; SameSite=None; Secure"
4
5console.log(document.cookie);
6// Output: "username=JohnDoe; theme=dark"
- La valeur renvoyée par
document.cookie
est une seule chaîne où tous lesCookies
sont concaténés au format 'clé=valeur;
'. - Il est pratique d’utiliser une fonction pour analyser cette chaîne et extraire la valeur souhaitée.
Fonction pour obtenir la valeur d’un cookie
1function getCookie(name) {
2 const cookies = document.cookie.split('; ');
3 for (const cookie of cookies) {
4 const [key, value] = cookie.split('=');
5 if (key === name) {
6 return decodeURIComponent(value);
7 }
8 }
9 return null;
10}
11
12console.log(getCookie("username")); // "JohnDoe"
- Cette fonction sépare les clés et les valeurs en utilisant
split()
et renvoie la valeur si elle correspond à la clé spécifiée. - En utilisant
decodeURIComponent
, vous pouvez correctement récupérer les caractères encodés. - Si la clé correspondante n'existe pas, elle retourne
null
.
Supprimer des cookies
Un cookie peut être supprimé en définissant sa date d’expiration à une date passée.
1document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; SameSite=None; Secure";
2
3console.log(document.cookie);
4// Output: "theme=dark"
- En attribuant une valeur vide à
username
et en fixant la date d'expiration dans le passé, il sera supprimé. - Lors de la suppression d'un
Cookie
, vous devez également faire correspondre les attributspath
,SameSite
etSecure
avec ceux utilisés lors de sa création. - Dans cet exemple,
username
est supprimé et d'autresCookies
commetheme=dark
restent.
Options de cookies
Vous pouvez spécifier diverses options pour contrôler le comportement d’un cookie. Les principales sont les suivantes :.
Spécifie la date d’expiration du cookie au format UTC. Si non spécifié, le cookie devient un cookie de session et est supprimé à la fermeture du navigateur.
Spécifie la date d’expiration du cookie en secondes. Ceci prend le dessus sur `expires`.
Spécifie le chemin pour lequel le cookie sera envoyé. Par exemple, si vous spécifiez `/admin`, le cookie ne sera envoyé qu’aux pages sous ce chemin.
Spécifie le domaine pour lequel le cookie est valide. Habituellement, il est défini pour le domaine actuel, mais vous pouvez l’appliquer à tous les sous-domaines, comme `.example.com`.
Lorsque cet attribut est spécifié, le cookie est envoyé uniquement via HTTPS. Pour une meilleure sécurité, définissez toujours cet attribut pour les informations sensibles.
Contrôle l’envoi des cookies lors de requêtes intersites. Vous pouvez spécifier l’une des trois valeurs suivantes :.
- `Strict`
Les cookies sont envoyés uniquement pour des requêtes provenant du même site.
- `Lax`
Les cookies sont envoyés pour la navigation normale, mais avec certaines limitations.
- `None`
Les cookies peuvent être envoyés même lors de requêtes intersites. Cependant, l’attribut `Secure` est également requis.
Exemple : Cookie sécurisé
1document.cookie = "sessionId=abc123; secure; SameSite=Strict";
- Si vous spécifiez
secure
, leCookie
ne sera envoyé que via une communication HTTPS. - Si vous spécifiez
SameSite=Strict
, leCookie
ne sera pas envoyé lors des requêtes intersites, ce qui le rend efficace comme mesure contre les attaques CSRF. - De tels attributs de sécurité sont essentiels pour les
Cookies
importants utilisés pour l'authentification ou la gestion de session.
Encodage et décodage
Comme les valeurs des cookies peuvent contenir des caractères spéciaux, il est plus sûr d’utiliser encodeURIComponent
.
1const date = new Date();
2date.setTime(date.getTime() + (7 * 24 * 60 * 60 * 1000)); // 7 days
3
4const username = "JohnDoe";
5document.cookie =
6 "username=" + encodeURIComponent(username) +
7 "; max-age=604800; path=/; SameSite=None; Secure";
8
9console.log(decodeURIComponent(getCookie("username"))); // "JohnDoe"
- En utilisant
encodeURIComponent
, vous pouvez stocker en toute sécurité des espaces, des symboles, etc. dans unCookie
. - Lors de la lecture, utilisez
decodeURIComponent
pour retrouver la chaîne d'origine. - Dans cet exemple,
max-age=604800
est utilisé pour définir la période d'expiration à 7 jours (604 800 secondes). Ceci est une méthode pour spécifier la date d'expiration, similaire àexpires
.max-age
peut être spécifié en secondes et est souvent plus facile à utiliser.
Exemple pratique : Sauvegarder et charger un thème
Voici un exemple de sauvegarde du thème choisi par l’utilisateur dans un cookie et de son application automatique lors de la prochaine visite.
1function setTheme(theme) {
2 document.cookie =
3 "theme=" + encodeURIComponent(theme) +
4 "; max-age=604800; path=/; SameSite=None; Secure"; // 1 week
5 applyTheme(theme);
6}
7
8function applyTheme(theme) {
9 document.body.style.backgroundColor = theme === "dark" ? "#333" : "#fff";
10 document.body.style.color = theme === "dark" ? "#fff" : "#000";
11}
12
13function getCookie(name) {
14 const cookies = document.cookie.split('; ');
15 for (const cookie of cookies) {
16 const [key, value] = cookie.split('=');
17 if (key === name) {
18 return decodeURIComponent(value);
19 }
20 }
21 return null;
22}
23
24const savedTheme = getCookie("theme");
25if (savedTheme) {
26 applyTheme(savedTheme);
27}
1<button onclick="setTheme('light')">Light</button>
2<button onclick="setTheme('dark')">Dark</button>
- La fonction
setTheme
enregistre le thème sélectionné dans unCookie
et appelle immédiatementapplyTheme
pour mettre à jour l'écran. - La fonction
applyTheme
modifie les couleurs de fond et de texte dubody
en fonction du thème. - Dans cet exemple, puisque
max-age=604800
est défini, le paramètre du thème est conservé pendant une semaine. - Comme le choix de l'utilisateur peut être conservé lors d'une visite ultérieure sur la page, l'expérience utilisateur est améliorée.
Limitations et précautions concernant les cookies
Gardez à l’esprit les points suivants lors de l’utilisation des cookies :.
-
Limites de taille La taille d’un cookie individuel est limitée à environ 4 Ko.
-
Limite sur le nombre de cookies pouvant être enregistrés Selon le navigateur, seuls 20 à 50 peuvent être enregistrés par domaine.
-
Précautions de sécurité Le contenu des
cookies
est généralement enregistré en texte brut, il n'est donc pas adapté au stockage d'informations confidentielles telles que les mots de passe. -
Cookies inaccessibles depuis JavaScript Les
cookies
ayant l'attributHttpOnly
ne peuvent pas être lus depuis JavaScript pour des raisons de sécurité.
Serveur et cookies
1Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict
Certains attributs de cookie
, tels que HttpOnly
, ne peuvent pas être définis via JavaScript. Ceux-ci doivent être définis côté serveur.
Résumé
Manipuler les cookies
avec JavaScript peut améliorer l'expérience utilisateur et maintenir l'état. Cependant, veuillez garder à l'esprit les points suivants pour les gérer en toute sécurité et de manière appropriée.
-
Conservez uniquement les informations strictement nécessaires Du point de vue de la confidentialité et de la sécurité, évitez de stocker des informations personnelles ou sensibles et n'enregistrez que les données nécessaires.
-
Définissez correctement les attributs de sécurité Définissez des attributs comme
Secure
etSameSite
pour empêcher les attaques inter-sites telles que XSS et CSRF. -
Encodage et décodage des données Utilisez
encodeURIComponent
etdecodeURIComponent
pour enregistrer et lire en toute sécurité les valeurs descookies
afin que les caractères spéciaux et le japonais soient correctement pris en charge.
En apprenant la bonne utilisation des cookies
, vous pouvez concevoir des applications web plus avancées et sécurisées.
Vous pouvez suivre l'article ci-dessus avec Visual Studio Code sur notre chaîne YouTube. Veuillez également consulter la chaîne YouTube.