🔍 Controller

@PostMapping("/user/pwd_change")
public ResponseEntity<Void> change_pwd(HttpServletRequest request, @Valid @RequestBody RequestChangePWD requestChangePWD){
    boolean check_pwd = userService.change_pwd(requestChangePWD, (User) request.getAttribute("user"));

    return (check_pwd) ?
            ResponseEntity.status(HttpStatus.OK).body(null) :
            ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}

UserServicechange_pwd함수를 호출하고 결과에 따라 200 또는 400의 status code를 반환

@Valid 어노테이션을 사용해 유효성 검사 처리

🔍 Service

@Override
public boolean change_pwd(RequestChangePWD requestChangePWD, User user){
    if(bCryptPasswordEncoder.matches(requestChangePWD.getOrigin_password(), user.getPassword())){
        user.changePWD(bCryptPasswordEncoder.encode(requestChangePWD.getNew_password()));
        userRepository.save(user);
        return true;
    }
    return false;
}

비밀번호는 BCryptPasswordEncoder 를 통해 암호화 되어있음

BCryptPasswordEncoder 는 패스워드를 해싱 할 때 내부적으로 랜덤한 솔트를 생성하므로 같은 문자열에 대해 매번 다른 해싱결과가 나옴

또한 해시 값 내부에 솔트 값이 포함되기 때문에 솔트 값을 따로 저장하지 않아도 해싱된 값과 평문을 비교할 수 있음

따라서 matches 라는 함수를 이용하지 않고 문자열 비교하면 틀림

입력한 비밀번호가 현재 비밀번호와 같다면 새로운 비밀번호로 수정