Segurança Nathan Geeksman

JWT do jeito certo: erros comuns de implementação e como evitar

JWT do jeito certo: erros comuns de implementação e como evitar

JWT do jeito certo: erros comuns de implementação e como evitar

Introdução

JSON Web Tokens (JWT) são uma tecnologia amplamente utilizada para autenticação e autorização em sistemas web modernos. Embora seja um mecanismo robusto, a implementação de JWT pode ser complicada e fácil alvo de erros comuns que comprometem a segurança do sistema. Com a crescente popularidade da arquitetura API-first e o uso intensivo de serviços de autenticação como OAuth e OpenID Connect, os desenvolvedores estão cada vez mais expostos à necessidade de lidar corretamente com JWT.

Neste artigo, vamos abordar as principais falhas na implementação de JWT que podem ser encontradas em projetos reais. Vamos explorar a importância da segurança e como evitar esses erros ao trabalhar com tokens JWT, fornecendo orientações práticas para garantir que os sistemas desenvolvidos estejam seguros contra ataques relacionados à autenticação. Ao final desta leitura, você terá uma compreensão sólida sobre como implementar JWT corretamente, minimizando assim os riscos associados a falhas de segurança comuns em sistemas que usam tokens JWT para autenticar e autorizar acessos.

O que é e por que importa

JSON Web Tokens (JWT) são uma forma de transferir informações seguras entre sistemas ou serviços web, usando um token digital compacto e legível que contém metadados sobre a identidade do usuário ou sistema em questão. Este token é assinado com uma chave secreta pelo emissor (geralmente o servidor) e pode ser facilmente verificado por outros sistemas que possuam a mesma chave pública.

A tecnologia JWT foi desenvolvida para fornecer uma solução leve, escalável e independentemente de plataforma para transferir informações confidenciais entre serviços. O uso de tokens JWT está disseminado principalmente em arquiteturas baseadas em APIs (API-first), onde a autenticação e autorização precisam ser efetuadas de forma transparente e segura.

Os principais benefícios do uso de JWT incluem:

  • Transferência de informações entre sistemas de forma segura.
  • Escalabilidade: os tokens podem ser gerados em escala, facilitando a implementação em ambientes com grande volume de usuário.
  • Independência da plataforma: pois não depende de bibliotecas ou frameworks específicos.
  • Facilidade na verificação da autenticidade, pois é realizada apenas pela comparação do token assinado com o seu conteúdo desenhado.

No entanto, a implementação incorreta de JWT pode levar a problemas significativos, como tokens falsificados e acesso não autorizado. É fundamental entender como evitar esses erros para garantir a segurança dos sistemas que usam tokens JWT para autenticar e autorizar acessos.

Como funciona na prática

Um token JWT é composto por três partes principais: cabecalho, payload e assinatura. Cada parte tem um papel importante no processo de autenticação e autorização.

  • Cabecalho: especifica o algoritmo utilizado para assinatura (HMAC SHA256, por exemplo) e a versão do token JWT.
  • Payload: contém as informações relevantes sobre a identidade do usuário ou sistema, como iss (emissor), sub (sujeito), aud (audiência) e exp (data de expiração). O payload também inclui metadados sobre a permissão, como role (função) e scope (âmbito).
  • Assinatura: é calculada pela aplicação do algoritmo especificado no cabecalho à combinação do cabeçalho e do payload. A assinatura é gerada usando a chave secreta do emissor, garantindo que as informações dentro do token não tenham sido alteradas durante sua transmissão.

A geração de um token JWT pode ser vista como uma série de etapas:

  1. Requisição ao servidor: o cliente (usuário) realiza uma requisição para a API solicitando autenticação.
  2. Verificação e autenticação: o servidor verifica as credenciais do usuário e, se validas, gera um payload com as informações pertinentes à identidade do usuário.
  3. Geração do token JWT: usando a chave secreta do emissor, o servidor gera a assinatura para o token, combinando-a com o cabeçalho e o payload gerados anteriormente.
  4. Retorno do token ao cliente: o servidor retorna o token JWT compactado como resposta à requisição do usuário.
  5. Uso pelo cliente: o usuário pode então usar este token em suas solicitações subsequentes para a API, incluindo autenticação e autorização.

