Les Cookies dans Django
Définition et principe
Un cookie est une paire clé-valeur conservée dans le navigateur de l'utilisateur. Il est généré par le serveur, transmis au navigateur, qui le stocke pour le renvoyer lors des requêtes suivantes.
Écrasement des cookies
Si un cookie avec le même nom est envoyé par le serveur, il remplace la valeur précédente. Par exemple, un premier envoi avec Set-Cookie: a=A suivi d'un second avec Set-Cookie: a=AA laissera seulement le cookie a=AA dans le navigateur.
Spécifications des cookies
- Taille maximale d'un cookie : 4 Ko ;
- Nombre maximum de cookies par serveur : 20 ;
- Nombre maximum de cookies par navigateur : 300.
Ces valeurs sont indicatives et peuvent varier selon les navigateurs. Les cookies ne sont pas partagés entre différents navigateurs.
Visualisation dans le navigateur
Pour consulter les cookies, ouvrez les outils de développement (F12), allez dans l'onglet Réseau, puis Cookies.
Utilisation des cookies
Pour définir un cookie, on utilise la méthode set_cookie sur un objet HttpResponse.
def creer_cookie(requete):
reponse = HttpResponse('Créé')
reponse.set_cookie('utilisateur', 'alice')
return reponse
Pour récupérer un cookie, accédez au dictionnaire request.COOKIES.
def lire_cookie(requete):
donnees = requete.COOKIES
utilisateur = donnees.get('utilisateur')
return HttpResponse(f'Utilisateur récupéré: {utilisateur}')
Pour supprimer un cookie, utilisez delete_cookie.
def supprimer_cookie(requete):
reponse = HttpResponse('Supprimé')
reponse.delete_cookie('utilisateur')
return reponse
Décorateur d'authentification avec cookies
Un décorateur peut vérifier la présence d'un cookie pour restreindre l'accès à certaines pages.
from django.shortcuts import redirect
def authentification_requise(fonction):
def enveloppe(requete, *args, **kwargs):
url_suivante = requete.get_full_path()
if requete.COOKIES.get('connecte'):
return fonction(requete, *args, **kwargs)
else:
return redirect(f'/connexion/?next={url_suivante}')
return enveloppe
Attributs supplémentaires des cookies
Les cookies peuvent être signés avec un sel pour plus de sécurité.
reponse.set_signed_cookie('token', 'valeur', salt='cle_secrete')
Durée de vie définie en secondes avec max_age.
reponse.set_cookie('session', 'actif', max_age=3600)
Chemin d'accès avec path pour limiter le cookie à certaines URL.
reponse.set_cookie('prefer', 'sombre', path='/profil/')
Domaine avec domain, sécurité avec secure et restriction HTTP avec httponly.
Les Sessions dans Django
Pourquoi utiliser des sessions ?
Les sessions résolvent les problèmes de sécurité des cookies en stockant les données sur le serveur. Seul un identifiant unique est envoyé au navigateur sous forme de cookie.
Opérations de base
Pour manipuler les données de session dans Django.
# Accéder à une donnée
valeur = requete.session.get('cle')
# Définir une donnée
requete.session['cle'] = 'valeur'
# Supprimer une donnée
del requete.session['cle']
# Récupérer toutes les clés
cles = requete.session.keys()
# Supprimer la session courante
requete.session.flush()
Configuration des sessions
Dans les paramètres Django, on peut configurer le moteur de session.
# Moteur de base de données (par défaut)
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# Moteur de cache
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
# Moteur fichier
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = '/chemin/vers/dossier'
# Autres paramètres
SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_AGE = 1209600 # Deux semaines en secondes
Décorateurs dans les vues basées sur les classes (CBV)
Pour appliquer un décorateur dans une CBV, utilisez method_decorator.
from django.views import View
from django.utils.decorators import method_decorator
class ListeUtilisateurs(View):
@method_decorator(authentification_requise)
def get(self, requete):
return HttpResponse('Liste des utilisateurs')
def post(self, requete):
return HttpResponse('Action post')