Português (Brasil)
  • jwt
  • authentication
  • session
  • token
  • revoke jwt

JWT vs Autenticação de Sessão

Aprenda as diferenças entre autenticação baseada em sessão e JWT. Explore compensações, vantagens e casos de uso para escolher o esquema de autenticação adequado para seus aplicativos.

Ran
Ran
Product & Design
Darcy Ye
Darcy Ye
Developer

De modo geral, o primeiro passo para usar um aplicativo é a autenticação, onde o usuário final fornece suas credenciais de identidade para fazer login com sucesso. Após esta etapa, o sistema de identidade (ou seja, fornecedor de identidade, servidor de autenticação, etc.) sabe quem é o usuário e a quais recursos ele tem acesso.

Dado que o HTTP é inerentemente sem estado, cada solicitação em uma sessão é independente e não recupera informações das anteriores. Reautenticar usuários para cada ação é incômodo e prejudica a experiência do usuário.

Vamos entrar na Autenticação baseada em sessão e na autenticação JWT (JSON Web Tokens), dois métodos populares para manter o estado da autenticação. Cada um tem vantagens e desvantagens únicas, e a escolha entre eles depende das necessidades específicas do seu aplicativo. Se você está decidindo entre os dois, este guia está aqui para ajudar.

O que é autenticação baseada em sessão?

A autenticação baseada em sessão depende do servidor para manter um registro do estado de autenticação do usuário. Ao criar e gerenciar sessões, o servidor permite que os usuários permaneçam conectados e continuem interagindo com um aplicativo sem a necessidade de reentrar as credenciais a cada solicitação.

Como funciona a autenticação baseada em sessão?

Criação de sessão

  1. Um usuário autentica e fornece algumas credenciais (por exemplo, e-mail e senha).
  2. Se as credenciais forem válidas, o servidor cria um registro persistente que representa aquela sessão. A sessão contém informações como uma string aleatória, identificador do usuário, hora de início da sessão, hora de expiração da sessão, etc. 
  3. A SessionID é armazenada no banco de dados e retornada ao cliente do usuário como um cookie.

Validação de sessão

  1. O processo pode ser acionado manualmente pelo usuário (por exemplo, clicando em uma guia, atualizando uma página) ou automaticamente pelo cliente (por exemplo, durante cargas iniciais de página ou através de chamadas de API com uma SessionID).
  2. Cada chamada subsequente envia uma solicitação HTTP do cliente contendo o cookie de sessão para o servidor.
  3. O servidor valida o SessionID consultando os dados da sessão armazenados no servidor.
  4. Se for válida, o servidor processa a solicitação e autoriza o usuário.

Como revogar uma sessão?

As sessões podem ser invalidadas em tempo real, o que é útil em situações onde a revogação rápida de acesso é necessária.

  • Usuários fazem logout manualmente: O servidor exclui o registro da sessão, efetivamente desconectando o usuário.
  • Admins forçam logout do usuário: Admins ou sistemas podem encerrar sessões específicas excluindo-as do banco de dados. Por exemplo, durante uma violação de segurança.
  • Expiração de sessões: As sessões podem expirar automaticamente após uma duração definida de inatividade ou um limite de tempo fixo.

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 excluir ou invalidar o registro da sessão, o acesso do usuário pode ser rapidamente revogado.

Desvantagens da autenticação baseada em sessão

  • Latência em sistema distribuído: Manter dados de sessão em vários servidores requer sempre a sincronização de um armazenamento de sessão. Isso introduz latência adicional, pois o servidor precisa verificar o armazenamento de sessão toda vez que uma solicitação é feita.
  • Alto consumo de recursos: Cada sessão consome recursos do servidor, impactando o desempenho à medida que a base de usuários aumenta.
  • Risco de segurança: O sequestro de sessão (através de cookies de sessão roubados) pode permitir acesso não autorizado a contas de usuários.
  • Uso limitado para APIs: A autenticação baseada em sessão não é ótima para aplicativos móveis. Ela armazena dados de sessão no servidor, o que pode aumentar a carga e a complexidade com muitos usuários. Além disso, usa cookies, que são mais difíceis de lidar em dispositivos móveis.

