403 Verbotene vs 401 Nicht autorisierte HTTP-Antworten


2784

Welche HTTP-Antwort muss für eine vorhandene Webseite verwendet werden, für die ein Benutzer jedoch nicht über ausreichende Berechtigungen verfügt (er ist nicht angemeldet oder gehört nicht zur richtigen Benutzergruppe)?

401 Unauthorized?
403 Forbidden?
Etwas anderes?

Was ich bisher auf jedem gelesen habe, ist nicht sehr klar über den Unterschied zwischen den beiden. Welche Anwendungsfälle sind für jede Antwort geeignet?


358
401 'Nicht autorisiert' sollte 401 'Nicht authentifiziert' sein, Problem gelöst!
Christophe Roussy

47
Ich kann mich nicht erinnern, wie oft ich und meine Kollegen für diese Frage zum Stackoverflow zurückgekehrt sind. Vielleicht sollten HTTP-Standards in Betracht ziehen, die Namen oder Beschreibungen für 401 und 403 zu ändern.
Neurite

Tatsächlich erhalte ich eine andere Version dieses Fehlers. wie "os_authType war 'any' und ein ungültiges Cookie wurde gesendet". Also nicht in der Lage herauszufinden, wie man das löst. Ich habe viel gegoogelt, Gründe bekommen, aber keine Lösung gefunden.
Sandeep Anand

@Qwerty nein, der neue RFC7231 veraltet RFC2616. 403 hat jetzt eine andere Bedeutung.
Fischgräte

1
@fishbone Sie haben auch nicht bemerkt, dass der Statuscode 401 aus diesem RFC entfernt wurde: D
Barkermn01

Antworten:


4114

Eine klare Erklärung von Daniel Irvine :

Es gibt ein Problem mit 401 Unauthorized , dem HTTP-Statuscode für Authentifizierungsfehler. Und das ist es auch schon: Es dient der Authentifizierung, nicht der Autorisierung. Wenn Sie eine 401-Antwort erhalten, teilt Ihnen der Server mit: "Sie sind nicht authentifiziert - entweder überhaupt nicht oder falsch authentifiziert -, aber bitte authentifizieren Sie sich erneut und versuchen Sie es erneut." Um Ihnen zu helfen, enthält es immer einen WWW-Authenticate- Header, der die Authentifizierung beschreibt.

Dies ist eine Antwort, die im Allgemeinen von Ihrem Webserver und nicht von Ihrer Webanwendung zurückgegeben wird.

Es ist auch etwas sehr Vorübergehendes; Der Server fordert Sie auf, es erneut zu versuchen.

Für die Autorisierung verwende ich die Antwort 403 Verboten . Es ist permanent, an meine Anwendungslogik gebunden und eine konkretere Antwort als ein 401.

Der Server erhält eine 403-Antwort und sagt Ihnen: „Es tut mir leid. Ich weiß, wer Sie sind - ich glaube, wer Sie sagen, dass Sie sind -, aber Sie haben einfach keine Berechtigung, auf diese Ressource zuzugreifen. Wenn Sie den Systemadministrator freundlich fragen, erhalten Sie möglicherweise die Erlaubnis. Aber bitte stören Sie mich nicht noch einmal, bis sich Ihre Lage ändert. “

Zusammenfassend sollte eine 401 Unauthorized- Antwort für fehlende oder fehlerhafte Authentifizierung verwendet werden, und eine 403 Forbidden- Antwort sollte anschließend verwendet werden, wenn der Benutzer authentifiziert ist, aber nicht berechtigt ist, den angeforderten Vorgang für die angegebene Ressource auszuführen.

Ein weiteres schönes Bildformat, wie http-Statuscodes verwendet werden sollten.

Geben Sie hier die Bildbeschreibung ein


43
Die Standardnachricht für IIS 403 lautet "Dies ist ein generischer 403-Fehler und bedeutet, dass der authentifizierte Benutzer nicht zum Anzeigen der Seite berechtigt ist". Dies scheint zuzustimmen.
Ben Challenor

333
@JPReddy Deine Antwort ist richtig. Ich würde jedoch erwarten, dass 401 als "nicht authentifiziert" und 403 als "nicht autorisiert" bezeichnet wird. Es ist sehr verwirrend, dass 401, was mit Authentifizierung zu tun hat, das Format des Begleittextes "Nicht autorisiert" hat .... Es sei denn, ich kann nicht gut Englisch (was durchaus möglich ist).
p.matsinopoulos

64
@ZaidMasud, laut RFC ist diese Interpretation nicht korrekt. Cumbayahs Antwort hat es richtig gemacht. 401 bedeutet "Ihnen fehlt die richtige Berechtigung". Es bedeutet "wenn Sie möchten, können Sie versuchen, sich zu authentifizieren". Sowohl ein Client, der sich nicht korrekt authentifiziert hat, als auch ein ordnungsgemäß authentifizierter Client, dem die Autorisierung fehlt, erhalten eine 401. 403 bedeutet "Ich werde darauf nicht antworten, wer auch immer Sie sind". RFC stellt klar, dass "Autorisierung nicht helfen wird" im Fall von 403.
Davide R.

84
401 ist ein Authentifizierungsfehler, 403 ist ein Autorisierungsfehler. So einfach ist das.
Shahriyar Imanov

30
Sie haben beim Kopieren aus seinem Blog-Beitrag "Nun, das ist sowieso meine Meinung dazu :)" weggelassen und leider ist seine Ansicht falsch. Wie andere angegeben haben, bedeutet 403, dass Sie nicht auf die Ressource zugreifen können, unabhängig davon, als wen Sie authentifiziert sind. Normalerweise verwende ich diesen Statuscode für Ressourcen, die durch IP-Adressbereiche oder Dateien in meinem Webroot gesperrt sind, auf die ich keinen direkten Zugriff haben möchte (dh ein Skript muss sie bereitstellen).
Kyle

