403 Proibite vs 401 risposte HTTP non autorizzate


2785

Per una pagina Web esistente, ma per la quale un utente non dispone di privilegi sufficienti (non ha effettuato l'accesso o non appartiene al gruppo utenti appropriato), qual è la risposta HTTP corretta da offrire?

401 Unauthorized?
403 Forbidden?
Qualcos'altro?

Quello che ho letto su ciascuno finora non è molto chiaro sulla differenza tra i due. Quali casi d'uso sono appropriati per ogni risposta?


358
401 "Non autorizzato" dovrebbe essere 401 "Non autenticato", problema risolto!
Christophe Roussy,

47
Non ricordo quante volte io e i miei colleghi siamo tornati su StackOverflow per questa domanda. Forse gli standard HTTP dovrebbero considerare la modifica dei nomi o delle descrizioni per 401 e 403.
neurite

In effetti, sto ricevendo una versione diversa di questo errore. come "os_authType era 'any' e veniva inviato un cookie non valido". Quindi incapace di capire come risolverlo. Ho cercato su Google un sacco di tempo, ho avuto ragioni ma non ho trovato una soluzione.
Sandeep Anand,

@Qwerty no, il nuovo RFC7231 oscura RFC2616. 403 ha un significato diverso ora.
lisca di pesce

1
@fishbone non hai notato che il codice di stato 401 è stato rimosso da quel RFC: D
Barkermn01

Risposte:


4115

Una chiara spiegazione di Daniel Irvine :

Si è verificato un problema con 401 non autorizzato , il codice di stato HTTP per errori di autenticazione. E questo è tutto: è per autenticazione, non autorizzazione. Ricezione di una risposta 401 è il server che ti dice "non sei autenticato, o non sei autenticato o autenticato in modo errato, ma ti preghiamo di riautenticare e riprovare." Per aiutarti, includerà sempre un'intestazione WWW-Authenticate che descrive come eseguire l'autenticazione.

Questa è una risposta generalmente restituita dal tuo server web, non dalla tua applicazione web.

È anche qualcosa di molto temporaneo; il server ti sta chiedendo di riprovare.

Quindi, per l'autorizzazione, utilizzo la risposta proibita 403 . È permanente, è legato alla mia logica applicativa ed è una risposta più concreta di un 401.

Ricezione di una risposta 403 è il server che ti dice: "Mi dispiace. So chi sei, credo chi dici di essere, ma non hai il permesso di accedere a questa risorsa. Forse se chiedi bene all'amministratore di sistema, otterrai l'autorizzazione. Ma per favore non disturbarmi di nuovo fino a quando la tua situazione non cambierà. "

In breve, una risposta 401 non autorizzata dovrebbe essere utilizzata per un'autenticazione mancante o errata e una risposta proibita 403 in seguito dovrebbe essere utilizzata, quando l'utente è autenticato ma non è autorizzato a eseguire l'operazione richiesta sulla risorsa specificata.

Un altro bel formato pittorico di come utilizzare i codici di stato http.

inserisci qui la descrizione dell'immagine


43
Il messaggio IIS 403 predefinito è "Questo è un errore 403 generico e indica che l'utente autenticato non è autorizzato a visualizzare la pagina", il che sembra concordare.
Ben Challenor

333
@JPReddy La tua risposta è corretta. Tuttavia, mi aspetto che 401 sia chiamato "Non autenticato" e 403 sia chiamato "Non autorizzato". È molto confuso che il 401, che ha a che fare con l'autenticazione, abbia il formato che accompagna il testo "Non autorizzato" .... A meno che non sia bravo in inglese (il che è abbastanza una possibilità).
p.matsinopoulos

64
@ZaidMasud, secondo RFC questa interpretazione non è corretta. La risposta di Cumbayah ha avuto ragione. 401 significa "ti manca l'autorizzazione giusta". Implica "se vuoi potresti provare ad autenticarti". Quindi, sia un client che non si è autenticato correttamente sia un client correttamente autenticato privo dell'autorizzazione otterrà un 401. 403 significa "Non risponderò a questo, chiunque tu sia". RFC afferma chiaramente che "l'autorizzazione non aiuterà" nel caso del 403.
Davide R.

84
401 è errore di autenticazione, 403 è errore di autorizzazione. Semplice come quella.
Shahriyar Imanov,

30
Hai lasciato fuori "Beh, questo è il mio punto di vista su di esso :)" quando copi dal suo post sul blog e sfortunatamente la sua visione è sbagliata. Come altri hanno affermato 403 significa che non è possibile accedere alla risorsa indipendentemente da chi si è autenticati. In genere utilizzo questo codice di stato per risorse bloccate da intervalli di indirizzi IP o file nel mio webroot a cui non desidero accedere direttamente (ovvero uno script deve servirli).
Kyle

403

Vedi RFC2616 :

401 non autorizzato:

Se la richiesta includeva già le credenziali di autorizzazione, la risposta 401 indica che l'autorizzazione è stata rifiutata per tali credenziali.

403 proibito:

Il server ha compreso la richiesta, ma si rifiuta di soddisfarla.

Aggiornare

Dal tuo caso d'uso, sembra che l'utente non sia autenticato. Vorrei restituire 401.


Modifica: RFC2616 è obsoleto, vedere RFC7231 e RFC7235 .


21
Grazie, questo mi ha aiutato a chiarirlo. Sto usando entrambi: il 401 per utenti non autenticati, il 403 per utenti autenticati con autorizzazioni insufficienti.
VirtuosiMedia,

52
Non ho votato in negativo ma trovo questa risposta abbastanza fuorviante. 403 vietato viene utilizzato in modo più appropriato nei contenuti che non verranno mai pubblicati (come i file .config in asp.net). è quello o un 404. imho, non sarebbe appropriato restituire 403 per qualcosa a cui si può accedere ma non si hanno le credenziali giuste. la mia soluzione sarebbe quella di dare un messaggio di accesso negato con un modo per cambiare le credenziali. quello o un 401.
Mel

27
"La risposta DEVE includere un campo di intestazione WWW-Authenticate (sezione 14.47) contenente una sfida applicabile alla risorsa richiesta." Sembrerebbe che se non si desidera utilizzare l'autenticazione in stile HTTP, un codice di risposta 401 non è appropriato.
Brilliand

8
Tornerò qui da Billiand. La dichiarazione è "Se la richiesta includeva già le credenziali di autorizzazione". Ciò significa che questa è una risposta da una richiesta che ha fornito le credenziali (ad esempio la risposta di un tentativo di autenticazione RFC2617). È essenzialmente per consentire al server di dire "Coppia di account / password errata, riprovare". Nella domanda posta, l'utente è presumibilmente autenticato ma non autorizzato. 401 non è mai la risposta appropriata per tali circostanze.
ldrut,

6
Brilliand ha ragione, 401 è appropriato solo per l'autenticazione HTTP.
Juampi,

296

Qualcosa che manca alle altre risposte è che bisogna capire che Autenticazione e Autorizzazione nel contesto di RFC 2616 si riferisce SOLO al protocollo di autenticazione HTTP di RFC 2617. L'autenticazione mediante schemi esterni a RFC2617 non è supportata nei codici di stato HTTP e non viene considerata quando si decide se utilizzare 401 o 403.

Breve e conciso

Non autorizzato indica che il client non è autenticato RFC2617 e che il server sta avviando il processo di autenticazione. Proibito indica che il client è autenticato RFC2617 e non dispone di autorizzazione o che il server non supporta RFC2617 per la risorsa richiesta.

Significa che se hai il tuo processo di accesso roll-your-own e non usi mai l'autenticazione HTTP, 403 è sempre la risposta corretta e 401 non dovrebbe mai essere usato.

Dettagliato e approfondito

Da RFC2616

10.4.2 401 Non autorizzato

La richiesta richiede l'autenticazione dell'utente. La risposta DEVE includere un campo di intestazione WWW-Authenticate (sezione 14.47) contenente una sfida applicabile alla risorsa richiesta. Il cliente può ripetere la richiesta con un campo di intestazione Autorizzazione adeguato (sezione 14.8).

e

10.4.4 403 Proibito Il server ha compreso la richiesta ma si rifiuta di soddisfarla. L'autorizzazione non aiuterà e la richiesta NON DOVREBBE essere ripetuta.

La prima cosa da tenere a mente è che "Autenticazione" e "Autorizzazione" nel contesto di questo documento si riferiscono specificamente ai protocolli di autenticazione HTTP di RFC 2617. Non si riferiscono ad alcun protocollo di autenticazione roll-your-own che potresti aver creato utilizzando le pagine di accesso, ecc. Userò "login" per fare riferimento all'autenticazione e all'autorizzazione con metodi diversi da RFC2617

Quindi la vera differenza non è il problema o anche se esiste una soluzione. La differenza è ciò che il server si aspetta che faccia il client.

401 indica che la risorsa non può essere fornita, ma il server RICHIEDE che il client acceda tramite l'autenticazione HTTP e abbia inviato le intestazioni di risposta per avviare il processo. Forse ci sono autorizzazioni che permetteranno l'accesso alla risorsa, forse non ci sono, ma proviamolo e vediamo cosa succede.

403 indica che la risorsa non può essere fornita e per l'utente corrente non esiste alcun modo per risolverlo tramite RFC2617 e non ha senso tentare. Ciò può essere dovuto al fatto che è noto che nessun livello di autenticazione è sufficiente (ad esempio a causa di una lista nera IP), ma può essere dovuto al fatto che l'utente è già autenticato e non dispone dell'autorizzazione. Il modello RFC2617 è un utente e una delle credenziali, pertanto il caso in cui l'utente può disporre di una seconda serie di credenziali che potrebbero essere autorizzate può essere ignorato. Né suggerisce né implica che una sorta di pagina di accesso o altri protocolli di autenticazione non RFC2617 possano o meno aiutare, al di fuori degli standard e delle definizioni RFC2616.


Modifica: RFC2616 è obsoleto, vedere RFC7231 e RFC7235 .


7
Quindi cosa dovremmo fare quando l'utente richiede una pagina che richiede un'autenticazione non http? Invia codice stato 403?
marcovtwout,

2
Questa è la risposta che ha risposto alle mie domande sulla distinzione.
Patrick,

9
Questo è importante: "se hai il tuo processo di accesso roll-your-own e non usi mai l'autenticazione HTTP, 403 è sempre la risposta corretta e 401 non dovrebbe mai essere usato."
ggg,

1
@marcovtwout Invia un 302 alla tua pagina di accesso o un 403 contenente un corpo con le informazioni su come accedere?
Alex,

4
RFC7235 non prevede sfide "roll-your-own" o di autenticazione alternativa? Perché il flusso di accesso della mia app non può presentare la sua sfida sotto forma di WWW-Authenticateintestazione? Anche se un browser non lo supporta, la mia app React può ...
jchook,

127
  + -----------------------
  | ESISTENTI ALLE RISORSE? (se privato è spesso controllato DOPO il controllo di autenticazione)
  + -----------------------
    | |
 NO | v SÌ
    v + -----------------------
   404 | È COLLEGATO? (autenticato, aka ha sessione o cookie JWT)
   o + -----------------------
   401 | |
   403 NO | | SÌ
   3xx vv
              401 + -----------------------
       (404 nessuna rivelazione) | PU ACCESS ACCEDERE ALLE RISORSE? (permesso, autorizzato, ...)
              o + -----------------------
             reindirizzamento | |
             per accedere NO | | SÌ
                               | |
                               vv
                               403 OK 200, reindirizzamento, ...
                      (o 404: nessuna rivelazione)
                      (o 404: la risorsa non esiste se privata)
                      (o 3xx: reindirizzamento)

I controlli vengono generalmente eseguiti in questo ordine:

  • 404 se la risorsa è pubblica e non esiste o reindirizzamento 3xx
  • ALTRIMENTI:
  • 401 se non si è effettuato l'accesso o la sessione è scaduta
  • 403 se l'utente non dispone dell'autorizzazione per accedere alla risorsa (file, json, ...)
  • 404 se la risorsa non esiste o non è disposta a rivelare nulla, o reindirizzamento 3xx

NON AUTORIZZATO : codice di stato (401) che indica che la richiesta richiede autenticazione , in genere significa che l'utente deve aver effettuato l'accesso (sessione). Utente / agente sconosciuto dal server. Può ripetere con altre credenziali. NOTA: questo è fonte di confusione in quanto avrebbe dovuto essere chiamato "non autenticato" anziché "non autorizzato". Questo può accadere anche dopo il login se la sessione è scaduta. Caso speciale: può essere utilizzato al posto di 404 per evitare la presenza o la non presenza di risorse rivelanti (credits @gingerCodeNinja)

VIETATO : codice di stato (403) che indica che il server ha compreso la richiesta ma ha rifiutato di soddisfarla. Utente / agente noto dal server ma con credenziali insufficienti . La richiesta ripetuta non funzionerà, a meno che le credenziali non vengano modificate, il che è molto improbabile in breve tempo. Caso speciale: può essere utilizzato al posto di 404 per evitare la presenza o la non presenza di risorse rivelanti (credits @gingerCodeNinja)

NON TROVATO : codice di stato (404) che indica che la risorsa richiesta non è disponibile. Utente / agente noto ma il server non rivelerà nulla sulla risorsa, come se non esistesse. La ripetizione non funzionerà. Questo è un uso speciale di 404 (ad esempio github).

Come menzionato da @ChrisH ci sono alcune opzioni per il reindirizzamento 3xx (301, 302, 303, 307 o per non reindirizzare affatto e usando un 401):


Ad esempio, ho effettuato l'accesso e posso accedere a una pagina ma non è stata abilitata per me l'autorizzazione. Quale codice di stato restituirà?
barteloma

@bookmarker L'accesso è chiamato autenticazione, che è il primo passo. Quindi, se non si dispone dell'autorizzazione dopo aver effettuato l'accesso, verrà visualizzato 403 Proibito (credenziali insufficienti significa che non si dispone di autorizzazioni sufficienti).
Christophe Roussy,

3
Spiegazione chiara e semplice. Proprio quello di cui ho bisogno.
Estevez,

se l'utente non ha effettuato l'accesso o non ha effettuato l'accesso ma non dispone dell'autorizzazione e il contenuto non esiste nella posizione, a volte probabilmente si desidera restituire 401/403 anziché 404, in modo da non esporre ciò che è o non è se l'utente non è autenticato e non ha effettuato l'accesso. Il solo fatto di sapere qualcosa esiste può suggerire qualcosa o rompere NDA. Quindi a volte la parte 404 di questo diagramma dovrebbe essere spostata in login / autenticato.
gingerCodeNinja,

1
@MattKocaj nota che il no revealcaso a volte può essere rilevato attraverso sottili differenze di temporizzazione e non dovrebbe essere visto come una funzione di sicurezza, potrebbe solo rallentare gli aggressori o aiutare un po 'con la privacy.
Christophe Roussy,

113

Secondo RFC 2616 (HTTP / 1.1) 403 viene inviato quando:

Il server ha compreso la richiesta, ma si rifiuta di soddisfarla. L'autorizzazione non aiuterà e la richiesta NON DOVREBBE essere ripetuta. Se il metodo di richiesta non era HEAD e il server desidera rendere pubblico il motivo per cui la richiesta non è stata soddisfatta, DOVREBBE descrivere il motivo del rifiuto nell'entità. Se il server non desidera rendere disponibili queste informazioni al client, è possibile utilizzare invece il codice di stato 404 (Not Found)

In altre parole, se il client PU get accedere alla risorsa autenticandosi, dovrebbe essere inviato 401.


5
E se non è chiaro se possono accedervi o no? Supponi di avere 3 livelli utente: Pubblico, Membri e Membri Premium. Supponiamo che la pagina sia riservata ai membri Premium. Un utente pubblico è sostanzialmente non autenticato e potrebbe essere in Membri o Membri Premium quando effettuano l'accesso. Per il livello utente Membro, un 403 sembrerebbe appropriato. Per i membri Premium, il 401. Tuttavia, cosa servi al pubblico?
VirtuosiMedia,

27
imho, questa è la risposta più accurata. dipende dall'applicazione ma in generale, se un utente autenticato non ha diritti sufficienti su una risorsa, potresti voler fornire un modo per cambiare le credenziali o inviare un 401. Penso che 403 sia più adatto per contenuti che non vengono mai offerti. In asp.net ciò significherebbe file web.config * file .resx ecc. Perché, indipendentemente dall'utente che accede, questi file non verranno MAI offerti, quindi non ha senso riprovare.
Mel,

6
+1, ma un +1 incerto. La logica conclusione è che un 403 non dovrebbe mai essere restituito in quanto 401 o 404 sarebbero una risposta strettamente migliore.
CurtainDog

12
@Mel Penso che un file a cui il client non dovrebbe accedere sia un 404. È un file interno al sistema; l'esterno non dovrebbe nemmeno sapere che esiste. Restituendo un 403 stai facendo sapere al cliente che esiste, non è necessario fornire tali informazioni agli hacker. Le specifiche per 403 diconoAn 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
Mentre questo mi sembra che sia probabilmente un'interpretazione accurata della vecchia RFC 2616, nota che RFC 7231 definisce la semantica di una 403 in modo diverso , e in effetti afferma esplicitamente che "Il cliente PUO 'ripetere la richiesta con credenziali nuove o diverse". Quindi, sebbene questa risposta sia stata accurata nel 2010, oggi è completamente sbagliata, perché il significato del codice di stato è stato riscritto sotto i nostri piedi. (Stranamente, l' appendice delle modifiche dall'appendice RFC 2616 non riconosce la modifica!)
Mark Amery,

46

Supponendo che sia in uso l' autenticazione HTTP ( intestazioni WWW-Authenticate and Authorization ) , se l'autenticazione come un altro utente consentirebbe l'accesso alla risorsa richiesta, allora dovrebbe essere restituito 401 Non autorizzato.

403 Proibito viene utilizzato quando l'accesso alla risorsa è vietato a tutti o limitato a una determinata rete o consentito solo su SSL, a condizione che non sia correlato all'autenticazione HTTP.

Se l'autenticazione HTTP non è in uso e il servizio prevede uno schema di autenticazione basato su cookie come è oggigiorno la norma, è necessario restituire un 403 o un 404.

Per quanto riguarda 401, questo è da RFC 7235 (Hypertext Transfer Protocol (HTTP / 1.1): Autenticazione):

3.1. 401 Non autorizzato

Il codice di stato 401 (non autorizzato) indica che la richiesta non è stata applicata perché manca di credenziali di autenticazione valide per la risorsa di destinazione. Il server di origine DEVE inviare un campo di intestazione WWW-Authenticate (Sezione 4.4) contenente almeno una sfida applicabile alla risorsa di destinazione. Se la richiesta includeva credenziali di autenticazione, la risposta 401 indica che l'autorizzazione è stata rifiutata per tali credenziali. Il cliente può ripetere la richiesta con un campo di intestazione Autorizzazione nuovo o sostituito (Sezione 4.1). Se la risposta 401 contiene la stessa sfida della risposta precedente e l'agente utente ha già tentato l'autenticazione almeno una volta, l'agente utente DOVREBBE presentare all'utente la rappresentazione allegata, poiché di solito contiene informazioni diagnostiche pertinenti.

La semantica di 403 (e 404) è cambiata nel tempo. Questo è del 1999 (RFC 2616):

10.4.4 403 Proibito

Il server ha compreso la richiesta, ma si rifiuta di soddisfarla.
L'autorizzazione non sarà di aiuto e la richiesta NON DOVREBBE essere ripetuta.
Se il metodo di richiesta non era HEAD e il server desidera rendere
pubblico il motivo per cui la richiesta non è stata soddisfatta, DOVREBBE descrivere il motivo del rifiuto nell'entità. Se il server non desidera rendere disponibili queste informazioni al client, è
possibile utilizzare invece il codice di stato 404 (Not Found).

Nel 2014 RFC 7231 (Hypertext Transfer Protocol (HTTP / 1.1): Semantica e contenuto) ha cambiato il significato di 403:

6.5.3. 403 proibito

Il codice di stato 403 (proibito) indica che il server ha compreso la richiesta ma si rifiuta di autorizzarla. Un server che desidera rendere pubblico il motivo per cui la richiesta è stata vietata può descrivere tale motivo nel payload di risposta (se presente).

Se nella richiesta sono state fornite credenziali di autenticazione, il
server le considera insufficienti per consentire l'accesso. Il client
NON DOVREBBE ripetere automaticamente la richiesta con le stesse
credenziali. Il cliente può ripetere la richiesta con credenziali nuove o diverse. Tuttavia, una richiesta potrebbe essere vietata per motivi
non correlati alle credenziali.

Un server di origine che desidera "nascondere" l'esistenza attuale di una
risorsa di destinazione vietata PU instead invece rispondere con un codice di stato
404 (non trovato).

Pertanto, un 403 (o un 404) potrebbe ora significare qualsiasi cosa. Fornire nuove credenziali potrebbe aiutare ... oppure no.

Credo che il motivo per cui questo è cambiato sia RFC 2616 supponendo che l'autenticazione HTTP verrebbe utilizzata quando in pratica le app Web di oggi sviluppano schemi di autenticazione personalizzati utilizzando ad esempio moduli e cookie.


2
Questo è interessante. Basato su RFC 7231 e RFC 7235, non vedo una chiara distinzione tra 401 e 403
Brian

2
403 significa "Ti conosco ma non riesci a vedere questa risorsa." Non c'è motivo di confusione.
Michael Blackburn,

"Se la richiesta includeva credenziali di autenticazione, la risposta 401 indica che l'autorizzazione è stata rifiutata per tali credenziali. Il client PUO 'ripetere la richiesta con un campo di intestazione Autorizzazione nuovo o sostituito (Sezione 4.1)." Tuttavia, quindi "4.2. Il campo di intestazione" Autorizzazione "consente a un agente utente di autenticarsi con un server di origine". Sembra che in RFC7235 usino il termine "autorizzazione" come se fosse "autenticazione". In tal caso, potrebbe sembrare che un utente autenticato ma non autorizzato non debba ottenere un 401, ma piuttosto 403
arcuri82

29

Questa è una domanda più vecchia, ma un'opzione che non è mai stata davvero sollevata è quella di restituire un 404. Dal punto di vista della sicurezza, la risposta più votata soffre di una potenziale vulnerabilità di perdita di informazioni . Supponiamo, ad esempio, che la pagina Web protetta in questione sia una pagina di amministrazione del sistema, o forse più comunemente, sia un record in un sistema a cui l'utente non ha accesso. Idealmente non vorresti che un utente malintenzionato sapesse nemmeno che c'è una pagina / record lì, figuriamoci che non hanno accesso. Quando sto costruendo qualcosa del genere, proverò a registrare richieste non autenticate / non autorizzate in un registro interno, ma restituirò un 404.

OWASP ha alcune informazioni in più su come un utente malintenzionato potrebbe utilizzare questo tipo di informazioni come parte di un attacco.


3
L'uso di un 404 è stato menzionato nelle risposte precedenti. Sei sul punto: perdita di informazioni e questo dovrebbe essere una considerazione importante per chiunque stia lanciando il proprio schema di autenticazione / autorizzazione. +1 per menzionare OWASP.
Dave Watts,

Ironia della sorte, il collegamento OWASP ora passa a una pagina 404. Ho trovato qualcosa di simile (penso) su owasp.org/index.php/…
anned20

Grazie per l'attenzione, l'ho aggiornato!
Patrick White

Dipende dall'API e da come viene concesso l'accesso. Ma "perdite" non è un problema se restituisce 401 per nome utente / password è sicuramente lo stesso di un modulo web?
James,

26
  • 401 Non autorizzato : non so chi sei. Questo è un errore di autenticazione.
  • 403 Proibito : so chi sei, ma non hai i permessi per accedere a questa risorsa. Questo è un errore di autorizzazione.

Non sono sicuro che in particolare "sempre" significhi che il mittente era sconosciuto. Tutto ciò che hanno richiesto non è stato autorizzato.
James,

22

Questa domanda è stata posta qualche tempo fa, ma il pensiero della gente va avanti.

La sezione 6.5.3 di questa bozza (creata da Fielding e Reschke) dà al codice di stato 403 un significato leggermente diverso da quello documentato in RFC 2616 .

Riflette ciò che accade negli schemi di autenticazione e autorizzazione utilizzati da numerosi server Web e framework popolari.

Ho sottolineato la parte che ritengo più saliente.

6.5.3. 403 proibito

Il codice di stato 403 (proibito) indica che il server ha compreso la richiesta ma si rifiuta di autorizzarla. Un server che desidera rendere pubblico il motivo per cui la richiesta è stata vietata può descrivere tale motivo nel payload di risposta (se presente).

Se nella richiesta sono state fornite credenziali di autenticazione, il server le considera insufficienti per consentire l'accesso. Il client NON DOVREBBE ripetere la richiesta con le stesse credenziali. Il cliente può ripetere la richiesta con credenziali nuove o diverse. Tuttavia, una richiesta potrebbe essere vietata per motivi non correlati alle credenziali.

Un server di origine che desidera "nascondere" l'esistenza attuale di una risorsa di destinazione vietata PUO 'invece rispondere con un codice di stato 404 (non trovato).

Qualunque sia la convenzione che utilizzi, l'importante è fornire uniformità nel tuo sito / API.


2
Il progetto è stato approvato ed è ora RFC 7231.
Vebjorn Ljosa,

13

TL; DR

  • 401: Un rifiuto che ha a che fare con l'autenticazione
  • 403: Un rifiuto che non ha nulla a che fare con l'autenticazione

Esempi pratici

Se apache richiede l'autenticazione (via .htaccess) e si preme Cancel, risponderà con a401 Authorization Required

Se nginx trova un file, ma non ha diritti di accesso (utente / gruppo) per leggerlo / accedervi, risponderà403 Forbidden

RFC (2616 Sezione 10)

401 non autorizzato (10.4.2)

Significato 1: necessità di autenticare

La richiesta richiede l'autenticazione dell'utente. ...

Significato 2: autenticazione insufficiente

... Se la richiesta includeva già le credenziali di autorizzazione, la risposta 401 indica che l'autorizzazione è stata rifiutata per tali credenziali. ...

403 proibito (10.4.4)

Significato: non correlato all'autenticazione

... L'autorizzazione non aiuterà ...

Più dettagli:

  • Il server ha compreso la richiesta, ma si rifiuta di soddisfarla.

  • DOVREBBE descrivere il motivo del rifiuto nell'entità

  • In alternativa, è possibile utilizzare il codice di stato 404 (Non trovato)

    (Se il server desidera mantenere queste informazioni dal client)


11

non sono connessi o non appartengono al gruppo utenti corretto

Hai dichiarato due casi diversi; ogni caso dovrebbe avere una risposta diversa:

  1. Se non hanno effettuato l'accesso, è necessario restituire 401 Non autorizzato
  2. Se sono connessi ma non appartengono al gruppo utenti corretto, è necessario restituire 403 proibito

Nota sulla RFC sulla base dei commenti ricevuti a questa risposta:

Se l'utente non ha effettuato l'accesso, non è autenticato, il cui equivalente HTTP è 401 ed è fuorviante chiamato Non autorizzato nella RFC. Come indicato nella sezione 10.4.2 per 401 Non autorizzato :

"La richiesta richiede l' autenticazione dell'utente ."

Se non sei autenticato, 401 è la risposta corretta. Tuttavia, se non sei autorizzato, nel senso semanticamente corretto, 403 è la risposta corretta.


5
Questo non è corretto Fare riferimento a RFC e alla risposta di @ Cumbayah.
Davide R.

7
@DavideR. la RFC utilizza l' autenticazione e l' autorizzazione in modo intercambiabile. Credo che abbia più senso se letto con il significato di autenticazione .
Zaid Masud,

Questa risposta è invertita. Non autorizzato non equivale a Non autenticato. @DavideR ha ragione. Autenticazione e autorizzazione NON sono intercambiabili
BozoJoe,

2
2616 dovrebbe essere bruciato. Diversi RFC più recenti sono molto più chiari sulla necessità di distinguere tra "Non ti conosco" e "Ti conosco ma non puoi accedervi". Non esiste un motivo legittimo per riconoscere l'esistenza di una risorsa che non sarà mai realizzata (o non realizzata tramite http), cosa che stanno suggerendo i 403-verità.
Michael Blackburn,

6

Questi sono i significati:

401 : Utente non (correttamente) autenticato, la risorsa / pagina richiede autenticazione

403 : Utente autenticato, ma il suo ruolo o le sue autorizzazioni non consentono di accedere alla risorsa richiesta, ad esempio l'utente non è un amministratore e la pagina richiesta è per gli amministratori


Questa è un'ottima risposta TLDR a questa domanda.
Kousha,

5

Questo è più semplice nella mia testa che ovunque qui, quindi:

401: Per vedere questo è necessario l'autenticazione di base HTTP.

403: Non puoi vederlo e l'autenticazione di base HTTP non ti aiuterà.

Se l'utente deve semplicemente accedere utilizzando il modulo di accesso HTML standard del tuo sito, 401 non sarebbe appropriato perché è specifico dell'autent di base HTTP.

Non consiglio di usare 403 per negare l'accesso a cose come /includes, perché per quanto riguarda il web, quelle risorse non esistono affatto e dovrebbero quindi 404.

Questo lascia 403 come "devi essere loggato".

In altre parole, 403 significa "questa risorsa richiede una forma di autenticazione diversa dall'autent di base HTTP".

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


5

Penso che sia importante considerare che, per un browser, 401 avvia una finestra di autenticazione per l'utente di inserire nuove credenziali, mentre 403 no. I browser pensano che, se viene restituito un 401, l'utente dovrebbe eseguire nuovamente l'autenticazione. Quindi 401 indica autenticazione non valida mentre 403 indica mancanza di autorizzazione.

Ecco alcuni casi in quella logica in cui un errore verrebbe restituito dall'autenticazione o dall'autorizzazione, con frasi importanti in grassetto.

  • Una risorsa richiede autenticazione ma non sono state specificate credenziali .

401 : il client deve specificare le credenziali.

  • Le credenziali specificate sono in un formato non valido .

400 : Non è né 401 né 403, poiché gli errori di sintassi dovrebbero sempre restituire 400.

  • Le credenziali specificate fanno riferimento a un utente che non esiste .

401 : il client deve specificare credenziali valide.

  • Le credenziali specificate non sono valide ma specificano un utente valido (o non specificare un utente se non è richiesto un utente specificato).

401 : Ancora una volta, il client deve specificare credenziali valide.

  • Le credenziali specificate sono scadute .

401 : Questo è praticamente lo stesso di avere credenziali non valide in generale, quindi il cliente deve specificare credenziali valide.

  • Le credenziali specificate sono completamente valide ma non sono sufficienti per la particolare risorsa , sebbene sia possibile che le credenziali con più autorizzazioni possano farlo.

403 : La specifica di credenziali valide non consentirebbe l'accesso alla risorsa, poiché le credenziali correnti sono già valide ma solo non dispongono dell'autorizzazione.

  • La particolare risorsa è inaccessibile indipendentemente dalle credenziali.

403 : indipendentemente dalle credenziali, pertanto non è possibile specificare le credenziali valide.

  • Le credenziali specificate sono completamente validi ma la particolare cliente viene bloccato dal loro utilizzo.

403 : se il client è bloccato, specificare nuove credenziali non farà nulla.


4

In inglese:

401

Potresti potenzialmente accedere, ma per qualche motivo su questa richiesta ti è stato negato. Come una password sbagliata? Riprova, con la richiesta corretta otterrai invece una risposta positiva.

403

Non ti è mai permesso. Il tuo nome non è nell'elenco, non entrerai mai, vai via, non inviare una richiesta di riprovare, verrà rifiutato, sempre. Va via.


1

Dati gli ultimi RFC in materia ( 7231 e 7235 ), il caso d'uso sembra abbastanza chiaro (corsivo aggiunto):

  • 401 non è autenticato ("manca un'autenticazione valida"); cioè "Non so chi sei o non mi fido di te chi dici di essere".

401 Non autorizzato

Il codice di stato 401 (non autorizzato) indica che la richiesta non è stata applicata perché manca di credenziali di autenticazione valide per la risorsa di destinazione. Il server che genera una risposta 401 DEVE inviare un campo di intestazione WWW-Authenticate (Sezione 4.1) contenente almeno una sfida applicabile alla risorsa di destinazione.

Se la richiesta includeva credenziali di autenticazione, la risposta 401 indica che l'autorizzazione è stata rifiutata per tali credenziali. L'agente utente PUO 'ripetere la richiesta con un campo di intestazione Autorizzazione nuovo o sostituito (Sezione 4.2). Se la risposta 401 contiene la stessa sfida della risposta precedente e l'agente utente ha già tentato l'autenticazione almeno una volta, l'agente utente DOVREBBE presentare all'utente la rappresentazione allegata, poiché di solito contiene informazioni diagnostiche pertinenti.

  • 403 è per non autorizzato ("rifiuta di autorizzare"); cioè "So chi sei, ma non hai i permessi per accedere a questa risorsa".

403 proibito

Il codice di stato 403 (proibito) indica che il server ha compreso la richiesta ma rifiuta di autorizzarla . Un server che desidera rendere pubblico il motivo per cui la richiesta è stata vietata può descrivere tale motivo nel payload di risposta (se presente).

Se nella richiesta sono state fornite credenziali di autenticazione, il server le considera insufficienti per consentire l'accesso. Il client NON DOVREBBE ripetere automaticamente la richiesta con le stesse credenziali. Il cliente può ripetere la richiesta con credenziali nuove o diverse. Tuttavia, una richiesta potrebbe essere vietata per motivi non correlati alle credenziali.

Un server di origine che desidera "nascondere" l'esistenza attuale di una risorsa di destinazione vietata PU instead invece rispondere con un codice di stato 404 (non trovato).


2
-1; questi passaggi sono già stati citati in altre risposte qui e il tuo non aggiunge nulla di nuovo. Direi che è palesemente non chiaro quale sia la distinzione è; riassumi i due codici come "manca un'autenticazione valida" e "rifiuta di autorizzare", ma non riesco a concepire alcuna situazione in cui una di quelle brevi descrizioni si applicherebbe laddove l'altro non potrebbe essere interpretato come applicabile.
Mark Amery,

Ci sono molte risposte qui che coprono molte RFC e sono modificate e aggiornate confondendo le acque. Ho incluso un link per spiegare cosa authenticatedsia e cosa authorizedsia e lasciato fuori da tutte le RFC obsolete in modo che l'applicazione sia chiara.
cjbarth,

La modifica chiarisce la tua interpretazione dei due codici, che sembra corrispondere all'interpretazione di molte altre persone. Tuttavia, personalmente ritengo che l'interpretazione abbia poco senso. L'uso della frase " Se sono state fornite credenziali di autenticazione" nella descrizione 403 implica che un 403 può essere appropriato anche se non sono state fornite credenziali, ovvero il caso "non autenticato". Nel frattempo, per me l'interpretazione più naturale dell'espressione "per la risorsa di destinazione" inclusa nella descrizione 401 è che un 401 può essere utilizzato per un utente autenticato ma non autorizzato.
Mark Amery,

-6

Nel caso di 401 vs 403, questo è stato risposto più volte. Questo è essenzialmente un dibattito "HTTP request environment", non un dibattito "application".

Sembra che ci sia una domanda sul problema roll-your-own-login (applicazione).

In questo caso, semplicemente non effettuare l'accesso non è sufficiente per inviare un 401 o un 403, a meno che non si utilizzi HTTP Auth vs una pagina di accesso (non legata all'impostazione di HTTP Auth). Sembra che tu stia cercando un "201 creato", con una schermata roll-your-own-login presente (invece della risorsa richiesta) per l'accesso a livello di applicazione a un file. Questo dice:

"Ti ho sentito, è qui, ma prova questo (non ti è permesso vederlo)"


Cosa viene creato esattamente?
Concedi Gryczan il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.