원래 이렇게 했는데
User newUser = userService.signup(request.getEmail(), request.getPassword(),
request.getUsername());
String token = userService.signin(newUser.getEmail(), newUser.getPassword());
생각해보니까 userService.signin은 raw password를 원하는데 newUser.getPassword()는 인코딩된 거잖아? 그래서
User newUser = userService.signup(request.getEmail(), request.getPassword(),
request.getUsername());
String token = userService.signin(newUser.getEmail(), request.getPassword());
이렇게 바꿀까하는데 괜찮아? 원래는 어떻게 해?
네, 아주 정확하게 짚으셨습니다! 개발자로서의 감이 아주 좋으시네요. 👏
말씀하신 대로 userService.signin은 사용자가 입력한 “날 것의 비밀번호(Raw Password)“를 기대하는데, newUser.getPassword()는 이미 암호화된 문자열($2a$10$...)이라서 로그인이 실패하게 됩니다.
그래서 request.getPassword()를 넣는 것이 정석입니다.
✅ 1. 말씀하신 수정안 (정답 O)
회원가입 직후 자동 로그인을 시켜주는 로직에서는 이렇게 하는 것이 가장 일반적입니다.
Java
// 1. 회원가입 (DB에 암호화된 비밀번호 저장)
User newUser = userService.signup(request.getEmail(), request.getPassword(), request.getUsername());
// 2. 로그인 (가입할 때 썼던 '쌩' 비밀번호를 다시 사용)
// newUser.getPassword() -> (X) 암호화된 값이라 로그인 실패함
// request.getPassword() -> (O) 사용자가 입력한 값이라 비교 가능
String token = userService.signin(newUser.getEmail(), request.getPassword());
return ResponseEntity.ok(new AuthResponse(token));
💡 2. 실무에서 더 효율적으로 하는 법 (Pro Tip)
사실 위 방법도 문제는 없지만, “굳이 방금 가입시킨 사람을 의심해서 비밀번호 검사를 또 해야 해?” 라는 의문이 들 수 있습니다.
signin 메서드 안에는 passwordEncoder.matches()라는 비밀번호 검증 로직이 들어있을 텐데, 회원가입 직후에는 이미 우리가 인증한 유저이므로 검증 과정을 건너뛰고 토큰만 바로 발급하는 게 더 효율적일 수 있습니다.
방법 A: 토큰 발급기만 따로 부르기 (추천 ⭐)
signin을 호출하지 않고, 토큰을 만드는 메서드(JwtTokenProvider 등)를 바로 호출하는 방식입니다.
Java
// 1. 회원가입
User newUser = userService.signup(request);
// 2. 로그인 검증(signin) 없이 토큰만 즉시 발급 (이미 믿을 수 있는 유저니까)
// 비밀번호 비교 연산 비용(BCrypt는 느림)을 아낄 수 있음
String token = jwtTokenProvider.createToken(newUser.getEmail(), newUser.getRole());
return ResponseEntity.ok(new AuthResponse(token));
결론
-
현재 방식(수정안):
request.getPassword()로 고쳐서 쓰세요. 로직이 명확하고 단순해서 유지보수하기 좋습니다. (성능 차이는 미미합니다.) -
더 나아가면: 나중에 성능 최적화가 필요할 때 “검증 없이 토큰 발급” 방식으로 바꾸시면 됩니다.
지금은 request.getPassword()로 고치는 것으로 충분합니다! 바로 수정해서 진행하세요! 🚀