402

Siehe RFC2616 :

401 nicht Autorisiert:

Wenn die Anforderung bereits Berechtigungsnachweise enthielt, zeigt die Antwort 401 an, dass die Berechtigung für diese Anmeldeinformationen verweigert wurde.

403 Verboten:

Der Server hat die Anfrage verstanden, weigert sich jedoch, sie zu erfüllen.

Aktualisieren

Aus Ihrem Anwendungsfall geht hervor, dass der Benutzer nicht authentifiziert ist. Ich würde 401 zurückgeben.


Bearbeiten: RFC2616 ist veraltet, siehe RFC7231 und RFC7235 .


21
Danke, das hat mir geholfen, das zu klären. Ich verwende beides - das 401 für nicht authentifizierte Benutzer, das 403 für authentifizierte Benutzer mit unzureichenden Berechtigungen.
VirtuosiMedia

52
Ich habe nicht abgelehnt, aber ich finde diese Antwort ziemlich irreführend. 403 verboten ist angemessener für Inhalte, die niemals bereitgestellt werden (wie .config-Dateien in asp.net). Entweder das oder ein 404. Imho, es wäre nicht angebracht, 403 für etwas zurückzugeben, auf das zugegriffen werden kann, aber Sie hatten einfach nicht die richtigen Anmeldeinformationen. Meine Lösung wäre, eine Nachricht zu verweigern, die den Zugriff verweigert, um Anmeldeinformationen zu ändern. das oder ein 401.
Mel

27
"Die Antwort MUSS ein WWW-Authenticate-Headerfeld (Abschnitt 14.47) enthalten, das eine Herausforderung enthält, die für die angeforderte Ressource gilt." Es scheint, dass ein 401-Antwortcode nicht geeignet ist, wenn Sie keine HTTP-Authentifizierung verwenden möchten.
Brilliand

8
Ich werde Billiand hier unterstützen. Die Anweisung lautet "Wenn die Anforderung bereits Berechtigungsnachweise enthält". Dies bedeutet, wenn dies eine Antwort von einer Anforderung ist, die den Berechtigungsnachweis bereitgestellt hat (z. B. die Antwort von einem RFC2617-Authentifizierungsversuch). Es ist im Wesentlichen so, dass der Server sagen kann: "Ungültiges Konto / Passwort-Paar, versuchen Sie es erneut". In der gestellten Frage ist der Benutzer vermutlich authentifiziert, aber nicht autorisiert. 401 ist niemals die angemessene Antwort für diese Umstände.
ldrut

6
Brilliand hat recht, 401 ist nur für die HTTP-Authentifizierung geeignet.
Juampi

296

Die anderen Antworten fehlen, dass verstanden werden muss, dass sich Authentifizierung und Autorisierung im Kontext von RFC 2616 NUR auf das HTTP-Authentifizierungsprotokoll von RFC 2617 bezieht. Die Authentifizierung durch Schemata außerhalb von RFC2617 wird in HTTP-Statuscodes nicht unterstützt und nicht berücksichtigt bei der Entscheidung, ob 401 oder 403 verwendet werden soll.

Kurz und knapp

Nicht autorisiert zeigt an, dass der Client nicht RFC2617-authentifiziert ist und der Server den Authentifizierungsprozess initiiert. Verboten gibt an, dass der Client entweder RFC2617-authentifiziert und nicht autorisiert ist oder dass der Server RFC2617 für die angeforderte Ressource nicht unterstützt.

Das heißt, wenn Sie einen eigenen Anmeldevorgang haben und niemals die HTTP-Authentifizierung verwenden, ist 403 immer die richtige Antwort und 401 sollte niemals verwendet werden.

Detailliert und ausführlich

Von RFC2616

10.4.2 401 Nicht autorisiert

Die Anforderung erfordert eine Benutzerauthentifizierung. Die Antwort MUSS ein WWW-Authenticate-Headerfeld (Abschnitt 14.47) enthalten, das eine für die angeforderte Ressource geltende Herausforderung enthält. Der Client kann die Anforderung mit einem geeigneten Feld für den Autorisierungsheader wiederholen (Abschnitt 14.8).

und

10.4.4 403 Verboten Der Server hat die Anfrage verstanden, weigert sich jedoch, sie zu erfüllen. Die Autorisierung hilft nicht und die Anfrage sollte nicht wiederholt werden.

Beachten Sie zunächst, dass sich "Authentifizierung" und "Autorisierung" im Kontext dieses Dokuments speziell auf die HTTP-Authentifizierungsprotokolle von RFC 2617 beziehen. Sie beziehen sich nicht auf von Ihnen erstellte Roll-Your-Own-Authentifizierungsprotokolle Verwenden von Anmeldeseiten usw. Ich werde "Anmelden" verwenden, um auf die Authentifizierung und Autorisierung durch andere Methoden als RFC2617 zu verweisen

Der wirkliche Unterschied besteht also nicht darin, was das Problem ist oder ob es eine Lösung gibt. Der Unterschied besteht darin, was der Server vom Client als Nächstes erwartet.

401 gibt an, dass die Ressource nicht bereitgestellt werden kann, der Server jedoch anfordert, dass sich der Client über die HTTP-Authentifizierung anmeldet und Antwortheader gesendet hat, um den Prozess zu starten. Möglicherweise gibt es Berechtigungen, die den Zugriff auf die Ressource ermöglichen, möglicherweise nicht, aber versuchen wir es mal und sehen, was passiert.

