Oi, Cauã!
Sobre sua última dúvida: sim, sua explicação está correta e esse é justamente o tipo de brecha que precisamos evitar em aplicações seguras.
Você identificou bem o risco: nunca confie em dados enviados pelo frontend, especialmente ID de usuário. Se o frontend puder manipular esse valor e o backend confiar nele, um usuário malicioso pode acessar informações de outros usuários apenas alterando o ID.
Resolva fazendo o seguinte:
No backend, extraia todas as informações sensíveis (como o ID do usuário) diretamente do token JWT, e nunca da requisição (query param, body ou header customizado).
Configure sua JwtFilter
para armazenar os dados extraídos do token no SecurityContextHolder
(como um UsernamePasswordAuthenticationToken
), e então no controller use algo como:
@GetMapping("/profile")
public ResponseEntity<UserProfileDto> getProfile(Authentication authentication) {
CustomUserDetails userDetails = (CustomUserDetails) authentication.getPrincipal();
Long userId = userDetails.getId();
// agora use o userId com segurança
UserProfileDto profile = userService.getProfile(userId);
return ResponseEntity.ok(profile);
}
- No frontend, não envie ID do usuário nas requisições. Apenas envie o token JWT no header
Authorization
.
Sobre armazenar e-mail, ID ou roles no localStorage
ou sessionStorage
:
Evite totalmente salvar dados sensíveis aí. Como você mesmo comentou, esses valores podem ser manipulados via JavaScript, o que compromete a integridade e segurança da aplicação.
É aceitável armazenar configurações visuais, como tema, no localStorage
, pois isso não afeta regras de negócio ou controle de acesso. Mesmo que o usuário mude via JS, o impacto será apenas estético.
Para dados sensíveis (como o nome do usuário), busque sempre diretamente do backend. Você pode usar o token para validar e montar a resposta do endpoint /profile
, garantindo que as informações estejam corretas e não adulteradas.
Fico à disposição. Abraços e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado