Vous déboguez un appel API et votre client HTTP retourne 419. Vous vérifiez le registre officiel d’IANA — il n’y est pas. Vous cherchez sur MDN — rien. Qu’est-ce que HTTP 419, et pourquoi votre serveur l’envoie ?
La réponse courte
HTTP 419 n’est pas un code de statut HTTP officiel. Il n’a jamais été défini dans aucune RFC ni enregistré auprès d’IANA. C’est un code de statut personnalisé utilisé par des frameworks spécifiques — notamment Laravel (PHP) — pour indiquer qu’un token CSRF a expiré ou est manquant.
Si vous voyez 419, votre requête soit :
- N’a pas inclus de token CSRF du tout, ou
- A inclus un token CSRF qui a expiré (la valeur par défaut de Laravel est 120 minutes), ou
- Le cookie de session a été perdu entre les requêtes
D’où vient HTTP 419
Laravel définit ce code de statut dans son gestionnaire d’exceptions. Lorsqu’une requête POST, PUT, PATCH ou DELETE atteint une route protégée par le middleware VerifyCsrfToken et que le token est invalide, Laravel répond avec :
HTTP/1.1 419 Page Expired
Le texte “Page Expired” est la phrase de raison par défaut de Laravel pour 419. Il ne décrit pas une page — il décrit l’état de session auquel le token CSRF de la page était lié.
Autres frameworks utilisant 419
Bien que Laravel soit la source la plus courante, d’autres frameworks PHP et APIs personnalisées ont adopté 419 pour une sémantique similaire de “session/token expiré”. C’est une convention de facto dans l’écosystème PHP, pas un standard universel.
Comment résoudre HTTP 419
Si vous construisez une application Laravel
Pour les formulaires navigateur (rendu traditionnel) :
La cause la plus courante est un délai d’expiration de session. L’utilisateur ouvre un formulaire, s’éloigne pendant deux heures et soumet. Le token CSRF était valide lorsque la page s’est chargée mais la session a expiré depuis.
Solutions :
- Prolongez la durée de vie de la session dans
config/session.php:
// La valeur par défaut est 120 minutes
'lifetime' => 480, // 8 heures
- Ajoutez le rafraîchissement du token côté client — au chargement de la page, faites une requête AJAX légère pour obtenir un token CSRF frais :
<meta name="csrf-token" content="{{ csrf_token() }}">
// Rafraîchir le token toutes les 30 minutes
setInterval(() => {
fetch('/api/csrf-token', {
headers: { 'X-Requested-With': 'XMLHttpRequest' }
}).then(r => r.json()).then(data => {
document.querySelector('meta[name="csrf-token"]').content = data.token;
});
}, 30 * 60 * 1000);
- Gérez 419 élégamment côté client — capturez la réponse 419 et redirigez vers la connexion ou rechargez la page :
fetch('/api/save', { method: 'POST', body: formData })
.then(response => {
if (response.status === 419) {
// Session expirée — recharger pour obtenir un token frais
window.location.reload();
}
return response.json();
});
Si vous consommez une API Laravel
Si vous appelez une API Laravel depuis une application mobile, un SPA ou un service externe et obtenez 419 :
-
Vérifiez votre gestion de session/cookie. L’API pourrait attendre des cookies de session. Assurez-vous que votre client HTTP envoie et reçoit des cookies.
-
Utilisez l’authentification basée sur des tokens à la place. Pour les consommateurs d’API, les tokens Laravel Sanctum ou Laravel Passport n’ont pas le même problème d’expiration CSRF. Utilisez les en-têtes
Authorization: Bearer <token>au lieu des cookies de session. -
Ré-authentifiez-vous. Si la session a expiré, la seule solution est de se reconnecter et d’obtenir une session fraîche.
Si vous êtes DevOps / infrastructure
Si vous voyez 419 dans les journaux de votre équilibreur de charge ou passerelle API :
- Vérifiez si le backend est Laravel. 419 est presque toujours du CSRF Laravel.
- Vérifiez le stockage de session. Si Redis ou le magasin de sessions basé sur fichier est plein ou mal configuré, les sessions peuvent expirer prématurément.
- Vérifiez la synchronisation des horloges. Si les horloges de vos serveurs d’application sont décalées, les calculs d’expiration de session peuvent être incorrects.
Comment vérifier les codes de statut HTTP
Si vous déboguez des réponses d’API et devez rapidement rechercher ce que signifie un code de statut, vous pouvez utiliser un outil de référence. Notre référence des codes de statut HTTP contient les 63 codes officiels avec descriptions et recherche.
Codes de statut liés
| Code | Signification | Relation |
|---|---|---|
| 401 | Non autorisé | Token d’authentification manquant ou invalide |
| 403 | Interdit | Authentifié mais non autorisé |
| 408 | Délai d’expiration de requête | Le serveur a expiré en attendant la requête |
| 419 | Page expirée | Token CSRF expiré (spécifique à Laravel) |
| 440 | Délai d’expiration de connexion | Autre variante spécifique au framework |
| 503 | Service indisponible | Le serveur est en panne ou surchargé |
Le fond du matter
HTTP 419 est Laravel vous disant “votre session a expiré, je ne peux pas faire confiance à cette requête”. Ce n’est pas un bug — c’est une fonctionnalité de sécurité qui fonctionne comme prévu. La solution est soit prolonger la durée de vie de la session, soit rafraîchir les tokens côté client, soit passer aux tokens d’API pour l’accès programmatique.