[Dúvida] [JWT] [Autenticação]
Estou com uma demanda de atualizar nosso método de autenticação para JWT (ou, pelo menos, analisar a viabilidade, comparando-o com a forma atual.
Dentro das pesquisas que fiz, parece que pelo JWT a gente não precisaria ter a persistência das informações de autênticação, bastaria o token, que após a descriptografia nos diz o id do usuário, a data de expiração.
Seria isso mesmo?
Alguém que está utilizando na prática, pode compartilhar qual foi a lógica implementada para garantir a seguraça?
Vou deixar aqui um repositório para você conferir: (https://github.com/wellingtonrodriguesbr/pollify-api/blob/main/src/http/controllers/users/authenticate-controller.ts)
Aqui vai um resumo do funcionamento de tokens:
- O token expira mais rápido e é usado pelo front-end nos cabeçalhos das requisições (Bearer Token).
- O refresh token dura mais e é guardado nos cookies do lado do servidor.
No axios por exemplo, usamos os interceptors para interceptar requisições e respostas. Se a resposta falhar devido ao token expirado, a API precisa de uma rota para gerar um novo token usando o refresh token. O axios então tenta a requisição novamente com o novo token, garantindo que dê sucesso. Se ficou muito confuso, pode perguntar novamente que tento ajudar.
Um detalhe importante é que o JWT não faz criptografia por padrão.
Os três segmentos do token na verdade estão apenas encodados em base64, então qualquer pessoa pode ver o que está no payload do token (onde você colocaria a identificação do usuário e outras informações relevantes). A segurança dele vem pelo último segmento que é a assinatura do payload, assim você consegue validar que aquele payload foi gerado por você, já que a chave da criptografia deve ser algo privado que só a sua aplicação conhece.
Olá! Vc consegue colocar algumas (várias) informações dentro do token, na sessão Payload, como nome de usuário, user id, roles, etc. Quanto mais coisa colocar, maior fica.
No https://jwt.io/ vc pode ver mais características de um token.
parece que pelo JWT a gente não precisaria ter a persistência das informações de autênticação,
Correto, mas isso não é exclusivo do JWT. Os fluxos do OAuth (há vários) já têm isso em mente.
que após a descriptografia nos diz o id do usuário, a data de expiração.
Essa é uma das principais vantagens do JWT: não é necessário fazer uma requisição extra para validar o token. Em outros fluxos do OAuth, temos que ir ao servidor de "identidade" para validar o token antes de autorizar.
Comentando sobre a necessidade de persistência, pode ser interessante implementar para que seja possível a funcionalidade de anular os JWTs já emitidos. Dessa maneira, seria necessário verificar na base de dados se o token ainda é válido antes de autenticar.
Obs.: caso queria inserir informações sensíveis no token, existe o conceito de JWE (superficialmente, jwt encriptado).
Basicamente é composto por: {Header}.{Payload}.{Assinatura}
Agora, se puder dar mais contexto sobre qual o motivo que chegou nesse assunto de implementar o JWT, quem sabe poderiamos te dar um norte melhor pra encontrar realmente uma saída eficiente.
A maioria implementa JWT onde não é necessário e em muitos casos autenticação por cookies é o suficiente com HttpOnly e SameSite pra ter uma segurança a mais.