Comparing token-based authentication and session-based authentication
This blog post introduces the basic concepts of both token-based authentication and session-based authentication, with their pros and cons. This could help readers to choose the proper authentication scheme for their application.
De modo geral, o primeiro passo no uso de uma aplicação é o login ou autenticação, onde o usuário final fornece suas credenciais de identidade para fazer login com sucesso. Após este passo, o sistema de identidade (ou seja, provedor de identidade, servidor de autenticação, etc.) sabe quem é o usuário e a quais recursos ele tem acesso.
As aplicações costumam fornecer toda a funcionalidade através de muitas APIs. Nas chamadas de API subsequentes, o que acontece se o usuário não conseguir fornecer acessos válidos?
HTTP é sem estado, o que significa que cada solicitação é independente e não contém qualquer informação de contexto relacionada à solicitação anterior. No entanto, exigir que o usuário se reaplique a cada solicitação certamente não é uma boa experiência para o usuário.
Sessões e JSON Web Tokens (JWTs) são dois dos métodos mais comuns usados para manter o estado de autenticação durante várias chamadas. Ambos os métodos têm seus prós e contras, e a escolha de qual método usar depende das necessidades específicas de sua aplicação.
Autenticação baseada em sessão
Na autenticação baseada em sessão, o servidor é responsável por criar e manter o estado de autenticação do usuário e fornecer uma maneira de referenciar esse registro em cada solicitação subsequente.
O processo começa quando o usuário se autentica e fornece algumas credenciais. Se as credenciais forem válidas, o servidor cria um registro persistente representando essa sessão, contendo informações como uma string aleatória, identificador de usuário, hora de início da sessão, hora de expiração da sessão, e assim por diante. Este registro é armazenado na base de dados e devolvido ao agente do usuário (por exemplo, browser) como um cookie.
Cada chamada subsequente envia uma solicitação HTTP do browser contendo o cookie da sessão. O servidor pode usar este cookie para buscar o registro da sessão, verificar sua validade, e tomar decisões de autorização baseadas na identidade do usuário.
Vantagens da autenticação baseada em sessão
Simples e confiável
O registro da sessão fornece uma fonte clara e centralizada, permitindo um alto grau de confiança e tornando as decisões de autorização mais confiáveis.
Revogação em tempo real
Ao eliminar ou invalidar o registro da sessão, o acesso de um usuário pode ser rapidamente revogado.
Desvantagens da autenticação baseada em sessão
Latência
Em larga escala, a autenticação de sessão pode introduzir latência porque requer interação com o banco de dados, o que pode impactar o desempenho da aplicação.
Alto consumo de recursos
Devido à necessidade de armazenar e recuperar um grande número de registros de sessão, a autenticação de sessão pode consumir mais recursos.
Autenticação JWT
Os JSON Web Tokens (JWTs) usam um método diferente para alcançar a autenticação e autorização.
O processo começa com o usuário fornecendo credenciais de autenticação, e o servidor usa estas credenciais para verificar a identidade do usuário. Ao contrário da autenticação de sessão, no entanto, os JWTs usam um objeto JSON para conter todas as informações relevantes e empregam assinaturas ou criptografia para verificar sua integridade e validade.
Um JWT é composto por três partes: um cabeçalho, um payload, e uma assinatura.
O cabeçalho contém informações do algoritmo sobre assinatura e decodificação.
O payload contém reivindicações centrais, como a identidade do usuário, permissões de autorização, e tempo de expiração.
A assinatura usa uma chave para assinar o payload, permitindo a verificação de se a assinatura foi adulterada ou não.
Vantagens dos JWTs
Rápido e eficiente
A natureza autônoma dos JWTs torna a verificação do lado do cliente mais rápida e eficiente, sem a necessidade de interação com o servidor.
Seguro
Os JWTs usam técnicas de assinatura e criptografia, tornando os ataques mais difíceis.
Desvantagens dos JWTs
JWT não é atualizado em tempo real
Uma vez que um JWT é assinado, ele não pode ser revogado ou atualizado, e será considerado válido enquanto a assinatura for válida e não tiver expirado.
Se as permissões de acesso de um usuário mudarem (geralmente degradadas), o usuário ainda terá acesso removido aos recursos até que o JWT expire. Da mesma forma, se um JWT contém informações de autorização baseadas em funções, o novo escopo de autorização não entrará em vigor até que o JWT antigo expire. Em outras palavras, os JWTs não são adequados para revogação em tempo real e os usuários podem definir um tempo de expiração adequado para mitigar este problema.
Dilema de vários dispositivos e revogação
Não é possível validar todos os JWTs emitidos antes do seu vencimento para implementar a revogação do usuário de todos os dispositivos. Embora seja teoricamente possível revogar a chave de assinatura para tornar o JWT inválido, isso invalidaria todos os JWTs que usam essa chave, e o processo de manipulação de chaves de cache tornaria essa abordagem impraticável para operações simples de revogação de usuário.
Sessões ou JWTs?
As sessões e os JWTs são duas abordagens populares para perseverar o contexto de autenticação e autorização em um mundo HTTP sem estado. Embora ambas as abordagens tenham seus prós e contras, elas oferecem diferentes benefícios e inconvenientes.
As sessões fornecem garantias mais fortes para a autorização de solicitações individuais e são mais simples para implementar de forma segura. No entanto, sua dependência da validação do banco de dados do lado do servidor introduz uma sobrecarga de latência, o que pode impactar negativamente a experiência do usuário em aplicações que necessitam de alta rapidez de resposta.
Os JWTs, por outro lado, têm vantagens para autorizações mais rápidas e interoperabilidade com aplicações externas, mas requerem mais esforço do desenvolvedor para tratar das complexidades de segurança. Por exemplo, podemos usar webhooks para notificar aos clientes quando o acesso do usuário é revogado, de modo que os clientes podem limpar o JWT em cache e forçar o usuário a se reautenticar.
Como a autenticação baseada em tokens é mais adequada para escalar com suas desvantagens ainda gerenciáveis, está sendo adotada por cada vez mais aplicações modernas.
Escolhendo um método adequado
O método que você escolhe depende das necessidades específicas de sua aplicação.
Se a sua aplicação lida com dados sensíveis ou requer revogação rápida, a autenticação baseada em sessão pode ser a melhor escolha.
Se a sua aplicação precisa de autorização rápida e eficiente ou requer mais interação entre o cliente e o servidor, a autenticação baseada em tokens pode ser mais adequada.
Logto, que é uma infraestrutura de gerenciamento de acesso de identidade escalável, fornece uma solução de identidade completa tanto em serviço na nuvem como em versão de fonte aberta.