O que é autenticação JWT?

JSON Web Tokens (JWTs) adotam uma abordagem diferente, incorporando todas as informações relevantes do usuário diretamente em um token, usando um objeto JSON. Ao contrário dos métodos baseados em sessão, os JWTs são sem estado, o que significa que o servidor não gerencia registros de autenticação.

Como funciona a autenticação JWT?

Um JWT consiste em três partes: um cabeçalho, um payload e uma assinatura.

  • O cabeçalho contém o algoritmo de assinatura (por exemplo, HS256) e o tipo de token (JWT).
  • O payload contém declarações principais (claims), como identidade do usuário, papel do usuário e tempo de expiração.
  • A assinatura usa uma chave para assinar o cabeçalho e o payload, permitindo a verificação de se a assinatura foi adulterada.

image.png

Emissão de JWT

  1. O cliente envia credenciais de usuário para o servidor de autenticação (um provedor de identidade universal é particularmente benéfico para gerenciar o acesso entre vários domínios).
  2. Após a autenticação com sucesso, o servidor gera um JWT que inclui cabeçalho, payload e assinatura.
  3. O AuthServer envia o token emitido para o Cliente. O cliente armazena o JWT (por exemplo, em cookies, localStorage ou sessionStorage).

Os fluxos de trabalho baseados em sessão seguem um processo semelhante. No entanto, após a autenticação, as informações dos usuários são armazenadas no servidor dentro de uma sessão, enquanto os JWTs confiam nos tokens enviados para o cliente para armazenamento e uso subsequente.

Validação de token

  1. Para solicitações de API subsequentes, o cliente envia o JWT no cabeçalho Authorization (Bearer <token>).
  2. O servidor verifica a assinatura do JWT usando uma chave secreta ou pública e verifica suas declarações (por exemplo, expiração, emissor).
  3. Se o token for válido, o servidor concede ao cliente acesso aos recursos solicitados.

A autenticação baseada em sessão requer que o servidor consulte um armazenamento de sessão, o que pode ser lento, especialmente se depender de bancos de dados externos ou centralizados. Em contraste, a autenticação JWT é sem estado, com todas as informações necessárias armazenadas no token do cliente, utilizando assinatura para garantir a segurança. Isso elimina a necessidade de gerenciamento de sessão, tornando-a mais rápida e escalável, especialmente em sistemas distribuídos.

Como revogar um JWT?

No lado do cliente, sair geralmente significa limpar a sessão local e remover tokens (ID, acesso, token de atualização) do armazenamento. No entanto, para a autenticação JWT, isso apenas desconecta o usuário localmente, deixando a sessão centralizada no servidor de autorização intacta. Como resultado, os usuários ainda podem acessar outros aplicativos na mesma sessão até que o token expire ou seja encerrado manualmente.

Revogar um JWT (JSON Web Token) é mais desafiador do que a autenticação baseada em sessão porque os JWTs são sem estado e não podem ser invalidados uma vez emitidos, a menos que estratégias específicas sejam implementadas. Métodos comuns incluem:

  • Tempos curtos de expiração: Defina uma declaração exp curta (por exemplo, 15 minutos) para o JWT. Uma vez expirado, o usuário deve reautenticar. Isso minimiza o risco se um token for comprometido, pois o invasor só poderá usá-lo por um tempo limitado. Para manter uma experiência contínua do usuário, um token de atualização pode ser usado para minimizar o incômodo de reautenticação.
  • Lista negra de tokens: Para casos críticos (por exemplo, logout do usuário, mudanças de senha), mantenha uma lista negra de tokens revogados. O servidor verifica os tokens recebidos em relação a essa lista de bloqueio e rejeita as correspondências. Embora eficaz, essa abordagem requer o rastreamento de tokens revogados, o que vai contra a natureza sem estado dos JWTs e pode se tornar ineficiente se a lista crescer muito.
  • Endereço de revogação: Introduza um endpoint de revogação no servidor de autorização onde tokens (por exemplo, tokens de atualização) podem ser invalidados. Uma vez que um token de atualização é revogado, qualquer token de acesso emitido a partir dele não será mais renovado. Este método funciona bem em fluxos de OAuth2.

