401 e 403 significam que você não obteve a página, e são constantemente trocados um pelo outro, em mensagens de erro e em relatórios de bugs. A diferença entre eles é pequena para ler e grande para agir: um é sobre quem você é, e o outro é sobre o que você tem permissão para fazer.

Interpretá-los ao contrário o envia para corrigir a coisa errada. Então aqui está a distinção, o que cada um realmente quer dizer, e como saber qual você realmente está vendo.

A versão de uma linha

401 Não Autorizado significa que o servidor não sabe quem você é. Você não está conectado, ou a credencial que você enviou estava faltando, incorreta ou expirada. Faça login corretamente e a solicitação teria sucesso.

403 Proibido significa que o servidor sabe exatamente quem você é, e você ainda assim não pode. Você está conectado, sua credencial está correta, e esta conta em particular simplesmente não tem permissão para fazer esta coisa específica. Fazer login novamente não muda nada, porque estar conectado nunca foi o problema.

Simplificando: 401 é “Não conheço você”, 403 é “Conheço você, mas não”.

A terminologia é um acidente histórico que torna isso pior. 401 é rotulado “Não Autorizado” quando realmente significa não autenticado - o servidor não conseguiu estabelecer quem você é. 403 é o que realmente é sobre autorização. Os nomes estão presos por compatibilidade, então leia além deles para entender o que cada código faz.

Como saber qual você tem

Veja se você está conectado quando isso acontece.

Se você está desconectado, ou a solicitação não tinha cookie de sessão ou token, um 401 é a resposta esperada e correta, e a correção é se autenticar. Se a mesma solicitação funciona uma vez que você faz login, foi sempre apenas um 401.

Se você está conectado - corretamente, com uma sessão que o servidor aceita em outro lugar - e uma ação específica ou página retorna o erro, você está olhando para um 403. A conta está autenticada e a resposta ainda é não. Desconectar e conectar novamente, limpar cookies ou tentar outro navegador não vai mudar, e cada um desses é meia hora comumente desperdiçada tratando um 403 como se fosse um 401.

Uma armadilha que vale a pena mencionar: alguns servidores deliberadamente retornam 404 Não Encontrado onde querem dizer 403, para evitar confirmar que um recurso existe. Se uma URL que você sabe ser real volta como “não encontrada” apenas quando você não tem permissão para ela, a resposta real é 403 disfarçado.

Se for seu site

Qual código você envia é uma decisão, não um detalhe, porque diz à pessoa do outro lado qual de dois problemas muito diferentes eles têm.

Envie 401 quando a solicitação não está autenticada - sem credencial, ou uma que o servidor não consegue verificar - e inclua um cabeçalho WWW-Authenticate para que o cliente saiba como deve fazer login. Um 401 é um convite para se autenticar e tentar novamente.

Envie 403 quando a solicitação é autenticada mas não permitida. O usuário é quem diz ser e esta conta não pode fazer isso. Não responda com um 401, porque um 401 diz a eles que façam login novamente, e eles vão, e isso vai falhar novamente, e o ciclo não ensina nada além de que seu site está quebrado.

A causa mais comum de um 403 em seu próprio site é uma verificação de permissão ou função: um usuário chegando a uma rota de admin, uma chave de API sem o escopo para um endpoint, um objeto que pertence a outra conta. A causa mais comum de um 401 inesperado é uma sessão ou token que expirou sem o front-end perceber, então ele continua enviando uma credencial que o servidor parou de honrar.

Por que vale a pena capturá-los em vez de descrevê-los

“Recebi um erro e não me deixou entrar” é o relatório que você geralmente recebe, e se encaixa em ambos os códigos igualmente, e é exatamente por isso que não ajuda. Um 401 e um 403 parecem idênticos para um usuário - uma página que queriam e não conseguiram - e a única informação que os diferencia, o código de status, é a que uma pessoa quase nunca pensa em ler.

A solicitação em si contém a resposta: o status, se uma credencial foi enviada com ela, e o que o servidor respondeu. Capturada no momento em que falhou, isso transforma “não me deixou entrar” em “um 403 neste endpoint enquanto conectado como esta conta”, que é um bug de permissão que alguém pode encontrar - em vez de um problema de login que alguém vai perseguir por uma hora primeiro.

Session Replay

Extensão gratuita do Chrome. Um clique na página que está apresentando problemas captura a captura de tela, o console e o registro de rede, e fornece um link para colar no ticket.

Obtenha a extensão

O registro de rede contém a solicitação com falha com seu status e se uma credencial foi enviada com ela, portanto, quem pega o relatório pode ver à primeira vista se está olhando para um 401 ou um 403 - e não precisa reproduzir o estado de conexão para descobrir. Para verificar se uma URL retorna um destes para você agora, o verificador de status HTTP a solicita e relata o código que retorna.

Em um parágrafo

Um 401 Não Autorizado significa que o servidor não sabe quem você é e você deve se autenticar; um 403 Proibido significa que ele sabe exatamente quem você é e você ainda não pode, então fazer login novamente não ajudará. Diferencie-os por se você estava conectado quando isso aconteceu, envie o certo de seu próprio site para que ninguém seja enviado em um ciclo de login para um problema de permissão, e capture a solicitação com falha em vez de descrever, porque o código de status é toda a resposta e a única coisa que um usuário nunca lê.