English
  • jwt
  • authentication
  • session
  • session-based
  • token-based

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.

Darcy Ye
Darcy Ye
Developer

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.