Vantagens da autenticação JWT

  • Rápida e mais informativa: 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. Eles também podem incluir declarações personalizadas (por exemplo, funções de usuário ou outros dados relevantes) dentro do token, permitindo que os servidores determinem funções sem consultar um banco de dados.
  • Alta segurança: Os JWTs usam técnicas de assinatura e criptografia, tornando os ataques mais difíceis.
  • Suporte entre domínios: Os JWTs são perfeitos para Single Sign-On (SSO) e autenticação entre domínios. Eles permitem que os usuários autentiquem entre vários domínios ou serviços com o mesmo token.
  • Amigáveis para dispositivos móveis: Os JWTs funcionam muito bem para aplicativos móveis que precisam de autenticação sem estado. Os tokens podem ser armazenados no lado do cliente e enviados com cada solicitação, melhorando a eficiência e a facilidade de uso.

Desvantagens da autenticação JWT

  • O JWT não é atualizado de forma 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 contiver informações de autorização baseadas em função, o novo escopo de autorização não entrará em vigor até que o antigo JWT 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 múltiplos dispositivos e revogação

    Não é possível validar todos os JWTs emitidos antes que eles expirem para implementar a revogação do usuário em todos os dispositivos. Embora seja teoricamente possível revogar a chave de assinatura para tornar o JWT inválido, isso invalidaria também todos os JWTs que usam essa chave, e o processo de lidar com a chave de cache tornaria esta abordagem impraticável para operações simples de revogação de usuário.

Alguns provedores de identidade podem ter soluções pré-construídas para esses problemas com JWT. Para mais informações, confira "Melhores Práticas para Melhorar a Experiência de Autenticação JWT.”

Qual é a diferença entre JWT e Sessão?

As sessões e os JWTs são duas abordagens populares para persistir contextos de autenticação e autorização em um mundo HTTP sem estado. Embora ambas as abordagens tenham seus prós e contras, elas oferecem benefícios e desvantagens diferentes.

As sessões fornecem garantias mais fortes para a autorização de solicitações individuais e são mais simples de implementar com segurança. No entanto, sua dependência da validação de banco de dados do lado do servidor introduz latência, o que pode impactar negativamente a experiência do usuário para aplicativos altamente responsivos.

Os JWTs, por outro lado, são vantajosos para autorização mais rápida e interoperabilidade com aplicativos externos, mas exigem mais esforço do desenvolvedor para lidar com complexidades de segurança. Por exemplo, podemos usar webhooks para notificar clientes quando o acesso do usuário é revogado, para que os clientes possam limpar o JWT em cache e forçar o usuário a reautenticar.

Como a autenticação baseada em token é mais adequada para escalar, com desvantagens que ainda podem ser gerenciáveis, ela está sendo adotada por mais e mais aplicativos modernos.

Sessão vs. JWT: Escolhendo o método certo

Seu método de autenticação deve corresponder à arquitetura do seu aplicativo e às necessidades específicas. Aqui está um guia rápido para ajudá-lo a decidir:

Quando usar autenticação baseada em sessão

A autenticação baseada em sessão funciona melhor quando você precisa de controle de sessão em tempo real, precisa de gerenciamento centralizado ou a escalabilidade não é uma grande preocupação. Aqui está onde ela se destaca:

  • Aplicativos web com sessões persistentes

    Para plataformas como sites de compras online, as sessões são essenciais para rastrear usuários, carrinhos de compras e preferências durante sua visita.

  • Aplicativos que necessitam de controle de sessão em tempo real

    Aplicativos como serviços bancários ou financeiros se beneficiam dos dados de sessão controlados pelo servidor, garantindo gerenciamento robusto de acesso e segurança.

  • Sistemas de servidor único ou de pequena escala

    Ferramentas internas ou aplicativos de pequena escala sem grandes necessidades de escalabilidade prosperam na gestão simples de sessões pela facilidade de uso e confiabilidade.

