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.
Seja o primeiro a comentar