403 gibt an, dass die Ressource nicht bereitgestellt werden kann und es für den aktuellen Benutzer keine Möglichkeit gibt, dies durch RFC2617 zu lösen, und es macht keinen Sinn, es zu versuchen. Dies kann daran liegen, dass bekanntermaßen keine Authentifizierungsstufe ausreicht (z. B. aufgrund einer IP-Blacklist), aber möglicherweise daran, dass der Benutzer bereits authentifiziert ist und keine Berechtigung besitzt. Das RFC2617-Modell besteht aus einem Benutzer und einem Berechtigungsnachweis, sodass der Fall, in dem der Benutzer möglicherweise über einen zweiten Satz von Berechtigungsnachweisen verfügt, die autorisiert werden könnten, möglicherweise ignoriert wird. Es wird weder vorgeschlagen noch impliziert, dass eine Anmeldeseite oder ein anderes Nicht-RFC2617-Authentifizierungsprotokoll hilfreich sein kann oder nicht - das liegt außerhalb der RFC2616-Standards und -Definitionen.


Bearbeiten: RFC2616 ist veraltet, siehe RFC7231 und RFC7235 .


7
Was sollen wir also tun, wenn der Benutzer eine Seite anfordert, für die keine HTTP-Authentifizierung erforderlich ist? Statuscode 403 senden?
Marcovtwout

2
Dies ist die Antwort, die meine Fragen zur Unterscheidung beantwortet hat.
Patrick

9
Dies ist wichtig: "Wenn Sie einen eigenen Anmeldevorgang haben und niemals die HTTP-Authentifizierung verwenden, ist 403 immer die richtige Antwort und 401 sollte niemals verwendet werden."
ggg

1
@marcovtwout Senden Sie eine 302 an Ihre Anmeldeseite oder eine 403 mit einem Textkörper mit Informationen zum Anmelden?
Alex

4
Bietet RFC7235 nicht "Roll-Your-Own" - oder alternative Authentifizierungsherausforderungen? Warum kann der Anmeldefluss meiner App die Herausforderung nicht in Form eines WWW-AuthenticateHeaders darstellen? Selbst wenn ein Browser dies nicht unterstützt, kann meine React-App ...
jchook

127
  + -----------------------
  | RESSOURCEN BESTEHEN? (wenn privat, wird es oft NACH der Authentifizierungsprüfung überprüft)
  + -----------------------
    | |
 NEIN | v JA
    v + -----------------------
   404 | IST ANGEMELDET? (authentifiziert, auch bekannt als Session oder JWT-Cookie)
   oder + -----------------------
   401 | |
   403 NEIN | | JA
   3xx vv
              401 + -----------------------
       (404 keine Enthüllung) | KANN AUF RESSOURCEN ZUGREIFEN? (Erlaubnis, autorisiert, ...)
              oder + -----------------------
             umleiten | |
             um sich anzumelden NEIN | | JA
                               | |
                               vv
                               403 OK 200, umleiten, ...
                      (oder 404: keine Enthüllung)
                      (oder 404: Ressource existiert nicht, wenn privat)
                      (oder 3xx: Umleitung)

Überprüfungen werden normalerweise in dieser Reihenfolge durchgeführt:

  • 404 wenn die Ressource öffentlich ist und nicht existiert oder 3xx Umleitung
  • ANDERNFALLS:
  • 401, wenn nicht angemeldet oder Sitzung abgelaufen ist
  • 403 wenn der Benutzer keine Berechtigung zum Zugriff auf Ressourcen hat (Datei, JSON, ...)
  • 404 wenn keine Ressource vorhanden ist oder nicht bereit ist, etwas preiszugeben, oder 3xx Umleitung

UNAUTHORIZED : Statuscode (401), der angibt, dass für die Anforderung eine Authentifizierung erforderlich ist. Dies bedeutet normalerweise , dass der Benutzer angemeldet sein muss (Sitzung). Benutzer / Agent vom Server unbekannt. Kann mit anderen Anmeldeinformationen wiederholen. HINWEIS: Dies ist verwirrend, da dies als "nicht authentifiziert" anstelle von "nicht autorisiert" hätte bezeichnet werden sollen. Dies kann auch nach der Anmeldung geschehen, wenn die Sitzung abgelaufen ist. Sonderfall: Kann anstelle von 404 verwendet werden, um zu vermeiden, dass Ressourcen vorhanden oder nicht vorhanden sind (Credits @gingerCodeNinja).

VERBOTEN : Statuscode (403), der angibt, dass der Server die Anforderung verstanden hat, sich jedoch geweigert hat, sie zu erfüllen. Benutzer / Agent, der dem Server bekannt ist, aber nicht über ausreichende Anmeldeinformationen verfügt . Das Wiederholen der Anforderung funktioniert nur, wenn die Anmeldeinformationen geändert werden, was in kurzer Zeit sehr unwahrscheinlich ist. Sonderfall: Kann anstelle von 404 verwendet werden, um zu vermeiden, dass Ressourcen vorhanden oder nicht vorhanden sind (Credits @gingerCodeNinja).

NICHT GEFUNDEN : Statuscode (404) zeigt an, dass die angeforderte Ressource nicht verfügbar ist. Benutzer / Agent bekannt, aber Server gibt nichts über die Ressource preis, tut so, als ob sie nicht existiert. Wiederholen funktioniert nicht. Dies ist eine spezielle Verwendung von 404 (Github macht es zum Beispiel).

Wie von @ChrisH erwähnt, gibt es einige Optionen für die 3xx- Umleitung (301, 302, 303, 307 oder gar keine Umleitung und Verwendung eines 401):


Ich habe mich beispielsweise angemeldet und kann auf eine Seite zugreifen, für die jedoch keine Berechtigung aktiviert ist. Welcher Statuscode wird zurückgegeben?
Bartelom

