Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Persistência do token pelo lado do cliente...

Olá, tudo bem?
Supondo uma aplicação WEB, feita com HTML, CSS e JS. E que do lado do servidor tenha uma aplicação Java rodando com o Spring Boot. Quando o usuário deste front efetua o login, o site manda ao servidor que responde o com um token JWT, qual seria o jeito mais indicado para salvar esse JWT?
Pois acredito, que deixar acessível no Local Storage do JS seria problemático, ainda mais considerando que quem iria salvar isso era o JS no próprio lado do cliente.
Pensando nisso, tem alguma forma de configurar no próprio Java para algo tipo um cookies que salve esse JWT, para que fique disponível apenas a nível de requisição, ou seja o JS não poderia usar?

1 resposta
solução!

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:

  1. 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));
    }
    
  2. 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.

  3. 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 ✓.