15%

Économisez 15% sur tous les services d'hébergement

Testez vos compétences et obtenez Réduction sur tout plan d'hébergement

Utilisez le code :

Skills
Commencer
10.10.2024

Erreur HTTP 401 Non Autorisé : Guide Complet de Diagnostic et de Correction

Le code de statut HTTP 401 Unauthorized signifie que le serveur a reçu votre requête mais refuse de la traiter car des identifiants d’authentification valides étaient soit absents, incorrects ou expirés. Contrairement à une erreur 403 Forbidden — où le serveur vous reconnaît mais refuse l’accès en fonction des permissions — un 401 signale spécifiquement un échec d’authentification : le serveur ne sait pas qui vous êtes, ou ne peut pas le vérifier.

Cette distinction est importante. Une réponse 401 inclut toujours un en-tête WWW-Authenticate dans la réponse du serveur, indiquant au client quel schéma d’authentification utiliser. Si cet en-tête est absent, vous avez peut-être affaire à un serveur mal configuré plutôt qu’à un problème d’identifiants. Connaître le mode d’échec exact avant de commencer le dépannage permet de gagner un temps considérable.

À quoi ressemble réellement une réponse 401

L’erreur apparaît sous plusieurs variantes de message selon le logiciel serveur, le framework ou le CDN devant l’application :

  • 401 Unauthorized
  • HTTP Error 401 – Unauthorized
  • 401 Unauthorized: Access is denied due to invalid credentials
  • Authorization Required
  • 401 Authorization Required (courant dans NGINX)
    HTTP 401 (clients API, Postman, curl)
    
    Tous ces codes correspondent au même code de statut défini par la RFC 9110. La variation dans la formulation est purement cosmétique — déterminée par le serveur web, le proxy inverse ou le framework d’application générant la réponse.
    L’anatomie technique d’une erreur 401
    Comprendre ce qui se passe au niveau du protocole évite les suppositions. Lorsqu’un client envoie une requête à une ressource protégée sans identifiants, le serveur répond avec :
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: Bearer realm="example", error="invalid_token"
    Content-Type: application/json
    L’en-tête WWW-Authenticate est le défi du serveur. Il indique au client exactement quel schéma — Basic, Bearer, Digest, NTLM, ou un schéma personnalisé — est requis. Un client qui ignore cet en-tête et réessaie sans ajuster sa requête bouclera indéfiniment.
    401 vs. 403 vs. 407 : connaître la différence
    
    
    
    Code de statut
    Nom
    Cause principale
    En-tête `WWW-Authenticate`
    
    
    
    
    
    
    
    
    —
    —
    —
    —
    
    
    
    
    
    
    
    
    401
    Unauthorized
    Identifiants d’authentification manquants ou invalides
    Requis par la spécification
    
    
    
    
    
    
    
    
    403
    Forbidden
    Authentifié mais manque de permission
    Absent
    
    
    
    
    
    
    
    
    407
    Proxy Auth Required
    Le serveur proxy requiert des identifiants
    En-tête `Proxy-Authenticate`
    
    
    
    
    
    
    
    
    511
    Network Auth Required
    Portail captif (Wi-Fi d’hôtel, etc.)
    Non applicable
    
    
    
    
    
    Confondre un 403 avec un 401 est une erreur courante chez les développeurs. Si votre serveur retourne 401 mais omet WWW-Authenticate, il n’est techniquement pas conforme à la RFC 9110 — et certains clients HTTP stricts traiteront la réponse comme malformée.
    Causes principales d’une erreur 401 Unauthorized
    Problèmes d’identifiants et de tokens
    
    Nom d’utilisateur ou mot de passe incorrect — la cause la plus fréquente pour les accès via navigateur
    Tokens d’accès expirés — les tokens Bearer OAuth 2.0 ont une valeur expires_in finie ; une fois écoulée, chaque requête retourne 401 jusqu’à ce que le token soit renouvelé
    Clés API révoquées — les clés peuvent être invalidées côté serveur sans que le client en soit notifié
    Incompatibilité de signature JWT — si le secret de signature change et que le client détient un token signé avec l’ancien secret, la vérification échoue silencieusement
    Décalage d’horloge — les JWT incluent des claims iat (émis à) et exp (expiration) validés par rapport à l’heure du serveur ; une horloge client dérivant de plus de quelques minutes peut entraîner le rejet de tokens valides
    
    En-têtes d’autorisation manquants ou malformés
    Chaque schéma d’authentification a un format d’en-tête précis. S’en écarter — même d’un seul espace ou d’un rembourrage Base64 incorrect — produit un 401 :
    # Correct Basic Auth header
    Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
    
    # Correct Bearer token header
    Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
    Une erreur courante est d’envoyer Authorization: bearer <token> (b en minuscules). Bien que la RFC 6750 indique que le nom du schéma est insensible à la casse, de nombreuses bibliothèques côté serveur effectuent une correspondance de chaîne stricte et rejettent la variante en minuscules.
    Mauvaise configuration côté serveur
    
    Mauvaise méthode d’authentification imposée — un serveur configuré pour OAuth 2.0 recevant des en-têtes Basic Auth les rejettera
    Directives .htaccess — sur Apache, une directive AuthType, AuthName ou Require mal configurée dans .htaccess bloquera chaque requête derrière une invite de mot de passe
    Blocs auth_basic NGINX — une directive auth_basic appliquée au mauvais bloc location peut bloquer les utilisateurs légitimes
    Proxy inverse supprimant les en-têtes — les équilibreurs de charge et les proxies inverses (NGINX, HAProxy, Cloudflare) peuvent supprimer ou réécrire les en-têtes Authorization avant qu’ils n’atteignent le serveur d’origine
    
    Interférences du navigateur et côté client
    
    Cookies corrompus — les cookies de session portant l’état d’authentification peuvent être corrompus ou incompatibles après une invalidation de session côté serveur
    Extensions de navigateur agressives — les bloqueurs de publicités, les extensions de confidentialité et les extensions VPN peuvent modifier ou supprimer les en-têtes de requête
    Échecs du préflight CORS — lors d’appels API cross-origin, le navigateur envoie une requête de préflight OPTIONS ; si le serveur n’y répond pas correctement, la requête authentifiée réelle n’est jamais envoyée
    
    Facteurs d’infrastructure et de réseau
    
    Règles de pare-feu bloquant les points de terminaison d’authentification — les WAF (Web Application Firewalls) avec des règles trop agressives peuvent signaler et bloquer les requêtes contenant des en-têtes Authorization comme des attaques d’injection potentielles
    CDN mettant en cache les réponses authentifiées — si un CDN met en cache une réponse 401 et la sert aux utilisateurs suivants, même des identifiants valides sembleront échouer
    Limitation de débit basée sur l’IP — des tentatives d’authentification échouées répétées peuvent déclencher un blocage temporaire qui retourne 401 pour toutes les requêtes provenant de cette IP
    
    Comment corriger une erreur 401 : étape par étape
    Pour les utilisateurs finaux et l’accès via navigateur
    Étape 1 : Vérifier les identifiants avec précision
    Vérifiez que la touche Verr Maj est désactivée. Confirmez que vous utilisez le mot de passe actuel — pas celui enregistré avant une réinitialisation récente. Si votre compte utilise l’authentification multi-facteurs (MFA), assurez-vous que le code à usage unique n’a pas expiré (les codes TOTP sont valides pendant 30 secondes par défaut).
    Étape 2 : Effacer les cookies et le cache du navigateur
    Les cookies de session obsolètes sont une source persistante de boucles 401. Dans Chrome, accédez à chrome://settings/clearBrowserData, définissez la plage de temps sur Toute la période, cochez Cookies et autres données des sites et Images et fichiers en cache, puis effacez. Dans Firefox, utilisez about:preferences#privacy et cliquez sur Effacer les données.
    Après avoir effacé, fermez tous les onglets du navigateur pour le domaine concerné avant de réessayer — certains navigateurs maintiennent un état de session en mémoire qui survit à un effacement du cache si l’onglet reste ouvert.
    Étape 3 : Tester dans une fenêtre privée/incognito
    Une fenêtre privée démarre sans cookies, sans données en cache et avec la plupart des extensions désactivées. Si le 401 disparaît en mode incognito, le problème est définitivement côté client : soit un cookie corrompu, une mauvaise réponse en cache, ou une extension de navigateur.
    Étape 4 : Désactiver les extensions sélectivement
    Accédez à chrome://extensions/ et désactivez toutes les extensions. Rechargez la page. Si l’authentification réussit, réactivez les extensions une par une pour isoler le coupable. Privacy Badger, uMatrix et certaines extensions VPN sont des coupables fréquents.
    Étape 5 : Vérifier l’URL pour des erreurs
    Assurez-vous de ne pas naviguer vers un chemin qui nécessite des permissions élevées. Une URL comme /admin/dashboard retournera 401 si votre session manque de privilèges administrateur — même si votre connexion de base est valide. Vérifiez le chemin exact avec le propriétaire du site ou la documentation.
    Étape 6 : Réinitialiser votre mot de passe
    Si une expiration des identifiants est suspectée, utilisez le flux Mot de passe oublié. Après la réinitialisation, effacez à nouveau les cookies avant de tenter de vous connecter — l’ancien cookie de session peut entrer en conflit avec le nouvel état des identifiants.
    Pour les développeurs et les intégrations API
    Étape 7 : Inspecter la réponse HTTP brute
    Avant de modifier quoi que ce soit, capturez la réponse exacte du serveur en utilisant curl avec une sortie détaillée :
    curl -v -H "Authorization: Bearer YOUR_TOKEN" https://api.example.com/endpoint
    L’indicateur -v affiche à la fois les en-têtes de requête envoyés et les en-têtes de réponse reçus, y compris le défi WWW-Authenticate. Cela vous indique précisément quel schéma le serveur attend.
    Étape 8 : Valider l’état du token
    Pour les tokens JWT, décodez le payload sans vérifier la signature pour inspecter les claims :
    echo "YOUR_JWT_PAYLOAD_BASE64" | base64 --decode | python3 -m json.tool
    Vérifiez le champ exp (horodatage Unix). Comparez-le à l’heure actuelle :
    date +%s
    Si exp est inférieur à l’horodatage actuel, le token est expiré. Implémentez un flux de renouvellement en utilisant le point de terminaison de token de votre fournisseur OAuth avant que le token n’atteigne son expiration.
    Étape 9 : Auditer la configuration d’authentification côté serveur
    Sur Apache, inspectez le fichier .htaccess ou la configuration d’hôte virtuel concerné :
    AuthType Basic
    AuthName "Restricted Area"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
    Confirmez que le chemin AuthUserFile existe et est lisible par le processus du serveur web. Sur NGINX, vérifiez le bloc serveur ou location concerné :
    location /secure/ {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
    Vérifiez que le fichier .htpasswd contient les identifiants hachés corrects. Utilisez htpasswd -v /etc/nginx/.htpasswd username pour tester un mot de passe par rapport au hash stocké.
    Étape 10 : Vérifier les journaux du serveur
    Les journaux du serveur fournissent la vérité terrain. Sur Apache :
    tail -f /var/log/apache2/error.log | grep 401
    Sur NGINX :
    tail -f /var/log/nginx/error.log | grep 401
    Pour l’authentification au niveau de l’application (Node.js, Django, Laravel), vérifiez la sortie des journaux propres à l’application. L’entrée de journal spécifiera souvent si l’échec était dû à un en-tête manquant, un token invalide ou un échec de recherche en base de données.
    Étape 11 : Vérifier le transfert des en-têtes par le proxy inverse
    Si votre application se trouve derrière NGINX agissant comme proxy inverse, assurez-vous que l’en-tête Authorization est transmis à l’application en amont :
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Authorization $http_authorization;
        proxy_pass_header Authorization;
    }
    Sans proxy_pass_header Authorization, NGINX supprime l’en-tête avant qu’il n’atteigne votre serveur d’application — provoquant un 401 qui ressemble à une erreur client mais est entièrement causé par l’infrastructure.
    Étape 12 : Inspecter les règles WAF et de pare-feu
    Si vous utilisez un WAF (ModSecurity, Cloudflare WAF, AWS WAF), vérifiez si une règle correspond et bloque les requêtes contenant des en-têtes Authorization. Passez temporairement le WAF en mode détection uniquement et réessayez. Si le 401 disparaît, affinez la règle incriminée plutôt que de désactiver entièrement le WAF.
    Étape 13 : Auditer le comportement de mise en cache du CDN
    Assurez-vous que votre CDN ne met pas en cache les réponses 401. Dans Cloudflare, définissez une règle de cache pour contourner le cache pour les points de terminaison authentifiés. Dans AWS CloudFront, configurez le comportement pour transmettre l’en-tête Authorization à l’origine — par défaut, CloudFront le supprime, ce qui signifie que votre origine ne reçoit jamais les identifiants et retourne toujours 401.
    Implémenter une authentification robuste : bonnes pratiques pour les propriétaires de serveurs
    Si vous gérez une application web ou une API — que ce soit dans un environnement VPS Hosting ou un Serveur Dédié — ces pratiques empêchent les erreurs 401 d’atteindre vos utilisateurs dès le départ.
    Gestion du cycle de vie des tokens
    N’émettez jamais de tokens sans une expiration définie. Pour OAuth 2.0, utilisez des tokens d’accès à courte durée de vie (15–60 minutes) associés à des tokens de renouvellement à longue durée de vie. Implémentez un renouvellement proactif des tokens : déclenchez un renouvellement lorsque le token d’accès a moins de 20 % de sa durée de vie restante, pas après qu’il ait déjà expiré.
    Access Token TTL:  15 minutes
    Refresh Token TTL: 30 days (rotated on each use)
    Refresh trigger:   < 3 minutes remaining on access token
    Pour les systèmes basés sur JWT, implémentez la rotation des clés avec une période de grâce. Lors de la rotation du secret de signature, gardez l’ancien secret valide pendant une durée de vie de token supplémentaire afin que les tokens en cours ne soient pas immédiatement invalidés.
    Réponses d’erreur significatives
    Une réponse 401 doit toujours inclure un corps qui aide le client à comprendre quoi faire ensuite :
    {
      "error": "invalid_token",
      "error_description": "The access token expired at 2024-01-15T10:30:00Z",
      "error_uri": "https://api.example.com/docs/authentication"
    }
    Les réponses 401 vagues qui ne retournent qu’un code de statut obligent les développeurs à deviner la raison de l’échec, augmentant considérablement la charge de support.
    Journalisation et alertes d’authentification
    Journalisez chaque échec d’authentification avec suffisamment de contexte : horodatage, adresse IP, agent utilisateur, ressource demandée et raison de l’échec. Configurez des alertes pour les schémas anormaux — un pic de 401 provenant d’une seule IP indique soit une mauvaise configuration, soit une attaque par bourrage d’identifiants. Les plateformes fonctionnant sur des Serveurs Dédiés ont un accès complet aux journaux au niveau système et peuvent implémenter des pipelines d’alerte personnalisés sans restriction.
    Transmission sécurisée des identifiants
    Les identifiants d’authentification ne doivent voyager que sur des connexions chiffrées. Si votre application gère les connexions des utilisateurs, un Certificat SSL est non négociable — transmettre des identifiants Basic Auth sur du HTTP simple expose les noms d’utilisateur et mots de passe encodés en Base64 en clair sur le réseau.
    Portée et rotation des clés API
    Émettez des clés API avec la portée minimale requise. Implémentez une politique de rotation des clés et fournissez aux clients un mécanisme de rotation qui leur permet d’échanger des clés sans interruption de service. Révoquez immédiatement les clés compromises et notifiez les clients concernés via un canal documenté.
    Test des flux d’authentification dans CI/CD
    Intégrez des tests de flux d’authentification dans votre pipeline de déploiement. Une suite de tests qui vérifie les identifiants valides, les tokens expirés, les en-têtes manquants et les clés révoquées détectera les régressions avant qu’elles n’atteignent la production. C’est particulièrement critique après les mises à jour de dépendances qui touchent le middleware d’authentification.
    Erreurs 401 dans des environnements spécifiques
    WordPress
    WordPress retourne 401 sur son API REST (/wp-json/) lorsque les mots de passe d’application sont mal configurés ou lorsqu’un plugin de sécurité (Wordfence, iThemes Security) bloque l’accès à l’API REST. Vérifiez Settings > Permalinks et réenregistrez — cela vide les règles de réécriture qui peuvent casser les points de terminaison d’authentification. Si vous gérez WordPress sur un VPS avec cPanel, vérifiez que mod_rewrite est activé et que .htaccess est accessible en écriture.
    cPanel et panneaux de contrôle d’hébergement web
    Les répertoires protégés par mot de passe configurés via cPanel utilisent mod_authn_file d’Apache. Si le chemin du fichier .htpasswd dans le .htaccess généré est absolu et que la racine du document change (courant après les migrations de compte), le chemin se brise et chaque requête retourne 401. Utilisez toujours des chemins relatifs ou vérifiez les chemins absolus après toute migration. Les environnements utilisant des Panneaux de contrôle VPS fournissent un accès direct au système de fichiers pour corriger ces chemins sans ouvrir un ticket de support.
    Clients de messagerie et authentification SMTP
    Les serveurs SMTP retournent un équivalent au niveau protocole du 401 (535 Authentication credentials invalid) lorsque les identifiants du client de messagerie sont incorrects ou lorsque le serveur requiert STARTTLS et que le client tente une authentification en clair. Si vous configurez un Hébergement Email, assurez-vous que votre client de messagerie est configuré avec la méthode d’authentification correcte (PLAIN, LOGIN ou CRAM-MD5) et que TLS est imposé avant la transmission des identifiants.
    Applications mobiles
    Les applications mobiles rencontrent fréquemment des erreurs 401 après qu’un utilisateur change son mot de passe sur le web — le token de renouvellement stocké par l’application est invalidé côté serveur mais l’application n’a aucun mécanisme pour le détecter jusqu’au prochain échec d’appel API. Implémentez un intercepteur HTTP global qui capture les réponses 401, tente un renouvellement de token exactement une fois, et si le renouvellement retourne également 401, redirige l’utilisateur vers l’écran de connexion avec un message clair.
    Matrice de décision : diagnostiquer votre erreur 401
    
    
    
    Symptôme
    Cause la plus probable
    Première action
    
    
    
    
    
    
    
    
    —
    —
    —
    
    
    
    
    
    
    
    
    401 sur toutes les requêtes, y compris celles qui fonctionnaient auparavant
    Token expiré ou révoqué
    Inspecter le claim `exp` du token ; déclencher un renouvellement
    
    
    
    
    
    
    
    
    401 uniquement dans le navigateur, pas dans curl
    Cookie corrompu ou interférence d’extension
    Effacer les cookies ; tester en incognito
    
    
    
    
    
    
    
    
    401 uniquement depuis une IP spécifique
    Limite de débit du pare-feu ou blocage IP
    Vérifier les journaux WAF ; mettre en liste blanche si légitime
    
    
    
    
    
    
    
    
    401 après migration du serveur
    Chemin `.htpasswd` cassé
    Vérifier le chemin `AuthUserFile` dans `.htaccess`
    
    
    
    
    
    
    
    
    401 sur le préflight OPTIONS
    Mauvaise configuration CORS
    Ajouter `Authorization` à `Access-Control-Allow-Headers`
    
    
    
    
    
    
    
    
    401 malgré des identifiants corrects
    Proxy inverse supprimant les en-têtes
    Ajouter `proxy_pass_header Authorization` à la configuration NGINX
    
    
    
    
    
    
    
    
    401 sur les ressources mises en cache par le CDN
    CDN servant une réponse 401 mise en cache
    Contourner le cache pour les routes authentifiées
    
    
    
    
    
    
    
    
    401 après mise à jour de dépendance
    Changement cassant dans le middleware d’authentification
    Consulter le changelog ; vérifier la logique d’analyse des en-têtes
    
    
    
    
    
    Liste de contrôle pratique avant d’escalader une erreur 401
    Utilisez cette liste de contrôle avant de soumettre un ticket de support ou d’escalader vers votre équipe d’infrastructure :
    
    Capturé la réponse HTTP brute avec curl -v et confirmé la valeur de l’en-tête WWW-Authenticate
  • Décodé le JWT ou le token et vérifié le claim exp par rapport à l’heure actuelle du serveur
  • Confirmé que le format de l’en-tête Authorization correspond au schéma annoncé par le serveur
  • Testé dans une fenêtre incognito avec toutes les extensions désactivées
  • Effacé tous les cookies et le cache pour le domaine concerné
  • Vérifié les journaux d’erreurs du serveur pour la raison spécifique du rejet
  • Vérifié que la configuration du proxy inverse transmet l’en-tête Authorization
  • Confirmé que le CDN ne met pas en cache la réponse 401
  • Vérifié les règles WAF pour les faux positifs correspondant à l’en-tête Authorization
  • Vérifié que SSL/TLS est actif sur le point de terminaison — les identifiants ne doivent jamais voyager non chiffrés