A validação do token JWT é feita de forma independente por outros sistemas que possuem a chave pública correspondente à chave secreta utilizada no processo de geração do token. Isto garante a integridade das informações contidas no token, evitando alterações ou falsificações.

Exemplo real

Aqui está um exemplo de implementação de JWT utilizando a linguagem Python e a biblioteca PyJWT:

import jwt
from datetime import datetime, timedelta

SECRET_KEY = "minha_chave_secreta"
ALGORITHM = "HS256"

def gera_token(usuario):
    payload = {
        "sub": usuario["id"],
        "aud": "meu_app",
        "exp": datetime.utcnow() + timedelta(minutes=30)
    }
    
    return jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM)

def valida_token(token):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        return True
    except jwt.ExpiredSignatureError:
        print("Token expirado")
        return False
    except jwt.InvalidTokenError:
        print("Token inválido")
        return False

usuario = {"id": 1, "nome": "João"}
token = gera_token(usuario)
print(f"Token gerado: {token}")

valido = valida_token(token)
print(f"Token válido: {valido}")

Este exemplo demonstra a geração e validação de um token JWT utilizando a chave secreta SECRET_KEY. A função gera_token cria o payload com as informações do usuário e gera a assinatura usando a chave secreta. A função valida_token verifica se o token é válido, verificando se a assinatura está correta e se o token não expirou.

Boas práticas

Uso de bibliotecas seguras e atualizadas

  • Utilizar bibliotecas de autenticação como PyJWT ou outras que estejam atualizadas e com suporte oficial.
  • Verificar se a biblioteca está apta para uso em produção, seguindo os padrões de segurança da linguagem.

Configuração de parâmetros de segurança

  • Definir o algoritmo de assinatura (ALGORITHM) como HS256 ou outro que seja seguro e suportado pela biblioteca.
  • Utilizar um conjunto de caracteres de chave secreta (SECRET_KEY) robusto e difícil de ser adivinhado.
  • Configurar a validação de tokens com expiração (exp) para evitar tokens vazios.

Armadilhas comuns

Uso de chaves públicas compartilhadas entre sistemas

  • Evitar compartilhar chaves púbicas diretamente, pois isso pode permitir que um sistema forje tokens do outro.
  • Utilizar o protocolo de assinatura HS256 para evitar problemas relacionados a chaves públicas.

Falta de validação de tokens em produção

  • Certificar-se de que a validação de tokens está configurada corretamente, com a chave secreta e algoritmo de assinatura corretos.
  • Verificar se a biblioteca de autenticação está configurada para não permitir tokens vazios ou expirados.

Conclusão

Implementar JWT de forma segura exige atenção a detalhes, como usar bibliotecas atualizadas e configurá-las corretamente para evitar armadilhas comuns. A chave secreta deve ser robusta e difícil de ser adivinhada, e tokens vazios ou expirados devem ser invalidados na produção. Para aprofundar conhecimentos em autenticação e segurança, é recomendável explorar tópicos como protocolos de autenticação adicionais, como OAuth 2.0, e considerações de desempenho para grandes volumes de requisições.

Referências

  • JSON Web Token (JWT) - RFC 7519. Disponível em: https://datatracker.ietf.org/doc/html/rfc7519. Acesso: 2024.
  • MDN Web Docs - JSON Web Tokens (JWT). Disponível em: <https://developer.mozilla.org/pt-BR/docs/Web/Security/JSON_Web_Tokens>. Acesso: 2024.
  • OWASP Authentication Cheat Sheet - JSON Web Token (JWT). Disponível em: https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html#json-web-token-jwt. Acesso: 2024.
  • Martin Fowler - Patterns of Enterprise Application Architecture. Disponível em: https://martinfowler.com/eaaCatalog/repository.html. Acesso: 2024.
  • OWASP - Authentication Cheat Sheet. Disponível em: https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html. Acesso: 2024.