@bookmarker Die Anmeldung wird als Authentifizierung bezeichnet. Dies ist der erste Schritt. Wenn Sie nach dem Anmelden keine Berechtigung haben, erhalten Sie 403 Verboten (unzureichende Anmeldeinformationen bedeuten, dass Sie nicht über ausreichende Berechtigungen verfügen).
Christophe Roussy

3
Klare und einfache Erklärung. Nur was ich brauche.
Estevez

Wenn der Benutzer nicht angemeldet oder angemeldet ist, aber keine Berechtigung hat und der Inhalt nicht vor Ort vorhanden ist, möchten Sie manchmal wahrscheinlich 401/403 anstelle von 404 zurückgeben, damit Sie nicht offenlegen, was ist oder nicht Nicht vorhanden, wenn der Benutzer nicht authentifiziert und angemeldet ist. Nur zu wissen, dass etwas vorhanden ist, kann auf etwas hinweisen oder die NDA beschädigen. Daher sollte der 404-Teil dieses Diagramms manchmal unter Angemeldet / Authentifiziert verschoben werden.
GingerCodeNinja

1
@MattKocaj Beachten Sie, dass der no revealFall manchmal über subtile Zeitunterschiede erkannt werden kann und nicht als Sicherheitsmerkmal angesehen werden sollte. Es kann nur Angreifer verlangsamen oder ein wenig zum Schutz der Privatsphäre beitragen.
Christophe Roussy

113

Gemäß RFC 2616 (HTTP / 1.1) wird 403 gesendet, wenn:

Der Server hat die Anfrage verstanden, weigert sich jedoch, sie zu erfüllen. Die Autorisierung hilft nicht und die Anfrage sollte nicht wiederholt werden. Wenn die Anforderungsmethode nicht HEAD war und der Server veröffentlichen möchte, warum die Anforderung nicht erfüllt wurde, sollte der Grund für die Ablehnung in der Entität beschrieben werden. Wenn der Server diese Informationen dem Client nicht zur Verfügung stellen möchte, kann stattdessen der Statuscode 404 (Nicht gefunden) verwendet werden

Mit anderen Worten, wenn der Client durch Authentifizierung Zugriff auf die Ressource erhalten kann, sollte 401 gesendet werden.


5
Und wenn nicht klar ist, ob sie darauf zugreifen können oder nicht? Angenommen, ich habe 3 Benutzerebenen - Öffentlich, Mitglieder und Premium-Mitglieder. Angenommen, die Seite ist nur für Premium-Mitglieder. Ein öffentlicher Benutzer ist grundsätzlich nicht authentifiziert und kann sich bei der Anmeldung entweder in Mitgliedern oder Premium-Mitgliedern befinden. Für die Benutzerebene eines Mitglieds erscheint ein 403 angemessen. Für Premium-Mitglieder der 401. Was dienen Sie jedoch der Öffentlichkeit?
VirtuosiMedia

27
Imho, das ist die genaueste Antwort. Dies hängt von der Anwendung ab. Wenn ein authentifizierter Benutzer jedoch nicht über ausreichende Rechte für eine Ressource verfügt, möchten Sie möglicherweise eine Möglichkeit zum Ändern von Anmeldeinformationen oder zum Senden eines 401 bereitstellen. Ich denke, 403 eignet sich am besten für Inhalte, die niemals bereitgestellt werden. In asp.net würde dies web.config-Dateien * .resx-Dateien usw. bedeuten, da diese Dateien unabhängig davon, welcher Benutzer sich anmeldet, NIEMALS bereitgestellt werden, sodass es keinen Sinn macht, es erneut zu versuchen.
Mel

6
+1, aber eine ungewisse +1. Die logische Schlussfolgerung ist, dass ein 403 niemals zurückgegeben werden sollte, da entweder 401 oder 404 eine streng bessere Antwort wäre.
CurtainDog

12
@ Mel Ich denke, eine Datei, auf die der Client nicht zugreifen sollte, sollte eine 404 sein. Es handelt sich um eine systeminterne Datei. Das Äußere sollte nicht einmal wissen, dass es existiert. Wenn Sie einen 403 zurückgeben, teilen Sie dem Client mit, dass er existiert, und müssen diese Informationen nicht an Hacker weitergeben. Die Spezifikation für 403 sagtAn origin server that wishes to "hide" the current existence of a forbidden target resource MAY instead respond with a status code of 404 (Not Found).
Juan Mendes

3
Dies scheint mir wahrscheinlich eine genaue Interpretation des alten RFC 2616 zu sein. Beachten Sie jedoch, dass RFC 7231 die Semantik eines 403 anders definiert und ausdrücklich angibt, dass "der Client die Anforderung möglicherweise mit neuen oder anderen Anmeldeinformationen wiederholen kann". Obwohl diese Antwort im Jahr 2010 richtig war, ist sie heute völlig falsch, da die Bedeutung des Statuscodes unter unseren Füßen neu geschrieben wurde. (Ärgerlicherweise wird der Änderungsantrag im Anhang von RFC 2616 nicht anerkannt!)
Mark Amery

46

Angenommen, die HTTP-Authentifizierung ( WWW-Authentifizierungs- und Autorisierungsheader ) wird verwendet . Wenn die Authentifizierung als ein anderer Benutzer Zugriff auf die angeforderte Ressource gewähren würde, sollte 401 Unauthorized zurückgegeben werden.

403 Verboten wird verwendet, wenn der Zugriff auf die Ressource für alle Personen verboten oder auf ein bestimmtes Netzwerk beschränkt oder nur über SSL zulässig ist, sofern dies nicht mit der HTTP-Authentifizierung zusammenhängt.