Quando usar autenticação JWT

A autenticação JWT é melhor adequada para aplicativos que priorizam escalabilidade, eficiência e sistemas distribuídos. É particularmente útil para interações sem estado entre clientes e servidores. Considere a autenticação baseada em token para os seguintes casos:

  • Single Sign-On (SSO)

    Os JWTs são perfeitos para Single Sign-On, permitindo que os usuários autentiquem uma vez e acessem sem problemas vários serviços ou aplicativos usando o mesmo token. Compartilhe uma explicação detalhada sobre aplicativos baseados em nuvem seguros usando OAuth 2.0 e OIDC, com formato JWT para ambos tokens de acesso e tokens de ID.

  • Aplicativos móveis

    Aplicativos móveis geralmente preferem JWTs para autenticação, uma vez que tokens podem ser armazenados com segurança no dispositivo e enviados com cada solicitação de API. Explore a integração rápida da autenticação JWT para Android / iOS.

  • Arquiteturas de microsserviços

    Em ambientes de microsserviços, os JWTs permitem que cada serviço valide independentemente o token sem depender de um armazenamento de sessão central, garantindo escalabilidade e eficiência.

  • Autenticação entre domínios

    Os JWTs se destacam em cenários que envolvem múltiplos domínios ou subdomínios (por exemplo, api.example.com, dashboard.example.com e docs.example.com). Ao contrário dos cookies, os JWTs permitem autenticação entre domínios sem dependências adicionais.

  • APIs e serviços web

    APIs RESTful e serviços web comumente usam JWTs para autenticação porque são leves, portáteis e eliminam a necessidade de gerenciamento de sessão no servidor. Saiba mais sobre autenticação máquina a máquina para cenários em que seu aplicativo precisa se comunicar diretamente com recursos.

Melhores práticas para melhorar a experiência da autenticação JWT

A autenticação JWT é uma excelente ferramenta, mas pode apresentar desafios que afetam a experiência do usuário. O Logto oferece uma solução fácil e confiável para superar esses obstáculos, tornando-se uma escolha superior para autenticação segura e eficiente.

Lidando com problemas de saída do usuário com JWT

Um problema comum com a autenticação JWT é garantir uma experiência de saída de usuário adequada. O Logto simplifica esse processo com seu SDK pronto para uso.

  • Ao limpar tokens e sessões locais no lado do cliente e redirecionar os usuários para o endpoint de encerramento de sessão do Logto, você pode facilmente encerrar sessões tanto no aplicativo cliente quanto no servidor.
  • Além disso, o Logto suporta back-channel logout, permitindo que o Servidor de Autenticação notifique todos os aplicativos clientes compartilhando a mesma sessão quando um usuário faz logout.

Isso garante um gerenciamento consistente e seguro de sessões em todo o seu ecossistema. Saiba mais sobre mecanismos de saída e como implementar saída.

Lidando com mudanças de permissões de usuário

Gerenciar alterações em tempo real nas permissões do usuário com JWT também pode ser complicado. Como os JWTs são sem estado por design, quaisquer permissões ou funções atualizadas podem não entrar em vigor até que o token expire. O Logto oferece estratégias para lidar com isso de forma eficaz:

  • Para diminuir permissões para este usuário: Use tempos curtos de expiração para tokens de acesso ou verifique dinamicamente permissões através de uma chamada de API.
  • Para adicionar novas permissões para este usuário: Atualize o Servidor de Autenticação para incluir o novo escopo de permissões e reconformar os usuários para aplicar essas mudanças.

Essas soluções ajudam a manter as permissões atualizadas e garantem um sistema mais seguro e responsivo. Saiba mais sobre gerenciar alterações em tempo real nas permissões do usuário.

O Logto, que é uma infraestrutura escalável de gestão de acesso a identidades, oferece uma solução completa de identidade com serviço na nuvem e versão de código aberto.