Português (Portugal)
  • auth
  • authentication
  • oauth
  • oidc
  • identity

Por que JWT na maioria dos serviços OAuth 2.0

Este artigo explica por que o JWT é amplamente adotado como formato para tokens de acesso no OAuth 2.0, destacando seus benefícios e limitações.

Yijun
Yijun
Developer

OAuth 2.0 é amplamente utilizado hoje. Como uma estrutura central para serviços de autorização, uma das principais responsabilidades do OAuth 2.0 é emitir tokens de acesso para usuários. Notamos que muitos provedores de serviços OAuth no mercado emitem tokens de acesso no formato JWT.

Neste artigo, vamos introduzir o que é JWT e por que é amplamente adotado como formato para tokens de acesso emitidos pelo OAuth 2.0.

Introdução ao JWT

JWT significa JSON Web Token, e é definido pelo RFC 7519 da seguinte forma:

JSON Web Token (JWT) é um meio compacto e seguro para representar reivindicações a serem transferidas entre duas partes.

Esta definição deixa claro que o JWT é um token usado para passar reivindicações entre diferentes partes.

Como os JWTs são passados entre várias partes, eles são assinados para garantir a integridade e a autenticidade dos dados.

Um JWT assinado tem o seguinte formato:

Consiste em três partes separadas por .: o cabeçalho, a carga útil e a assinatura.

Aqui está um exemplo de um JWT em um cenário real:

Você pode tentar analisá-lo em https://jwt.io:

Decode JWT in jwt.io

Como mostrado na imagem, a seção header do JWT contém informações sobre o algoritmo de assinatura utilizado e o tipo do token. A seção payload contém as reivindicações transportadas pelo JWT, e a signature é usada para verificar a integridade do JWT.

Agora que entendemos o que é JWT e o significado de suas diferentes partes, vamos prosseguir para explicar por que muitos serviços de autorização OAuth escolhem o JWT como seu token de acesso.

Benefícios do uso de JWT

As principais distinções entre JWT e tokens tradicionais baseados em strings aleatórias são que os JWTs podem carregar informações e podem ser validados através de decodificação. Essas diferenças trazem duas vantagens significativas:

  • Eficiência de Recursos: Os JWTs podem carregar informações sobre o usuário ou sessão, eliminando a necessidade de consultas frequentes ao banco de dados. Essa eficiência pode reduzir o consumo de recursos dos serviços.
  • Melhor Disponibilidade e Escalabilidade: Os JWTs reduzem a dependência de gerenciamento de estado no servidor. Isso permite que os serviços sejam mais sem estado, aprimorando sua disponibilidade e escalabilidade.

Ao usar tokens tradicionais baseados em strings aleatórias, o processo típico para verificação e autenticação é o seguinte:

Como mostrado no diagrama, quando um sistema tem numerosos usuários e muitos servidores de recursos diferentes, pode resultar em inúmeras solicitações de validação de token para o servidor de autenticação.

Com o tempo, à medida que o sistema cresce, o servidor de autenticação pode facilmente se tornar um gargalo, representando um desafio à disponibilidade geral do serviço.

No entanto, quando os JWTs são introduzidos, o processo de validação muda para:

Graças à característica dos JWTs que permite a validação através de decodificação, o servidor de recursos pode verificar a integridade dos JWTs e extrair informações do usuário deles sem a necessidade de interagir com o servidor de autenticação (Para detalhes sobre decodificação e validação de JWTs, você pode consultar a documentação do Logto).

Limitações do JWT

Embora os JWTs ofereçam vantagens significativas nas arquiteturas de software modernas, eles também têm limitações a serem consideradas.

Carga útil facilmente interceptada

Como mencionado anteriormente, um JWT consiste em três partes: header, payload, e signature. Como esses componentes são gerados? Vamos pegar o JWT do exemplo anterior e demonstrar o processo de geração do JWT:

Como mostrado no código acima, o cabeçalho e a carga útil do JWT são simplesmente codificados como strings base64.

Isso significa que, desde que alguém tenha acesso ao token, pode facilmente decodificar a string base64 da carga útil do JWT e acessar as informações que ela carrega. Por outro lado, também é relativamente fácil forjar uma carga útil e substituir a carga original do JWT por uma manipulada.

