JWT: Prós e contras da sua utilização.
- AI-DLC e pAIr
- 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!