Olá Pedro, tudo bem?
Você está certo em se preocupar com a segurança ao armazenar o token JWT no lado do cliente. Armazenar tokens no Local Storage pode ser arriscado, pois eles podem ser acessados por scripts maliciosos em caso de um ataque XSS (Cross-Site Scripting).
Uma alternativa mais segura é utilizar cookies HTTP-Only para armazenar o token JWT. Cookies HTTP-Only não são acessíveis via JavaScript, o que os torna menos vulneráveis a ataques XSS. Aqui está um exemplo de como você pode configurar isso no Spring Boot:
Configurar o Cookie no Servidor:
No seu controlador de autenticação, ao gerar o token JWT, você pode criar um cookie e enviá-lo na resposta:
@PostMapping("/login")
public ResponseEntity<?> efetuarLogin(@RequestBody @Valid DadosAutenticacao dados) {
var authenticationToken = new UsernamePasswordAuthenticationToken(dados.login(), dados.senha());
var authentication = manager.authenticate(authenticationToken);
var tokenJWT = tokenService.gerarToken((Usuario) authentication.getPrincipal());
// Criar o cookie
ResponseCookie cookie = ResponseCookie.from("jwt", tokenJWT)
.httpOnly(true)
.secure(true) // Use true se estiver usando HTTPS
.path("/")
.maxAge(Duration.ofHours(2)) // Defina o tempo de expiração do cookie
.build();
return ResponseEntity.ok()
.header(HttpHeaders.SET_COOKIE, cookie.toString())
.body(new DadosTokenJWT(tokenJWT));
}
Configurar o Cliente:
No lado do cliente, você não precisa se preocupar em manipular o token diretamente. O navegador cuidará do envio do cookie em todas as requisições subsequentes para o mesmo domínio.
Verificar o Token no Servidor:
No servidor, você precisará configurar um filtro para extrair o token do cookie e validá-lo em cada requisição protegida.
Essa abordagem melhora a segurança, pois o token não fica acessível para scripts no navegador. No entanto, é importante lembrar que ela não protege contra ataques CSRF (Cross-Site Request Forgery), então considere implementar proteções adicionais contra CSRF se necessário.
Espero ter ajudado e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.