FAQ

Quelle est la différence entre HTTP 401 et HTTP 403 ?

Un 401 signifie que le serveur ne peut pas identifier qui vous êtes — l’authentification est manquante ou invalide. Un 403 signifie que le serveur sait qui vous êtes mais a décidé que vous n’avez pas la permission d’accéder à la ressource. Corrigez un 401 en fournissant ou en corrigeant les identifiants ; corrigez un 403 en ajustant les règles de contrôle d’accès ou les permissions.

Pourquoi mon API retourne-t-elle 401 même lorsque j’envoie le bon token ?

Les causes les plus courantes sont l’expiration du token (vérifiez le claim exp), le décalage d’horloge entre le client et le serveur (synchronisez NTP), un secret de signature changé invalidant les tokens existants, ou l’en-tête Authorization supprimé par un proxy inverse ou un CDN avant d’atteindre le serveur d’origine.

Une erreur 401 peut-elle être causée par une mauvaise configuration du serveur plutôt que par une erreur client ?

Oui. Un fichier .htaccess mal configuré, un bloc auth_basic NGINX appliqué au mauvais emplacement, un proxy inverse supprimant l’en-tête Authorization, ou une règle WAF bloquant les requêtes authentifiées peuvent tous produire des réponses 401 même lorsque le client envoie des identifiants parfaitement valides.

Comment prévenir les erreurs 401 causées par l’expiration des tokens dans une application en production ?

Implémentez un renouvellement proactif des tokens — surveillez la durée de vie restante du token et renouvelez-le avant l’expiration, pas après. Pour OAuth 2.0, utilisez le point de terminaison de token de renouvellement pour obtenir un nouveau token d’accès lorsque le token actuel a moins de 20 % de son TTL restant. Ajoutez un intercepteur de réponse HTTP global qui gère automatiquement les réponses 401 en tentant un renouvellement unique du token avant de réessayer la requête originale.

Effacer les cookies corrige-t-il toujours une erreur 401 dans un navigateur ?

Seulement si la cause principale est un cookie de session corrompu ou obsolète. Si le 401 est causé par une mauvaise configuration côté serveur, une clé API expirée ou un blocage par pare-feu, effacer les cookies n’aura aucun effet. Utilisez une fenêtre incognito comme étape de diagnostic — si le 401 persiste en incognito, le problème est côté serveur ou côté réseau, pas côté navigateur.

15%

Économisez 15% sur tous les services d'hébergement

Testez vos compétences et obtenez Réduction sur tout plan d'hébergement

Utilisez le code :

Skills
Commencer