Wenn die HTTP-Authentifizierung nicht verwendet wird und der Dienst ein Cookie-basiertes Authentifizierungsschema ist, wie es heutzutage üblich ist, sollte ein 403 oder ein 404 zurückgegeben werden.

In Bezug auf 401 stammt dies aus RFC 7235 (Hypertext Transfer Protocol (HTTP / 1.1): Authentifizierung):

3.1. 401 nicht Autorisiert

Der Statuscode 401 (nicht autorisiert) gibt an, dass die Anforderung nicht angewendet wurde, da keine gültigen Authentifizierungsdaten für die Zielressource vorhanden sind. Der Ursprungsserver MUSS ein WWW-Authenticate-Headerfeld (Abschnitt 4.4) senden, das mindestens eine für die Zielressource geltende Herausforderung enthält. Wenn die Anforderung Authentifizierungsdaten enthielt, zeigt die 401-Antwort an, dass die Autorisierung für diese Anmeldeinformationen verweigert wurde. Der Client kann die Anforderung mit einem neuen oder ersetzten Autorisierungsheaderfeld wiederholen (Abschnitt 4.1). Wenn die 401-Antwort dieselbe Herausforderung wie die vorherige Antwort enthält und der Benutzeragent bereits mindestens einmal versucht hat, sich zu authentifizieren, MUSS der Benutzeragent dem Benutzer die beigefügte Darstellung präsentieren, da sie normalerweise relevante Diagnoseinformationen enthält.

Die Semantik von 403 (und 404) hat sich im Laufe der Zeit geändert. Dies ist von 1999 (RFC 2616):

10.4.4 403 Verboten

Der Server hat die Anfrage verstanden, weigert sich jedoch, sie zu erfüllen.
Die Autorisierung hilft nicht und die Anfrage sollte nicht wiederholt werden.
Wenn die Anforderungsmethode nicht HEAD war und der Server veröffentlichen möchte,
warum die Anforderung nicht erfüllt wurde, sollte der Grund für die Ablehnung in der Entität beschrieben werden. Wenn der Server diese Informationen dem Client nicht zur Verfügung stellen möchte,
kann stattdessen der Statuscode 404 (Nicht gefunden) verwendet werden.

Im Jahr 2014 änderte RFC 7231 (Hypertext Transfer Protocol (HTTP / 1.1): Semantik und Inhalt) die Bedeutung von 403:

6.5.3. 403 Verboten

Der Statuscode 403 (Verboten) zeigt an, dass der Server die Anforderung verstanden hat, sich jedoch weigert, sie zu autorisieren. Ein Server, der veröffentlichen möchte, warum die Anforderung verboten wurde, kann diesen Grund in der Antwortnutzlast (falls vorhanden) beschreiben.

Wenn in der Anforderung Authentifizierungsdaten angegeben wurden, hält der
Server diese für unzureichend, um den Zugriff zu gewähren. Der Client sollte
die Anforderung NICHT automatisch mit denselben
Anmeldeinformationen wiederholen . Der Client kann die Anforderung mit neuen oder anderen Anmeldeinformationen wiederholen. Eine Anfrage kann jedoch aus Gründen verboten sein, die
nicht mit den Anmeldeinformationen zusammenhängen.

Ein Ursprungsserver, der die aktuelle Existenz einer
verbotenen Zielressource "verbergen" möchte, KANN stattdessen mit dem Statuscode
404 (Nicht gefunden) antworten .

Somit könnte ein 403 (oder ein 404) jetzt über alles bedeuten. Das Bereitstellen neuer Anmeldeinformationen kann hilfreich sein ... oder auch nicht.

Ich glaube, der Grund, warum sich dies geändert hat, ist die Annahme von RFC 2616, dass die HTTP-Authentifizierung verwendet wird, wenn in der Praxis heutige Web-Apps benutzerdefinierte Authentifizierungsschemata erstellen, die beispielsweise Formulare und Cookies verwenden.


2
Das ist interessant. Basierend auf RFC 7231 und RFC 7235 sehe ich keinen offensichtlichen Unterschied zwischen 401 und 403
Brian

2
403 bedeutet "Ich kenne dich, aber du kannst diese Ressource nicht sehen." Es gibt keinen Grund zur Verwirrung.
Michael Blackburn

"Wenn die Anforderung Authentifizierungsdaten enthielt, zeigt die Antwort 401 an, dass die Autorisierung für diese Anmeldeinformationen verweigert wurde. Der Client kann die Anforderung mit einem neuen oder ersetzten Feld für den Autorisierungsheader wiederholen (Abschnitt 4.1)." Dann jedoch "4.2. Das Headerfeld" Autorisierung "ermöglicht es einem Benutzeragenten, sich bei einem Ursprungsserver zu authentifizieren". In RFC7235 wird der Begriff "Autorisierung" wie "Authentifizierung" verwendet. In diesem Fall könnte es scheinen, dass ein authentifizierter, aber nicht autorisierter Benutzer keine 401, sondern 403
arcuri82

28

Dies ist eine ältere Frage, aber eine Option, die nie wirklich angesprochen wurde, war die Rückgabe eines 404. Aus Sicherheitsgründen leidet die Antwort mit der höchsten Bewertung an einer potenziellen Sicherheitslücke in Bezug auf Informationslecks . Angenommen, die betreffende sichere Webseite ist eine Systemadministrationsseite oder häufiger ein Datensatz in einem System, auf den der Benutzer keinen Zugriff hat. Idealerweise möchten Sie nicht, dass ein böswilliger Benutzer überhaupt weiß, dass sich dort eine Seite / ein Datensatz befindet, geschweige denn, dass er keinen Zugriff hat. Wenn ich so etwas erstelle, werde ich versuchen, nicht authentifizierte / nicht autorisierte Anforderungen in einem internen Protokoll aufzuzeichnen, aber einen 404 zurückgeben.

