O que é jwt?

JWT (JSON Web Token): Uma Visão Geral

JWT (JSON Web Token) é um padrão aberto da indústria (RFC 7519) que define uma forma compacta e auto-contida para transmitir informações com segurança como um objeto JSON. Essa informação pode ser verificada e confiável porque é assinada digitalmente. JWTs podem ser assinados usando um segredo (com o algoritmo HMAC) ou um par de chaves pública/privada usando RSA ou ECDSA.

Como funciona:

Um JWT é composto por três partes separadas por pontos (.):

  1. Cabeçalho (Header): Define o tipo do token (JWT) e o algoritmo de assinatura usado (e.g., HS256, RSA). É codificado em Base64Url.

  2. Payload (Carga Útil): Contém as claims (afirmações). Claims são declarações sobre uma entidade (tipicamente o usuário) e metadados adicionais. Existem três tipos de claims:

    • Claims Registradas: São um conjunto de claims predefinidas pelo IANA (Internet Assigned Numbers Authority), como iss (issuer - emissor), exp (expiration time - tempo de expiração), sub (subject - sujeito), aud (audience - audiência), etc.
    • Claims Públicas: São claims definidas pelos usuários, mas devem ser registradas no IANA para evitar colisões.
    • Claims Privadas: São claims personalizadas para compartilhar informações entre as partes envolvidas.

    O payload também é codificado em Base64Url.

  3. Assinatura (Signature): É calculada a partir do cabeçalho codificado em Base64Url, o payload codificado em Base64Url, um segredo ou chave privada e o algoritmo especificado no cabeçalho. A assinatura garante que o JWT não foi alterado em trânsito e que a origem do token é autêntica.

Formato Geral:

xxxxx.yyyyy.zzzzz

Onde:

  • xxxxx representa o cabeçalho codificado em Base64Url.
  • yyyyy representa o payload codificado em Base64Url.
  • zzzzz representa a assinatura.

Usos Comuns:

  • Autenticação: Este é o cenário de uso mais comum para JWT. Uma vez que o usuário está logado, cada solicitação subsequente incluirá o JWT, permitindo que o usuário acesse rotas, serviços e recursos permitidos com esse token. Essa abordagem evita a necessidade de enviar credenciais (nome de usuário e senha) a cada requisição e elimina a dependência de cookies de sessão. Veja mais em: Autenticação.

  • Autorização: Uma vez que o usuário está autenticado, o JWT pode ser usado para determinar a quais recursos e operações o usuário tem acesso. O payload do JWT pode conter informações sobre as permissões do usuário. Veja mais em: Autorização.

  • Troca Segura de Informações: JWTs podem ser usados para trocar informações com segurança entre partes, pois o token é assinado e pode ser verificado.

Vantagens do JWT:

  • Simples e Compacto: O formato JWT é leve e fácil de usar.
  • Auto-contido: O JWT contém todas as informações necessárias no próprio token.
  • Escalável: Como o estado não é armazenado no servidor, o JWT é escalável.
  • Seguro: A assinatura garante a integridade do token.
  • Pode ser usado em várias linguagens e plataformas: Existem bibliotecas JWT disponíveis para diversas linguagens de programação.

Considerações de Segurança:

  • Armazenamento Seguro: Armazene o JWT com segurança no cliente. O Local Storage não é recomendado para dados sensíveis. Use mecanismos mais seguros, como HTTP-only cookies ou APIs de armazenamento dedicadas.
  • Tempo de Expiração: Defina um tempo de expiração razoável para o JWT. Isso limita o período de tempo durante o qual um token comprometido pode ser usado. Veja mais em: Tempo%20de%20Expiração.
  • Revogação de Tokens: Implemente um mecanismo para revogar tokens em caso de comprometimento ou logout do usuário. Listas de revogação (blacklists) ou refreshtokens podem ser usados para isso.
  • Validação Rigorosa: Valide rigorosamente o JWT no servidor antes de permitir o acesso a recursos protegidos. Verifique a assinatura, o tempo de expiração e outras claims relevantes.
  • Proteção contra ataques: Implemente medidas para proteger contra ataques comuns, como ataques de replay, ataques de falsificação entre sites (CSRF) e ataques de injeção.
  • Cuidado com o Payload: Não armazene informações sensíveis e confidenciais no payload do JWT, pois ele é facilmente decodificado.

Algoritmos de Assinatura:

  • HS256 (HMAC SHA256): Usa uma chave secreta para assinar e verificar o token. É um algoritmo simétrico.
  • RS256 (RSA SHA256): Usa um par de chaves pública/privada para assinar e verificar o token. A chave privada é usada para assinar o token, e a chave pública é usada para verificar a assinatura. É um algoritmo assimétrico.
  • ES256 (ECDSA P-256): Utiliza o algoritmo de assinatura digital de curva elíptica (ECDSA) com a curva P-256 e SHA-256. É também um algoritmo assimétrico.