Português (Brasil)
  • 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 um framework central para serviços de autorização, uma das principais responsabilidades do OAuth 2.0 é emitir tokens de acesso para os usuários. Notamos que muitos provedores de serviço OAuth no mercado emitem tokens de acesso no formato JWT.

Neste artigo, vamos apresentar o que é JWT e por que é extensivamente 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 declarações a serem transferidas entre duas partes.

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

Porque 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, corpo e assinatura.

Aqui está um exemplo de um JWT do mundo real:

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

Decodificar JWT no jwt.io

Conforme mostrado na imagem, a seção cabeçalho do JWT contém informações sobre o algoritmo de assinatura usado e o tipo do token. A seção corpo contém as declarações transportadas pelo JWT, e a assinatura é usada para verificar a integridade do JWT.

Agora que entendemos o que é JWT e os significados 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 cadeias aleatórias são que os JWTs podem carregar informações e podem ser validados por meio 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 da gestão de estado do lado do servidor. Isso permite que os serviços sejam mais sem estado, aumentando sua disponibilidade e escalabilidade.

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

Conforme mostrado no diagrama, quando um sistema tem inúmeros usuários e muitos Servidores de Recursos diferentes, isso 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 para a 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 da 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 a 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.

Corpo facilmente espionado

Como mencionado anteriormente, um JWT consiste em três partes: o cabeçalho, corpo e assinatura. Como essas componentes são geradas? 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 o corpo do JWT são simplesmente codificados como strings base64.

Isso significa que, contanto que alguém tenha acesso ao token, pode facilmente decodificar a string base64 do corpo do JWT e acessar as informações que ele carrega. Por outro lado, é também relativamente fácil forjar um corpo e substituir o corpo original do JWT por um manipulado.

Embora seja verdade que o corpo de um JWT pode ser relativamente fácil de forjar, é importante notar que a parte da assinatura do JWT não pode ser substituída por conteúdo forjado, pois exige a chave secreta de assinatura. Portanto, sem a assinatura correta, o JWT não pode passar pela validação.

Assim, ao usar JWTs, é importante ter em mente as seguintes considerações:

  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 no corpo do JWT. O corpo pode ser facilmente decodificado, conforme mencionado anteriormente, e deve conter principalmente declarações relevantes e não sensíveis.
  3. Valide os JWTs: Antes de confiar nas informações contidas em um JWT, assegure-se de que ele passou por um processo de validação válido e seguro, incluindo a verificação da assinatura e checagem da expiração do token. Isso ajuda a prevenir o uso de tokens adulterados 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 ao fato de conterem informações de expiração dentro de si mesmos, e ao fato de que a validação de JWTs 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.

Depois que um token JWT expira 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 muda sua senha, e você precisa 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 de token no meio do caminho:

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

Como o token de acesso tem um tempo de expiração mais curto, quando um usuário descobre que o token de acesso expirou, ele pode solicitar um novo token de acesso por meio de um token de atualização do serviço de autorização. Dessa forma, o status do token no lado do usuário pode ser sincronizado com o backend o mais rápido possível. No entanto, essa abordagem vem com uma sobrecarga adicional, que os usuários precisam considerar.

  1. Manter uma lista de revogação para tokens de acesso e verificar 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 necessita de 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 token precisa ser implementado por desenvolvedores de uma maneira que seja adequada para seu caso de uso específico.

Resumo

Neste artigo, fornecemos uma breve introdução ao JWT, destacando suas vantagens e limitações. 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 ele traz quando usado como o formato de token em 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 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 aos seus produtos. O Logto lançou oficialmente seu serviço SaaS, e você pode experimentá-lo gratuitamente hoje.