Embora seja verdade que a carga útil de um JWT possa ser relativamente facilmente forjada, é importante notar que a parte da assinatura do JWT não pode ser substituída por conteúdo falsificado, pois requer a chave de assinatura secreta. Portanto, sem a assinatura correta, o JWT não pode passar pela validação.

Portanto, ao usar JWTs, é importante manter as seguintes considerações em mente:

  1. Sempre use SSL: Para garantir que as informações do JWT não sejam vazadas durante a transmissão, é essencial usar SSL (Secure Sockets Layer) ou seu sucessor, TLS (Transport Layer Security), para criptografar os dados em trânsito.
  2. Evite armazenar dados sensíveis: Não é recomendado armazenar dados sensíveis na carga útil do JWT. A carga útil pode ser facilmente decodificada, como mencionado anteriormente, e deve conter principalmente reivindicações não sensíveis e relevantes.
  3. Valide os JWTs: Antes de confiar nas informações contidas em um JWT, certifique-se de que ele passou por um processo de validação válido e seguro, incluindo a verificação da assinatura e a verificação de expiração do token. Isso ajuda a prevenir o uso de tokens manipulados ou não autorizados.

Difícil de revogar

Em geral, os tokens de acesso geralmente têm um tempo de expiração. Se o token de acesso for representado como strings aleatórias sem qualquer informação, podemos verificar se o token foi revogado durante cada validação no servidor de autenticação.

Quanto aos JWTs, devido aos JWTs conterem informações de expiração dentro deles, e o fato de que a validação do JWT não depende do servidor de autenticação, uma vez que um servidor de autenticação emite um token de acesso no formato JWT, torna-se impossível mudar o estado do token durante seu uso.

Após um token JWT expirar naturalmente, podemos obter um novo JWT do servidor de autorização usando um token de atualização (você pode consultar o blog do Logto para informações sobre tokens de atualização).

No entanto, em certas situações, como quando um usuário revoga a autorização ou altera a senha, e é necessário revogar um token já emitido mas ainda não expirado, não há uma solução direta disponível.

Existem duas abordagens comuns para mitigar o impacto da revogação do token no meio do caminho:

  1. Defina um tempo de expiração mais curto para o token de acesso e confie no mecanismo de atualização do token para atualizar rapidamente o status do token.

Porque o token de acesso tem um tempo de expiração mais curto, quando um usuário descobre que o token de acesso expirou, pode solicitar um novo token de acesso através de um token de atualização do serviço de autorização. Desta forma, o status do token no lado do usuário pode se sincronizar com o backend o mais rápido possível. No entanto, esta abordagem traz uma sobrecarga adicional, que os usuários precisam considerar.

  1. Mantenha uma lista de revogação para tokens de acesso e verifique se o token está na lista durante cada validação.

Este método tem certas limitações. Uma das vantagens do JWT é que ele não requer que o servidor armazene informações de estado, e os JWTs são tipicamente sem estado. No entanto, manter uma lista de revogação requer armazenamento e manutenção eficazes, dependendo de mecanismos de armazenamento adicionais. Isso essencialmente sacrifica as vantagens do JWT e pode potencialmente levar a problemas de desempenho. Portanto, o mecanismo de revogação de tokens precisa ser implementado por desenvolvedores de uma maneira adequada ao seu caso de uso específico.

Resumo

Neste artigo, fornecemos uma breve introdução ao JWT, destacando suas vantagens e limitações. Até agora, você deve ter uma compreensão mais profunda do JWT e dos cenários em que é comumente usado. Embora o JWT tenha seus desafios, os benefícios que traz quando usado como o formato de token nos serviços OAuth 2.0 superam em muito suas desvantagens.

Logto, como um serviço de autenticação de identidade em rápido crescimento, também emprega JWT como o formato para seus tokens de acesso. Ele segue rigorosamente vários protocolos de autorização e autenticação, tornando excepcionalmente fácil integrar serviços de autenticação de identidade nos seus produtos. Logto lançou oficialmente seu serviço SaaS, e você pode experimentá-lo gratuitamente hoje.