OWASP bietet weitere Informationen darüber, wie ein Angreifer diese Art von Informationen als Teil eines Angriffs verwenden kann.


3
Die Verwendung eines 404 wurde in früheren Antworten erwähnt. Sie sind auf dem neuesten Stand bezüglich: Informationslecks und dies sollte eine wichtige Überlegung für jeden sein, der sein eigenes Authentifizierungs- / Autorisierungsschema entwickelt. +1 für die Erwähnung von OWASP.
Dave Watts

Ironischerweise führt der OWASP-Link jetzt zu einer 404-Seite. Ich habe etwas Ähnliches (glaube ich) auf owasp.org/index.php/… gefunden
anned20

Vielen Dank für das Heads-up, ich habe es aktualisiert!
Patrick White

Hängt von der API ab und davon, wie der Zugriff gewährt wird. Aber "undicht" ist kein Problem, wenn es 401 für Benutzername / Passwort zurückgibt, ist es sicher dasselbe wie für ein Webformular?
James

26
  • 401 Nicht autorisiert : Ich weiß nicht, wer Sie sind. Dies ist ein Authentifizierungsfehler.
  • 403 Verboten : Ich weiß, wer Sie sind, aber Sie haben keine Berechtigung, auf diese Ressource zuzugreifen. Dies ist ein Autorisierungsfehler.

Ich bin mir nicht sicher, ob dies "immer" bedeutet, dass der Absender unbekannt war. Was auch immer sie verlangten, wurde nicht autorisiert.
James

22

Diese Frage wurde vor einiger Zeit gestellt, aber das Denken der Menschen geht weiter.

Abschnitt 6.5.3 in diesem Entwurf (verfasst von Fielding und Reschke) gibt dem Statuscode 403 eine etwas andere Bedeutung als dem in RFC 2616 dokumentierten .

Es spiegelt wider, was in Authentifizierungs- und Autorisierungsschemata geschieht, die von einer Reihe gängiger Webserver und Frameworks verwendet werden.

Ich habe das hervorgehoben, was ich für am auffälligsten halte.

6.5.3. 403 Verboten

Der Statuscode 403 (Verboten) zeigt an, dass der Server die Anforderung verstanden hat, sich jedoch weigert, sie zu autorisieren. Ein Server, der veröffentlichen möchte, warum die Anforderung verboten wurde, kann diesen Grund in der Antwortnutzlast (falls vorhanden) beschreiben.

Wenn in der Anforderung Authentifizierungsdaten angegeben wurden, hält der Server diese für unzureichend, um den Zugriff zu gewähren. Der Client DARF die Anforderung NICHT mit denselben Anmeldeinformationen wiederholen. Der Client kann die Anforderung mit neuen oder anderen Anmeldeinformationen wiederholen. Eine Anfrage kann jedoch aus Gründen verboten sein, die nicht mit den Anmeldeinformationen zusammenhängen.

Ein Ursprungsserver, der die aktuelle Existenz einer verbotenen Zielressource "verbergen" möchte, KANN stattdessen mit dem Statuscode 404 (Nicht gefunden) antworten.

Unabhängig von der verwendeten Konvention ist es wichtig, die Einheitlichkeit Ihrer Site / API zu gewährleisten.


2
Der Entwurf wurde genehmigt und ist jetzt RFC 7231.
Vebjorn Ljosa

13

TL; DR

  • 401: Eine Ablehnung, die mit Authentifizierung zu tun hat
  • 403: Eine Ablehnung, die NICHTS mit Authentifizierung zu tun hat

Praktische Beispiele

Wenn Apache eine Authentifizierung (via .htaccess) erfordert und Sie drücken Cancel, antwortet er mit einem401 Authorization Required

Wenn nginx eine Datei findet, aber keine Zugriffsrechte (Benutzer / Gruppe) zum Lesen / Zugreifen darauf hat, antwortet es mit403 Forbidden

RFC (2616 Abschnitt 10)

401 Nicht autorisiert (10.4.2)

Bedeutung 1: Authentifizierung erforderlich

Die Anforderung erfordert eine Benutzerauthentifizierung. ...

Bedeutung 2: Authentifizierung unzureichend

... Wenn die Anforderung bereits Berechtigungsnachweise enthielt, zeigt die Antwort 401 an, dass die Berechtigung für diese Anmeldeinformationen verweigert wurde. ...

403 Verboten (10.4.4)

Bedeutung: Nicht mit der Authentifizierung verbunden

... Autorisierung hilft nicht ...

Mehr Details:

  • Der Server hat die Anfrage verstanden, weigert sich jedoch, sie zu erfüllen.

  • Es sollte den Grund für die Ablehnung im Unternehmen beschreiben

  • Stattdessen kann der Statuscode 404 (Nicht gefunden) verwendet werden

    (Wenn der Server diese Informationen vom Client fernhalten möchte)


11

Sie sind nicht angemeldet oder gehören nicht zur richtigen Benutzergruppe

Sie haben zwei verschiedene Fälle angegeben; Jeder Fall sollte eine andere Antwort haben:

  1. Wenn sie überhaupt nicht angemeldet sind, sollten Sie 401 Unauthorized zurückgeben
  2. Wenn sie angemeldet sind, aber nicht zur richtigen Benutzergruppe gehören, sollten Sie 403 Forbidden zurückgeben

Hinweis zum RFC basierend auf Kommentaren zu dieser Antwort:

Wenn der Benutzer nicht angemeldet ist, ist er nicht authentifiziert. Das HTTP-Äquivalent lautet 401 und wird im RFC irreführend als Nicht autorisiert bezeichnet. In Abschnitt 10.4.2 heißt es für 401 Unauthorized :

