< Insights

JWT: Prós e contras da sua utilização.

  • Desenvolvimento de Software
  • Artigo

O JWT é uma das soluções de autenticação e autorização que podem ser utilizadas na programação. Entenda como ele funciona, os prós e contras da sua utilização e aprenda um pouco mais.

Autenticação e autorização

Diversas aplicações exigem controle de acesso, desde o seu email até o aplicativo do seu banco. Para executar esse controle de acesso dois passos são fundamentais:

  • A autenticação, que é identificar quem está tentando acessar uma aplicação ou recurso. 
  • A autorização, que é verificar se a pessoa autorizada tem acesso a um recurso específico.

O JWT tem como objetivo fornecer uma opção de solução para autenticação e autorização.

O que é JWT?

O JWT (JSON Web Token), em inglês tem a pronúncia de “jot”, é um padrão aberto especificado pelo RFC 7519, que define uma forma compacta e independente de transmitir informações com segurança entre duas partes utilizando o formato JSON. 

Para que haja confiabilidade nas informações trafegadas, elas são assinadas utilizando pares de chaves pública/privada. Em alguns casos, pode existir a necessidade da transmissão dos dados ser sigilosa. Nestes casos é possível que o token seja criptografado.

Como funciona?

O primeiro passo no fluxo de utilização é o cliente fazer uma requisição de token ao servidor responsável, passando os dados necessários para autenticação como usuário e senha.

Caso o usuário exista e a senha esteja correta, o servidor retorna o token.

De posse do token, o cliente deve enviá-lo em todas as requisições de recurso da aplicação. Desta forma, o servidor consegue identificar o usuário.

Estrutura de um JWT

O JWT é formado por três blocos de informações:

Header

O cabeçalho é composto por “alg”, que indica o algoritmo de hash utilizado (por exemplo o “HS256”) e por “typ”, que indica o tipo de token (neste caso o “JWT”).

{
  “alg”: “HS256”,
  “typ”: “JWT”
}

Payload

O corpo do token é aberto e pode ser utilizado para adicionar qualquer informação relevante a autenticação e autorização. No entanto, a RFC 7519 define o padrão de algumas claims que podem ser utilizadas de maneira opcional.

  • “iss” – Issuer (Emissor)
    Responsável pela emissão do token.
  • “sub” – Subject (Sujeito)

A quem pertence o token

  • “aud” – Audience (Destinatário)

Aplicação que irá utilizar o token

  • “exp” – Expiration Time (Tempo de expiração)

Data de validade do token

  • “nbf” – Not Before (Não antes)

Data de início de validade do token, antes dela o token não deve ser aceito

  • “iat” – Issued At (Emitido em)

Data de emissão do token

  • “jti” – JWT ID

Identificador único do token

{
  “sub”: “1234567890”,
  “name”: “John Doe”,
  “iat”: 1516239022
}
  • Assinatura

A assinatura é composta pelo hash do header, payload e chave secreta utilizada pela aplicação. Isto posto, a assinatura de cada token é única.

HMACSHA256(
  base64UrlEncode(header) + “.” +
  base64UrlEncode(payload),
  sua-chave-secreta-256-bit
)

Prós e contras do JWT

Prós:

  • Não há necessidade de manutenção de estado, ou em inglês, stateless. Toda a informação necessária para autenticação e autorização está contida no token, desta forma, não importa para qual servidor da aplicação a requisição chegue, ela será atendida. Isso torna a escalabilidade da aplicação muito mais simples.
  • Como o JWT é stateless, não precisamos nos preocupar com ataques de Cross-site Request Forgery (CSRF), pois não há uma sessão para ser falsificada. No entanto, sempre que for necessário transacionar informações sensíveis, é recomendado criptografar o token utilizando JWE e trafegar os dados sempre via HTTPS. Isso impedirá ataques de man-in-the-middle
  • Com o JWT, conseguimos escalar em performance. Devido a não existência de sessão, o servidor necessita apenas calcular o hash, evitando fazer qualquer tipo de busca em bases ou tabelas.
  • É possível ter diversos servidores rodando em domínios diferentes e todos utilizando o mesmo token.

Contras:

  • A segurança do JWT está baseada na sua chave secreta. Se por qualquer motivo essa chave for exposta, alguém mal intencionado poderá acessar todos os dados da aplicação.
  • Como todas as requisições devem conter o token de validação, isso pode causar um aumento desnecessário no tamanho dos pacotes transmitidos. 
  • Como não existe uma sessão, não é possível realizar um logout de outro dispositivo.

Conclusão

O JWT é uma ferramenta amplamente utilizada no mercado e é uma excelente opção para API’s e soluções de Single Sign On. Se bem configurada, cumpre seu papel com maestria.

Cadastre-se em nossa newsletter para receber mais conteúdos exclusivos sobre o universo de desenvolvimento!

Insights do nosso time

Obtenha insights do nosso time de especialistas sobre metodologias de desenvolvimento de software, linguagens, tecnologia e muito mais para apoiar o seu time na operação e estratégia de negócio.