Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] Duvidas Spring Boot

Você poderia me ajudar, por favor?

  • Eu tenho um método de perfil que retorna as configurações do sistema do usuário. Estou em dúvida sobre o ID. O frontend envia o ID para o backend neste endpoint ou precisamos obter o token do cabeçalho, extraí-lo e obter o ID? Qual é a melhor abordagem e quais melhores práticas devemos seguir?

  • É uma má prática salvar o e-mail, ID e funções do usuário no armazenamento local ou no armazenamento de sessão?

  • Se as perguntas estiver não seguindo boas praticas me fale porfavor

  • retornar no response do login, o

    • acessToken (frontend armazena variavel),
    • name do usuario (frontend armazena localStorage)
    • thema (light ou dark) (frontend armazena localStorage)
  • por que armazenar esses dois em localStorage? o usuario poderia mudar com js, mais nao mudaria a minha aplicação somente visualmente.

  • caso fosse para /profile, eu não puxaria o nome do localStorage, e sim o nome real do banco de dados

3 respostas

Oi, Cauã! Como vai?

O mais seguro e recomendado é não enviar o ID do usuário diretamente pelo frontend. O ideal é que o token JWT (gerado no login) seja enviado no cabeçalho da requisição, e o backend extraia as informações do usuário a partir desse token, como ID, e-mail e permissões.

Isso evita que o usuário possa manipular o ID manualmente e acessar dados de outro perfil. O backend deve ser o responsável por identificar quem está acessando o recurso com base no token recebido.

Sobre salvar dados como ID, e-mail e funções no localStorage ou sessionStorage, isso não é uma boa prática. Esses dados ficam acessíveis no navegador e podem ser expostos facilmente em casos de ataques (como XSS).

Boas práticas:

  • Enviar apenas o token no armazenamento local (ou melhor ainda: usar cookies HttpOnly).
  • Deixar que o backend leia o token e identifique o usuário.
  • Nunca confiar em dados sensíveis vindos do frontend.

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição.

Abraços e bons estudos!

  Caso este post tenha lhe ajudado, por favor, marcar como solucionado

faz sentido, porque o metodo JwtFilter que extende de OncePerRequestFilter ele não valida o email que veio pelo usuário então pode acontecer o seguinte.

  • usuario por js mudar o id do usuário
  • frontend fazer a requisição para o endpoint /profile
  • passa pelo metodo doFilterInternal(....) da minha classe JwtFilter que extende de OncePerRequestFilter.
  • valida o token
  • vai para o metodo profile e pega o id do parametro que foi alterado pelo proprio usuario ( critico pois nao pode acontecer isso num sistema )
  • nisso ele poderia usar o id de outro usuario e ver o profile de outros usuarios.

seria isso sua explicação ?

solução!

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:

  1. 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).

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