Autenticação vs autorização
Toda requisição que um usuário faz levanta duas perguntas, e elas são respondidas em ordem.
Quem é essa pessoa? e o que ela pode fazer?
A primeira é autenticação. A segunda é autorização. As duas costumam ser chamadas de "auth", as duas começam com as mesmas seis letras, e resolvem problemas completamente diferentes.
Provando quem você é
A autenticação responde a uma única pergunta: essa pessoa é mesmo quem diz ser?
Você já conhece os métodos comuns como usuário:
- Um nome de usuário e uma senha.
- Fazer login com o Google ou o GitHub.
- Enviar uma API key ou um token junto com a requisição.
Cada um desses é uma forma de apresentar evidências. O trabalho do servidor é decidir se essas evidências se sustentam.
Se isso for feito errado, alguém pode se passar por outra pessoa. Isso é spoofing, o S do STRIDE, e é a falha que torna qualquer outra proteção irrelevante, porque a aplicação passa a aplicar as regras certas para a pessoa errada.
A porta não se importa com o que você quer fazer. O único trabalho dela é decidir se você é mesmo a pessoa que diz ser.
Decidindo o que você pode fazer
A autorização acontece depois, e só faz sentido depois que a identidade já está definida:
- Um usuário lendo os próprios dados.
- Um usuário atualizando o próprio perfil.
- Um professor lendo os registros dos seus alunos.
- Essa mesma requisição feita por um aluno, recusada.
Se isso for feito errado, as pessoas fazem coisas que não deveriam. No STRIDE isso é elevação de privilégio; na OWASP Top 10 isso é controle de acesso quebrado, que está no topo da lista há anos.
Estar logado não é uma permissão única. É o ponto de partida para uma pergunta separada, feita de novo a cada requisição.
A ordem em que elas acontecem
Toda requisição que chega a um recurso protegido passa pelas duas, na mesma sequência:
request ──▶ authentication ──▶ authorization ──▶ resource
(who are you?) (may you do this?)Dois exemplos deixam isso claro. Um usuário lendo o próprio perfil: a requisição chega, a autenticação estabelece quem ele é, a autorização confirma que o perfil pertence a ele, o acesso é concedido.
Um administrador acessando um endpoint só para administradores: a requisição chega, a autenticação estabelece quem ele é, a autorização verifica se ele tem privilégios de administrador, o acesso é concedido.
Apenas uma das quatro etapas muda entre esses dois casos. A verificação de identidade é idêntica, e a verificação de permissão é onde as duas requisições se separam.
Autenticação forte com autorização fraca é inseguro. Autorização forte sem autenticação sólida não tem sentido.
É por isso que a autenticação vem sempre primeiro, e por que um erro nela desmancha tudo o que vem depois.
Coloque em prática
Quatro situações. Para cada uma, decida se a falha é de autenticação ou de autorização, e diga a que letra do STRIDE ela corresponde.
- Um formulário de login aceita qualquer senha para o nome de usuário
admin. - Um cliente logado muda o id em uma URL e vê o pedido de outro cliente.
- Um endpoint de API aceita requisições sem nenhum token.
- Um agente de suporte consegue excluir contas, algo que só deveria ser possível para administradores.
Compare suas respostas
| # | Falha | Por quê | STRIDE |
|---|---|---|---|
| 1 | Autenticação | A aplicação não consegue saber quem está no teclado, então qualquer um pode se passar por admin | Spoofing |
| 2 | Autorização | O cliente realmente é quem diz ser; nada verificou se o pedido pertence a ele | Elevação de privilégio |
| 3 | Autenticação | Nenhuma alegação é apresentada, então o endpoint não tem ideia de quem está chamando. Um 401 é a resposta correta | Spoofing |
| 4 | Autorização | O agente é identificado corretamente e a verificação de permissão está errada. Um 403 é a recusa correta | Elevação de privilégio |
O número 2 tem nome próprio: uma referência direta insegura a objeto. Em termos da OWASP, tanto o 2 quanto o 4 são controle de acesso quebrado.
Dois e quatro são a mesma classe de bug vestindo roupas diferentes, o que é parte do motivo pelo qual o controle de acesso quebrado continua no topo da lista da OWASP. Nos dois casos, a aplicação sabia exatamente quem estava perguntando.
Para onde isso vai a partir daqui
A autenticação acontece uma vez, no login. A autorização acontece em toda requisição depois disso, e precisa saber quem é o usuário a cada vez.
O que deixa uma lacuna incômoda, porque o HTTP não guarda memória nenhuma de uma requisição para a próxima.
Como as aplicações lembram de você é o problema que essa lacuna cria, e as três famílias de resposta que o restante desta seção percorre.