„Die Anforderung erfordert Benutzerauthentifizierung .“

Wenn Sie nicht authentifiziert sind, ist 401 die richtige Antwort. Wenn Sie jedoch nicht autorisiert sind, ist 403 im semantisch korrekten Sinne die richtige Antwort.


5
Das ist nicht richtig. Siehe RFC und die Antwort von @ Cumbayah.
Davide R.

7
@ DavidR. Der RFC verwendet Authentifizierung und Autorisierung austauschbar. Ich glaube, es ist sinnvoller, wenn man mit der Authentifizierungsbedeutung liest .
Zaid Masud

Diese Antwort ist umgekehrt. Nicht autorisiert ist nicht dasselbe wie Nicht authentifiziert. @ DavidR ist richtig. Authentifizierung und Autorisierung sind NICHT austauschbar
BozoJoe

2
2616 sollte verbrannt werden. Bei einigen neueren RFCs ist viel klarer, dass zwischen "Ich kenne dich nicht" und "Ich kenne dich, aber du kannst nicht darauf zugreifen" unterschieden werden muss. Es gibt keinen legitimen Grund, die Existenz einer Ressource anzuerkennen, die niemals erfüllt wird (oder nicht über http erfüllt wird), was die 403-Wahrmacher vorschlagen.
Michael Blackburn

6

Dies sind die Bedeutungen:

401 : Benutzer nicht (korrekt) authentifiziert, die Ressource / Seite muss authentifiziert werden

403 : Benutzer authentifiziert, aber seine Rolle oder Berechtigungen erlauben keinen Zugriff auf die angeforderte Ressource. Beispielsweise ist der Benutzer kein Administrator und die angeforderte Seite ist für Administratoren


Dies ist eine großartige TLDR-Antwort auf diese Frage.
Kousha

5

Das ist in meinem Kopf einfacher als irgendwo hier, also:

401: Sie benötigen eine HTTP-Basisauthentifizierung, um dies zu sehen.

403: Sie können dies nicht sehen, und die HTTP-Basisauthentifizierung hilft nicht weiter.

Wenn sich der Benutzer nur mit dem Standard-HTML-Anmeldeformular Ihrer Site anmelden muss, ist 401 nicht geeignet, da es spezifisch für die HTTP-Basisauthentifizierung ist.

Ich empfehle nicht, 403 zu verwenden, um den Zugriff auf Dinge wie zu verweigern /includes, da diese Ressourcen im Web überhaupt nicht vorhanden sind und daher 404 sein sollten.

Damit bleibt 403 als "Sie müssen angemeldet sein".

Mit anderen Worten bedeutet 403 "diese Ressource erfordert eine andere Form der Authentifizierung als die HTTP-Basisauthentifizierung".

https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2


5

Ich denke, es ist wichtig zu berücksichtigen, dass 401 für einen Browser einen Authentifizierungsdialog initiiert, in dem der Benutzer neue Anmeldeinformationen eingeben kann, während 403 dies nicht tut. Browser sind der Meinung, dass der Benutzer sich erneut authentifizieren sollte, wenn ein 401 zurückgegeben wird. 401 steht also für ungültige Authentifizierung, während 403 für mangelnde Berechtigung steht.

Hier sind einige Fälle unter dieser Logik, in denen ein Fehler von der Authentifizierung oder Autorisierung zurückgegeben wird, wobei wichtige Sätze fett gedruckt sind.

  • Eine Ressource erfordert eine Authentifizierung, es wurden jedoch keine Anmeldeinformationen angegeben .

401 : Der Client sollte Anmeldeinformationen angeben.

  • Die angegebenen Anmeldeinformationen haben ein ungültiges Format .

400 : Das ist weder 401 noch 403, da Syntaxfehler immer 400 zurückgeben sollten.

  • Die angegebenen Anmeldeinformationen verweisen auf einen Benutzer, der nicht vorhanden ist .

401 : Der Client sollte gültige Anmeldeinformationen angeben.

  • Die angegebenen Anmeldeinformationen sind ungültig , geben jedoch einen gültigen Benutzer an (oder geben Sie keinen Benutzer an, wenn ein angegebener Benutzer nicht erforderlich ist).

401 : Auch hier sollte der Client gültige Anmeldeinformationen angeben.

  • Die angegebenen Anmeldeinformationen sind abgelaufen .

401 : Dies entspricht praktisch den ungültigen Anmeldeinformationen im Allgemeinen. Daher sollte der Client gültige Anmeldeinformationen angeben.

  • Die angegebenen Anmeldeinformationen sind vollständig gültig , aber nicht ausreichen , die bestimmte Ressource , obwohl es möglich ist , dass die Anmeldeinformationen mit mehr Berechtigung könnten.

403 : Durch die Angabe gültiger Anmeldeinformationen wird kein Zugriff auf die Ressource gewährt, da die aktuellen Anmeldeinformationen bereits gültig sind, jedoch nur keine Berechtigung haben.

  • Die besondere Ressource ist nicht zugänglich , unabhängig von Anmeldeinformationen.

403 : Dies ist unabhängig von den Anmeldeinformationen. Die Angabe gültiger Anmeldeinformationen kann daher nicht helfen.

  • Die angegebenen Anmeldeinformationen sind vollständig gültig , aber der jeweilige Kunde ist blockiert durch deren Nutzung.

403 : Wenn der Client blockiert ist, führt die Angabe neuer Anmeldeinformationen zu nichts.


4

Auf Englisch:

401

Möglicherweise ist Ihnen der Zugriff gestattet, aber aus irgendeinem Grund wurde Ihnen auf diese Anfrage hin der Zugriff verweigert. Wie ein schlechtes Passwort? Versuchen Sie es erneut. Mit der richtigen Anfrage erhalten Sie stattdessen eine erfolgreiche Antwort.

