banner
Lar / Notícias / Tokens JSON Web (JWT): chaves para usá-los com segurança
Notícias

Tokens JSON Web (JWT): chaves para usá-los com segurança

Jul 13, 2023Jul 13, 2023

Há algumas semanas alguns colegas de desenvolvimento nos transmitiram sua preocupação sobre a geração de JSON Web Tokens (JWT) que estavam fazendo como parte da integração de uma nova ferramenta. Eles ouviram falar de “alguns” problemas de segurança e queriam que os ajudássemos a validar se os tokens emitidos estavam corretos e atendiam a alguns requisitos básicos de segurança.

Atualmente estamos trabalhando em um projeto que auxilia na automatização de testes de segurança, o APICheck, que publicamos recentemente como 'código aberto'. APICheck consiste em um conjunto de pequenas ferramentas que podem ser interligadas através de pipes para poder encadear a execução de diferentes testes em solicitações a APIs, então começamos a trabalhar com a geração de uma ferramenta que nos permitiria validar os tokens que eles emitiram , jwt -checker, no qual implementamos a possibilidade de passar as validações que comentaremos nos tokens. Posteriormente mostrarei um exemplo de teste utilizando a ferramenta.

JWT (JSON Web Token) é um padrão aberto (publicado na RFC 7519) que define um método compacto e independente para encapsular e compartilhar declarações sobre um assunto de forma segura entre diferentes partes usando objetos JSON. O conteúdo do token pode ser confiável e verificado quando é assinado digitalmente (JWS, RFC 7515). A assinatura pode ser gerada usando chaves simétricas (HMAC) ou chaves assimétricas (RSA ou ECDSA). Adicionalmente, os JWTs também podem conter dados criptografados (JWE, RFC 7516) para proteger dados sensíveis, embora este tipo de tokens não seja objeto deste estudo.

É importante observar que, por padrão, os tokens não são criptografados e que a string que vemos é simplesmente uma serialização usando a codificação base64url, que pode ser facilmente decodificada para ver o conteúdo JSON do token de forma clara.

A resposta então à pergunta inicial é ‘depende...’. Tal como acontece com muitas outras tecnologias, o JWT depende muito da configuração utilizada na geração e do uso e validação adequados dos tokens no consumo.

JWT (JSON Web Token) é um padrão aberto que define um método compacto e independente para encapsular e compartilhar com segurança asserções sobre uma entidade entre diferentes partes usando objetos JSON.

Começaremos vendo quais são os principais tipos de tokens e os principais casos de uso:

O JWT permite a troca segura de dados entre as partes de forma mais eficiente do que outros padrões (SAML) devido ao seu tamanho menor, tornando-o ideal para os seguintes casos de uso:

Cada caso de uso possui um destinatário diferente (aplicação cliente e serviço API), mas caso seja exercido controle simultâneo sobre ambos, um único token poderá ser utilizado para ambos os casos.

A seguir listaremos as melhores práticas ao trabalhar com JWT, focando apenas em sua geração e validação.

Com muito poucas exceções (para uso no lado do cliente para transportar informações e dados da sessão para reconstruir a interface do usuário), um token não deve ser emitido sem uma assinatura. A assinatura é uma proteção básica que permite aos consumidores do token confiar nela e garantir que não foi adulterada.

Ao escolher o algoritmo de assinatura, tenha em mente que algoritmos de chave simétrica são vulneráveis ​​a ataques de força bruta se a chave usada não for forte o suficiente (nomes de animais de estimação e datas de nascimento também não são válidos para isso;-), portanto, complexidade suficiente deve ser fornecida se algoritmos de chave simétrica forem escolhidos. Por outro lado, algoritmos de chave assimétrica simplificam a custódia da chave, pois ela só é necessária na parte do servidor que gera o token.

Um token, uma vez assinado, é válido para sempre se não houver data de expiração (claim exp). No caso de “Tokens de acesso”, se alguém capturar um poderá ter acesso à operação permitida para sempre. A atribuição de identificadores (claim jti) aos tokens permite a sua revogação; em caso de comprometimento do token é altamente desejável ter a opção de revogá-lo.