Il manque quelque chose dans les autres réponses : il faut comprendre que l'authentification et l'autorisation dans le contexte de la RFC 2616 se réfèrent UNIQUEMENT au protocole d'authentification HTTP de la RFC 2617. L'authentification par des schémas en dehors de la RFC 2617 n'est pas prise en charge par les codes d'état HTTP et n'est pas prise en compte dans la décision d'utiliser 401 ou 403.
Brève et laconique
Unauthorized indique que le client n'est pas authentifié selon la norme RFC2617 et que le serveur lance le processus d'authentification. Forbidden indique soit que le client est authentifié selon la norme RFC2617 et n'a pas d'autorisation, soit que le serveur ne prend pas en charge la norme RFC2617 pour la ressource demandée.
Autrement dit, si vous avez votre propre processus de connexion et que vous n'utilisez jamais l'authentification HTTP, 403 est toujours la réponse appropriée et 401 ne doit jamais être utilisé.
Détaillé et approfondi
Extrait de la RFC2616
10.4.2 401 Non autorisé
La demande nécessite une authentification de l'utilisateur. La réponse DOIT inclure un champ d'en-tête WWW-Authenticate (section 14.47) contenant un défi applicable à la ressource demandée. Le client PEUT répéter la demande avec un champ d'en-tête Authorization approprié (section 14.8).
et
10.4.4 403 Forbidden (Interdit) Le serveur a compris la demande mais refuse de l'exécuter. L'autorisation ne sera pas utile et la demande NE DEVRAIT PAS être répétée.
La première chose à garder à l'esprit est que l'"authentification" et l'"autorisation" dans le contexte de ce document font spécifiquement référence aux protocoles d'authentification HTTP de la RFC 2617. Ils ne font pas référence aux protocoles d'authentification personnalisés que vous avez pu créer en utilisant des pages de connexion, etc. J'utiliserai le terme "login" pour désigner l'authentification et l'autorisation par des méthodes autres que la RFC 2617.
La vraie différence n'est donc pas de savoir quel est le problème ou même s'il existe une solution. La différence est ce que le serveur attend du client pour la suite.
401 indique que la ressource ne peut pas être fournie, mais le serveur DEMANDE que le client se connecte via l'authentification HTTP et a envoyé des en-têtes de réponse pour lancer le processus. Il est possible qu'il y ait des autorisations qui permettent l'accès à la ressource, peut-être pas, mais essayons et voyons ce qui se passe.
403 indique que la ressource ne peut pas être fournie et qu'il n'y a, pour l'utilisateur actuel, aucun moyen de résoudre ce problème via la RFC2617 et qu'il est inutile d'essayer. Cela peut être parce que l'on sait qu'aucun niveau d'authentification n'est suffisant (par exemple à cause d'une liste noire d'IP), mais aussi parce que l'utilisateur est déjà authentifié et n'a pas d'autorité. Le modèle RFC2617 est celui d'un utilisateur et d'un justificatif d'identité, de sorte que le cas où l'utilisateur peut avoir un deuxième ensemble de justificatifs d'identité qui pourrait être autorisé peut être ignoré. Cela ne suggère ni n'implique qu'une sorte de page de connexion ou un autre protocole d'authentification non-RFC2617 peut ou ne peut pas aider - cela est en dehors des normes et de la définition de la RFC2616.
Editar: RFC2616 est obsolète, voir RFC7231 y RFC7235 .
594 votes
401 'Unauthorized' devrait être 401 'Unauthenticated', problème résolu !
94 votes
Je ne sais plus combien de fois mes collègues et moi sommes revenus sur stackoverflow pour cette question. Les normes HTTP devraient peut-être envisager de modifier les noms ou les descriptions de 401 et 403.
0 votes
En fait, je reçois une version différente de cette erreur, comme "os_authType was 'any' and an invalid cookie was sent". Je n'arrive donc pas à trouver comment résoudre ce problème. J'ai beaucoup cherché sur Google, j'ai trouvé des raisons mais je n'ai pas trouvé de solution.
3 votes
@Qwerty non, la nouvelle RFC7231 rend obsolète la RFC2616. 403 a une signification différente maintenant.
2 votes
@fishbone vous n'avez pas non plus noté que le code d'état 401 a été supprimé de cette RFC :D
1 votes
@fishbone il a été ajouté à cette proposition maintenant mais utilise un RFC différent maintenant 7235 tools.ietf.org/html/rfc7235#section-3.1
0 votes
@ChristopheRoussy là où ça devient confus c'est que 403 devrait être Unauthorized ! ;)
0 votes
Si cette proposition apporte des changements significatifs à la signification de 401 et 403, elle n'a aucune chance. La seule chose qu'ils doivent faire est de changer le nom et la documentation et il sera assez difficile de faire en sorte que tous les serveurs utilisent le nouveau nom. Nous avons déjà essayé de rendre obsolètes les standards du web et cela ne fonctionne pas. Le web est trop grand et évolue trop lentement.
0 votes
403 peut rester "interdit". Ce nom est suffisamment clair. C'est le 401 qui prête à confusion et qui devrait probablement être décrit comme "Non connecté".