403

Du darfst niemals. Ihr Name ist nicht auf der Liste, Sie werden nie hineinkommen, weggehen, keine Wiederholungsanfrage senden, es wird immer abgelehnt. Geh weg.


1

Angesichts der neuesten RFCs zu diesem Thema ( 7231 und 7235 ) scheint der Anwendungsfall ziemlich klar zu sein (Kursivschrift hinzugefügt):

  • 401 ist für nicht authentifiziert ("keine gültige Authentifizierung"); dh "Ich weiß nicht, wer du bist, oder ich vertraue nicht, dass du bist, wer du sagst, dass du bist."

401 nicht Autorisiert

Der Statuscode 401 (nicht autorisiert) gibt an, dass die Anforderung nicht angewendet wurde, da keine gültigen Authentifizierungsdaten für die Zielressource vorhanden sind. Der Server, der eine 401-Antwort generiert, MUSS ein WWW-Authenticate-Headerfeld (Abschnitt 4.1) senden, das mindestens eine für die Zielressource geltende Herausforderung enthält.

Wenn die Anforderung Authentifizierungsdaten enthielt, zeigt die Antwort 401 an, dass die Autorisierung für diese Anmeldeinformationen verweigert wurde. Der Benutzeragent KANN die Anforderung mit einem neuen oder ersetzten Autorisierungsheaderfeld wiederholen (Abschnitt 4.2). Wenn die 401-Antwort dieselbe Herausforderung wie die vorherige Antwort enthält und der Benutzeragent bereits mindestens einmal versucht hat, sich zu authentifizieren, MUSS der Benutzeragent dem Benutzer die beigefügte Darstellung präsentieren, da sie normalerweise relevante Diagnoseinformationen enthält.

  • 403 ist für nicht autorisierte Personen ("verweigert die Autorisierung"); dh "Ich weiß, wer Sie sind, aber Sie haben keine Berechtigung, auf diese Ressource zuzugreifen."

403 Verboten

Der Statuscode 403 (Verboten) zeigt an, dass der Server die Anforderung verstanden hat, sich jedoch weigert, sie zu autorisieren . Ein Server, der veröffentlichen möchte, warum die Anforderung verboten wurde, kann diesen Grund in der Antwortnutzlast (falls vorhanden) beschreiben.

Wenn in der Anforderung Authentifizierungsdaten angegeben wurden, hält der Server diese für unzureichend, um den Zugriff zu gewähren. Der Client sollte die Anforderung NICHT automatisch mit denselben Anmeldeinformationen wiederholen. Der Client kann die Anforderung mit neuen oder anderen Anmeldeinformationen wiederholen. Eine Anfrage kann jedoch aus Gründen verboten sein, die nicht mit den Anmeldeinformationen zusammenhängen.

Ein Ursprungsserver, der die aktuelle Existenz einer verbotenen Zielressource "verbergen" möchte, KANN stattdessen mit dem Statuscode 404 (Nicht gefunden) antworten.


2
-1; Diese Passagen wurden bereits in anderen Antworten hier zitiert, und Ihre fügt nichts Neues hinzu. Ich würde argumentieren, dass es offensichtlich nicht klar ist, was der Unterschied ist; Sie fassen die beiden Codes als "keine gültige Authentifizierung" und "verweigert die Autorisierung" zusammen, aber ich kann mir keine Situation vorstellen, in der eine dieser Kurzbeschreibungen zutreffen würde, wenn die andere nicht so interpretiert werden könnte, dass sie ebenfalls gilt.
Mark Amery

Hier gibt es viele Antworten, die viele RFCs abdecken und bearbeitet und aktualisiert werden, um das Wasser zu trüben. Ich habe einen Link eingefügt, um zu erklären, was authenticatedist und was authorizedist, und alle veralteten RFCs weggelassen, damit die Anwendung klar ist.
CJBarth

Ihre Bearbeitung verdeutlicht Ihre Interpretation der beiden Codes, was mit der Interpretation vieler anderer Personen übereinzustimmen scheint. Ich persönlich glaube jedoch, dass Interpretation wenig Sinn macht. Die Verwendung des Ausdrucks " Wenn Authentifizierungsdaten angegeben wurden" in der Beschreibung von 403 impliziert, dass ein 403 auch dann geeignet sein kann, wenn keine Anmeldeinformationen angegeben wurden - dh der Fall "nicht authentifiziert". In der Zwischenzeit ist für mich die natürlichste Interpretation des Ausdrucks "für die Zielressource" in der 401-Beschreibung, dass ein 401 für einen Benutzer verwendet werden kann, der authentifiziert, aber nicht autorisiert ist.
Mark Amery

-6

Im Fall von 401 vs 403 wurde dies viele Male beantwortet. Dies ist im Wesentlichen eine Debatte über die HTTP-Anforderungsumgebung und keine Debatte über die Anwendung.

Es scheint eine Frage zum Problem des Roll-Your-Own-Login (Anwendung) zu geben.

In diesem Fall reicht es nicht aus, einfach nicht angemeldet zu sein, um eine 401 oder eine 403 zu senden, es sei denn, Sie verwenden HTTP Auth gegen eine Anmeldeseite (nicht an die Einstellung von HTTP Auth gebunden). Es hört sich so an, als würden Sie nach einem "201 Created" suchen, bei dem (anstelle der angeforderten Ressource) ein Roll-Your-Own-Login-Bildschirm für den Zugriff auf eine Datei auf Anwendungsebene vorhanden ist. Dies sagt:

"Ich habe dich gehört, es ist hier, aber versuche es stattdessen (du darfst es nicht sehen)"


Was genau wird erstellt?
Grant Gryczan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.