3 melhores práticas de segurança para lidar com JWTs
18 de dezembro de 2023
0 minutos de leitura
No desenvolvimento web moderno, os JSON Web Tokens (JWTs) se tornaram um método popular para transmitir informações com segurança entre diferentes partes. Eles são usados para autenticação e autorização e, muitas vezes, para armazenar informações de usuários. No entanto, o uso cada vez mais frequente de JWTs também traz riscos de segurança dos quais os desenvolvedores precisam estar cientes.
Como desenvolvedor, você é responsável por garantir a segurança da sua aplicação e a proteção dos dados dos usuários. Nesta publicação, vamos falar sobre as três melhores práticas de segurança para lidar com JWTs. Também apresentaremos exemplos práticos em Python e mostraremos como a Snyk pode ajudar você a identificar e corrigir vulnerabilidades de segurança na sua aplicação.
Ao final desta publicação, você entenderá melhor como lidar com JWTs com segurança nas suas aplicações e por que é importante usar ferramentas como a Snyk para garantir a segurança do seu código. Vamos começar!
Melhor prática nº 1: mantenha os JWTs em segredo
Os JWTs são amplamente usados em aplicações web modernas para autenticação e autorização. No entanto, se não forem tratados corretamente, podem representar um risco significativo para a segurança da sua aplicação. Nesta seção, vamos falar sobre a importância de manter os JWTs em segredo e como fazer isso.
Por que é importante manter os JWTs em segredo
Os JWTs são, essencialmente, objetos JSON assinados que contêm informações sobre um usuário. Esses dados podem incluir informações confidenciais, como IDs de usuário, funções e permissões. Se um invasor obtiver um JWT, poderá usá-lo para se passar pelo usuário e conseguir acesso não autorizado à sua aplicação.
Por isso, é fundamental manter os JWTs em segredo e garantir que somente as partes autorizadas possam acessá-los. Para entender a importância de manter os JWTs em sigilo, pense nos cookies de sessão de uma aplicação web tradicional: se um invasor roubar seus cookies, poderá facilmente se passar por você e causar muitos danos!
Como manter os JWTs em segredo
O primeiro passo para manter os JWTs em segredo é garantir que eles sejam transmitidos com segurança pela rede. Para isso, use HTTPS em todas as comunicações entre o cliente e o servidor.
O segundo passo é armazenar os JWTs com segurança no lado do cliente. Uma opção é usar as flags HttpOnly e Secure ao enviar cookies para o cliente. A flag HttpOnly impede que scripts no lado do cliente acessem o cookie, enquanto a flag Secure garante que ele seja transmitido somente por HTTPS.
Outra opção para armazenar JWTs com segurança é usar mecanismos de armazenamento do navegador, como sessionStorage ou localStorage. Esses mecanismos permitem armazenar dados no navegador de um jeito que outros domínios não conseguem acessar. Mas tenha cuidado: se seus JWTs forem armazenados em sessionStorage ou localStorage, eles ficarão acessíveis ao código JavaScript. Por isso, avalie cuidadosamente seu site para garantir que ele não esteja vulnerável a ataques de cross-site scripting (XSS), que poderiam permitir que invasores comprometessem seus JWTs.
Por fim, é fundamental garantir que os JWTs sejam validados corretamente no lado do servidor. Isso inclui verificar a assinatura e confirmar o conteúdo do token.
Exemplo prático: como a Snyk encontra problemas de segurança relacionados à manutenção de JWTs em segredo
A Snyk é uma ferramenta de segurança para desenvolvedores que ajuda a identificar problemas de segurança relacionados a JWTs. Por exemplo, a Snyk pode detectar se sua aplicação usa algoritmos de criptografia fracos ou se não usa as flags HttpOnly ou Secure ao enviar cookies para o cliente.
Veja este exemplo de código em Python:
Neste exemplo, usamos a biblioteca Flask-JWT-Extended para criar e verificar JWTs. A Snyk pode detectar se estamos usando algoritmos de criptografia inseguros ou se não estamos validando os JWTs corretamente no lado do servidor.
Com uma ferramenta como a Snyk, você pode garantir a segurança da sua aplicação e manter seus JWTs em segredo.
Melhor prática nº 2: valide os JWTs
Como mencionamos na seção anterior, os JWTs são usados para autenticação e autorização, e seu comprometimento pode levar a violações de segurança. Por isso, é essencial validar os JWTs antes de confiar neles.
A importância de validar os JWTs
A validação de JWTs garante que a solicitação recebida venha de um usuário autenticado e autorizado. Ela confirma que o token não expirou nem foi adulterado e que foi assinado por quem o emitiu. Se o JWT não for validado corretamente, podem surgir vulnerabilidades de segurança, como acesso não autorizado e violações de dados.
Como validar JWTs
Para validar JWTs, é preciso seguir estas etapas:
Analise o JWT para extrair o cabeçalho, o payload e a assinatura.
Verifique a assinatura usando a chave secreta ou a chave pública.
Confira as claims de tempo de expiração (
exp) e de início de validade (nbf) para garantir que o JWT seja válido.Verifique a claim do emissor (
iss) para garantir que o JWT tenha sido emitido por uma parte confiável.Verifique a claim do público-alvo (
aud) para garantir que o JWT seja destinado ao destinatário correto.
O Python oferece várias bibliotecas para validar JWTs, como a PyJWT, uma implementação do padrão JWT para Python. Veja abaixo um exemplo de validação de JWT com a PyJWT:
No exemplo acima, o método jwt.decode() é usado para decodificar e validar o token. O parâmetro algorithms especifica quais algoritmos devem ser usados para verificar a assinatura. O parâmetro options define as verificações adicionais que devem ser feitas, como conferir o tempo de expiração, o emissor e o público-alvo.
Exemplo prático: como a Snyk encontra problemas de segurança relacionados à validação de JWTs
A Snyk oferece uma ferramenta abrangente de análise de segurança capaz de detectar problemas relacionados à validação de JWTs. Por exemplo, ela pode analisar a base de código em busca de práticas inseguras de validação, como o uso de um algoritmo inseguro ou a falta de verificação das claims de emissor ou público-alvo. A Snyk também pode detectar vulnerabilidades nas bibliotecas de terceiros usadas para validar JWTs.
Com a Snyk, os desenvolvedores podem garantir que a base de código esteja livre de vulnerabilidades relacionadas à validação de JWTs. Para começar a usar a Snyk, crie uma conta gratuita e integre a ferramenta ao seu fluxo de desenvolvimento.
Melhor prática nº 3: defina um tempo de expiração para os JWTs
Os JWTs são amplamente usados em aplicações web modernas para transmitir informações com segurança entre diferentes partes. No entanto, se não forem protegidos corretamente, podem levar a vulnerabilidades capazes de comprometer a segurança de toda a aplicação. Uma das melhores práticas para evitar essas vulnerabilidades é definir tempos de expiração para os JWTs.
A importância de definir um tempo de expiração para os JWTs
Definir um tempo de expiração para os JWTs é importante porque limita por quanto tempo eles podem ser usados. Após a expiração, o JWT deixa de ser válido e o usuário precisa obter um novo para acessar a aplicação. Isso impede que invasores usem um JWT antigo para acessar a aplicação, mesmo depois que o usuário sair da conta.
Como definir um tempo de expiração para os JWTs
Para definir um tempo de expiração em um JWT, adicione uma claim de expiração ao payload. O valor da claim de expiração (exp) é um timestamp Unix que representa o momento em que o JWT expira. Ao verificar o JWT, o servidor pode conferir a claim exp para garantir que ele ainda seja válido.
Veja como definir um tempo de expiração de 30 minutos para um JWT em Python:
Exemplo prático: como a Snyk encontra problemas de segurança
A Snyk é uma ferramenta de segurança para desenvolvedores que ajuda a detectar problemas relacionados à definição de tempos de expiração para JWTs. Por exemplo, Snyk Open Source pode analisar as dependências da sua aplicação em busca de vulnerabilidades conhecidas, incluindo as relacionadas a JWTs.
Snyk Open Source também pode identificar se uma aplicação está usando uma versão desatualizada ou insegura de uma biblioteca de JWTs. Ao manter suas bibliotecas de JWTs atualizadas, você garante que as vulnerabilidades de segurança relacionadas a eles sejam corrigidas.
Pacotes open source recomendados
Há vários pacotes open source que podem ajudar a definir tempos de expiração para JWTs em Python. Um deles é o PyJWT, que oferece uma interface simples para codificar e decodificar JWTs, inclusive para definir o tempo de expiração.
Para instalar o PyJWT, use o pip:
Depois de instalar, você pode usar o PyJWT para definir o tempo de expiração de um JWT:
Em resumo, definir tempos de expiração para JWTs é uma prática essencial de segurança que ajuda a evitar vulnerabilidades na sua aplicação. Com ferramentas como a Snyk e pacotes open source como o PyJWT, você garante que sua aplicação esteja segura e atualizada com as melhores práticas de segurança.
A importância das melhores práticas de segurança para JWTs
Em resumo, seguir as melhores práticas de segurança para JWTs é fundamental para garantir a segurança e a integridade das suas aplicações web. Como vimos, lidar com JWTs de forma inadequada pode levar a vulnerabilidades e violações graves, resultando em acesso não autorizado, vazamento de dados e danos à reputação. Ao seguir estas três melhores práticas de segurança para lidar com JWTs, os desenvolvedores podem reduzir significativamente a probabilidade desses riscos.
Armazene os JWTs com segurança: Evite guardar JWTs no armazenamento local ou em cookies e prefira alternativas mais seguras, como cookies HTTP-only ou gerenciamento de sessões no lado do servidor.
Valide e verifique os JWTs: Sempre valide os JWTs ao recebê-los e verifique a assinatura para garantir que não foram adulterados. Implemente o tratamento adequado de erros para lidar com tokens inválidos com segurança.
Use criptografia e algoritmos robustos: Escolha algoritmos de criptografia robustos, como RS256, e gerencie suas chaves privadas com segurança para evitar a criação e a modificação não autorizadas de tokens.
Reforce a segurança da sua aplicação com a Snyk
Para reforçar ainda mais a segurança das suas aplicações web, considere criar uma conta na Snyk. A Snyk é uma poderosa ferramenta de segurança para desenvolvedores que analisa seu código-fonte, pacotes open source, imagens de contêiner e configurações de nuvem em busca de vulnerabilidades. Com Snyk Open Source, você identifica e corrige rapidamente problemas de segurança nos seus projetos Python e nas dependências deles.
Por exemplo, a Snyk pode ajudar você a detectar se seu projeto Python está usando uma versão desatualizada ou vulnerável de uma biblioteca de JWTs e oferecer recomendações práticas para atualizar para uma versão segura.
A Snyk pode avisar você de que a versão 1.7.1 do pyjwt está vulnerável e sugerir a atualização para uma versão mais segura, como a 2.1.0.
Ao integrar a Snyk ao seu fluxo de desenvolvimento, você pode descobrir e corrigir problemas de segurança de forma proativa, antes que se tornem críticos, garantindo que suas aplicações permaneçam seguras e em conformidade.
Tome uma atitude hoje
Não deixe a segurança das suas aplicações web ao acaso. Siga as melhores práticas para lidar com JWTs e crie uma conta na Snyk para ter uma solução abrangente que ajuda a proteger suas aplicações contra vulnerabilidades e riscos. Com a Snyk, você desenvolve com confiança, sabendo que suas aplicações estão seguras e em conformidade com os padrões do setor. Crie sua conta gratuita hoje mesmo e proteja suas aplicações web!
