O que é um JWT?

Na era digital, a segurança das informações entre aplicações e a proteção da privacidade do usuário tornaram-se questões-chave que não podemos ignorar, e são pontos de atenção obrigatórios para nós, como desenvolvedores Back-end.

Neste campo, a utilização do JWT, por ser moderno, seguro e eficiente, tem sido um dos principais mecanismos de gerenciamento de sessões amplamente utilizado em diversos serviços web e interfaces APIs.

JWT, que significa JSON Web Token, é um padrão aberto (RFC 7519) usado para transmitir informações com segurança entre ambientes na rede.

É essencialmente um objeto JSON assinado digitalmente que pode transportar e transmitir informações de estado (como autenticação de usuário, autorização, etc.).

Conforme mostrado na imagem acima, o JWT consiste em três partes, essas partes são conectadas por pontos (.)

  • Header: declara o tipo de JWT (geralmente JWT) e o algoritmo de criptografia usado (como HMAC, SHA256 ou RSA)
  • Payload: a parte que transporta dados reais, que podem incluir declarações predefinidas como iss (emissor), exp (tempo de expiração), sub (assunto), dentre outros dados personalizados. Qualquer informações pode ser escrita, mas não é recomendado armazenar informações confidenciais.
  • Signature: tem a capacidade de verificar a integridade dos dados evitando adulterações, através da codificação das duas primeiras partes, e do algoritmo de criptografia declarado no cabeçalho (Header), juntamente com uma chave secreta.

Fluxo

Quando um usuário efetua login, o servidor gera um JWT após verificar o nome de usuário e a senha e o envia ao cliente.

Este JWT pode conter informações de autenticação do usuário, informações de permissão e outros dados comerciais necessários.

Após receber o JWT, o cliente geralmente o salva localmente (como Cookie, LocalStorage ou SessionStorage).

O cliente carrega esse JWT (geralmente anexado ao cabeçalho da solicitação HTTP) nas solicitações subsequentes sem precisar enviar o nome de usuário e a senha novamente.

O servidor só precisa decodificar o JWT recebido e verificar a assinatura para concluir a confirmação da identidade do usuário e a verificação da autoridade.

No processo de autenticação regular JWT acima, podemos concluir o login, a autenticação e outras autenticações normalmente, mas você descobrirá que, neste processo, não podemos sair.

Quando o servidor emite JWT para o cliente, o servidor perde o controle do JWT e só pode esperar que esses JWTs emitidos expirem após o término do período de validade.

Para resolver este problema, introduzimos o cache, depois que o servidor gera o JWT, ele primeiro armazena o JWT no cache antes de devolvê-lo ao cliente. Ao autenticar, você precisa verificar se o JWT existe no cache.

Nesse caso, se o usuário efetuar logout, só precisamos excluir o JWT do cache para garantir que o JWT emitido não possa mais passar na autenticação.

Vantagens e desafios do JWT

A principal vantagem do JWT é que ele não tem estado, o servidor não precisa armazenar o estado da sessão, o que reduz a pressão sobre o servidor e melhora a escalabilidade e o desempenho do sistema.

Além disso, a segurança é reforçada devido ao período de validade do JWT.

No entanto, o JWT também enfrenta alguns desafios, como o manejo segura das chaves, o design da política de expiração e a dificuldade em lidar com perda ou roubo de JWT válidos.

Portanto, em aplicações práticas, é necessário considerar de forma abrangente os cenários e as características técnicas para utilizar o JWT de forma racional.

Sobre Nicolau 21 Artigos
Fuçando o desenvolvimento de software desde 2013, sou da turma do código aberto, vivo pesquisando e garimpando a segurança na web. Sommelier de sucos e chocólatra de carteirinha. Hic svnt dracones.

Seja o primeiro a comentar

Faça um comentário

Seu e-mail não será divulgado.


*