Acabei de ler este artigo, que tem alguns anos, mas descreve uma maneira inteligente de proteger suas APIs REST. Essencialmente:
- Cada cliente possui um par de chaves pública / privada exclusivo
- Somente o cliente e o servidor conhecem a chave privada; nunca é enviado por fio
- Com cada solicitação, o cliente obtém várias entradas (a solicitação inteira em si, o registro de data e hora atual e a chave privada) e as executa através de uma função HMAC para produzir um hash da solicitação
- O cliente envia a solicitação normal (que contém a chave pública) e o hash para o servidor
- O servidor procura a chave privada do cliente (com base na chave pública fornecida) e faz alguma verificação de carimbo de data / hora (que reconhecidamente não entendo) para verificar se a solicitação não é vítima de um ataque de repetição
- Se tudo estiver bem, o servidor utilizará a chave privada e a mesma função HMAC para gerar seu próprio hash da solicitação
- O servidor compara os dois hashes (o enviado pelo cliente e o gerado); se corresponderem, a solicitação será autenticada e permitida a continuação
Tropecei no JWT , o que parece muito semelhante. No entanto, o primeiro artigo não menciona o JWT e, portanto, estou me perguntando se o JWT é diferente da solução de autenticação acima e, em caso afirmativo, como.
Respostas:
Vamos começar com uma resposta muito básica.
O JWT (conforme usado no contexto do OAuth e OpenID) não requer segredos compartilhados entre o cliente e a API. Existem 3 componentes e pares de 2 compartilham um segredo cada: cliente <-> servidor de identificação, servidor de identificação <-> API.
Isso move a maior complexidade da API para o servidor de identificação, a API apenas precisa verificar se o token foi emitido pelo servidor de identificação e não foi temperado. Para verificar se a API verifica se a assinatura JWT é válida com o único segredo compartilhado conhecido entre o servidor de identificação e a API. É isso aí!
Como o servidor de identificação valida a identidade do usuário pode variar bastante (em muitos casos, é o antigo par de nome de usuário e senha em uma conexão TLS), mas não tem efeito na sua API.
Privacidade e segurança da mensagem e do próprio token ao usar o JWT são tratados pelo TLS, o JWT ignora esses problemas.
fonte