Comment détruire le cookie avec une déconnexion

Apprends à supprimer proprement le cookie de session à la déconnexion et à gérer la redirection pour une meilleure UX avec React Router 7.

4 min read
Déverrouillez votre potentiel

avec React Router 7

Vous en avez marre de...

❌ perdre du temps à chercher des informations éparpillées
❌ ne pas avoir de retour sur votre progression
Assistant IA spécialisé

Posez vos questions 24/7 à notre IA experte en React Router 7

Quiz interactifs

Validez vos acquis avec des quiz personnalisés et un feedback instantané

9 modules
45 leçons
Accès à vie
299.00
-50%

Pourquoi revoir la logique de déconnexion ?

Clique‐tu sur « Logout », tu es toujours renvoyé sur la page d’accueil. Ce choix paraît anodin mais pose deux soucis :

  1. Cookie fantôme Si l’utilisateur falsifie son cookie (document.cookie) avant de se déconnecter, le backend ne le reconnaît plus… mais le cookie reste stocké. Mieux vaut le supprimer pour repartir d’une session propre.
  2. UX moyenne Souvent on se déconnecte pour changer de compte et revenir immédiatement sur la page courante (ex. /users). Forcer un détour par la home rend la navigation inutilement longue.

Nous allons :

  • centraliser la destruction du cookie dans une fonction logout();
  • permettre la redirection vers la page d’origine grâce au paramètre redirectTo.

1. Créer un helper logout() côté serveur

app/server/sessions.server.ts
1
import { createCookieSessionStorage, redirect } from "react-router";
2
3
const { getSession, destroySession } = createCookieSessionStorage({
4
cookie: { name: "__session" } // config réduite pour l'exemple
5
});
6
7
export async function logout({
8
request,
9
redirectTo = "/"
10
}: { request: Request; redirectTo?: string }) {
11
const session = await getSession(request.headers.get("Cookie"));
12
return redirect(redirectTo, {
13
headers: { "Set-Cookie": await destroySession(session) } // 🍪 supprimé
14
});
15
}
  • destroySession(session) renvoie un header Set-Cookie qui vide le cookie côté navigateur.
  • Le helper est réutilisable dans n’importe quelle route ou middleware.

2. Raccourcir la route /logout

L’endpoint ne fait désormais qu’appeler le helper et transmettre le paramètre d’URL éventuel :

app/routes/logout.tsx
1
import { logout } from "~/server/sessions.server";
2
3
export async function action({ request }: ActionFunctionArgs) {
4
const url = new URL(request.url);
5
const redirectTo = url.searchParams.get("redirectTo") || "/";
6
return logout({ request, redirectTo });
7
}

3. Éviter le « décalage » côté client

Pour remplir automatiquement redirectTo avec la page en cours, on s’appuie sur le hook useLocation.

app/root.tsx
1
import { Form, useLocation, href } from "react-router";
2
3
export function Layout({ children }: { children: React.ReactNode }) {
4
// …
5
const { pathname } = useLocation();
6
7
return (
8
<Form
9
method="POST"
10
action={`${href("/logout")}?redirectTo=${pathname}`} // 🏷️ param dynamique
11
>
12
<button className="cursor-pointer">Logout</button>
13
</Form>
14
);
15
}

Avantages :

  • Depuis /users, tu reviens sur /users (version « déconnecté »).
  • Depuis une route protégée (/profile) tu reçois une double redirection /logout → /profile → /login. C’est volontaire : la deuxième vérification assure qu’aucune page sensible n’est rendue sans session valide.

4. Appeler logout() depuis requireUser()

Lorsque le cookie est corrompu, on veut supprimer la session avant de rediriger vers /login. On déplace donc la logique dans le garde d’authentification :

app/server/sessions.server.ts
1
export async function requireUser({ request }: { request: Request }) {
2
const session = await getSession(request.headers.get("Cookie"));
3
const id = session.get("userId");
4
5
if (!id) {
6
const url = new URL(request.url);
7
const redirectTo = `/login?redirectTo=${url.pathname}`;
8
throw await logout({ request, redirectTo }); // 🔥 cookie détruit
9
}
10
return id;
11
}

Un cookie falsifié est donc effacé avant même que la page protégée ne charge.


5. Ce qui change concrètement

AvantAprès
Route /logout installe un cookie vide etLe helper logout() vide le cookie une seule fois
redirige systématiquement vers /& redirige vers le chemin passé en paramètre
Les pages protégées gardent un cookie invalideCookie effacé dès qu’il est incohérent
Déconnexion casse le flow « switcher de compte »L’utilisateur revient là où il était

6. Résumé des étapes

  1. Extraire la destruction de session dans logout()
  2. Appeler ce helper depuis la route /logout et dans requireUser
  3. Ajouter redirectTo à l’URL du formulaire via useLocation
  4. Accepter la double redirection pour les pages privées – simple et safe
Premium
Quiz interactif
Testez vos connaissances et validez votre compréhension du module avec notre quiz interactif.
1

Comprendre les concepts fondamentaux

Quelle est la principale différence entre les composants client et serveur dans React ?

Les composants client s'exécutent uniquement dans le navigateur
Les composants serveur peuvent utiliser useState
Les composants client sont plus rapides
Il n'y a aucune différence significative
2

Optimisation des performances

Quelle technique est recommandée pour éviter les rendus inutiles dans React ?

Utiliser React.memo pour les composants fonctionnels
Ajouter plus d'états locaux
Éviter d'utiliser les props
Toujours utiliser les class components
3

Architecture des données

Quel hook permet de gérer les effets de bord dans un composant React ?

useEffect
useState
useMemo
useContext
4

Gestion des erreurs

Comment implémenter la gestion des erreurs pour les requêtes API dans React ?

Utiliser try/catch avec async/await
Ignorer les erreurs
Toujours afficher un message d'erreur
Rediriger l'utilisateur
5

Déploiement et CI/CD

Quelle est la meilleure pratique pour déployer une application React en production ?

Utiliser un service CI/CD comme GitHub Actions
Copier les fichiers manuellement via FTP
Envoyer le code source complet
Ne jamais mettre à jour l'application

Débloquez ce quiz et tous les autres contenus premium en achetant ce cours