오픈소스를 무분별하게 가져다 쓰는것 보다, 내부 동작 원리를 이해하고 용도에 맞게 사용해야한다.
부족한 부분을 기여할 수 있는 프로슈머가 되어야 한다.
필자분께서 결론에 담아주신 내용이 가장 인상이 깊었습니다.
쥬니어와 시니어가 같은 일을 하고 같은 품질의 결과물을 만들어 낸다면 나이는 많고 연봉은 높은 시니어를 반길 이유가 없다. 시니어는 기반 기술에 대한 높은 이해를 바탕으로 쥬니어와는 다른 고품질의 결과물을 만들 수 있어야 한다. 그리고 쥬니어가 성장하고 본받을 수 있는 높은 기술력을 갖추고 리딩할 수 있어야 한다. 단순히 1년의 경력을 10번 반복한 시니어는 아무런 경쟁력이 없다.
finalUserpersistUser= userRepository.findUserByIdAndPassword(userId, currentPassword) .orElseThrow(() -> newEntityNotFoundException("회원정보를 찾을 수 없습니다.")); if(!currentPassword.equals(persistUser.getPassword())) { logger.info("changePassword is Not Equal Current Password"); returnnewResponseEntity<>(UserRegisterResult.ERROR.getResponseBody(), HttpStatus.FORBIDDEN); }
new BCryptPasswordEncoder().encode(password);로 암호화 한 패스워드를 저장했기 때문에,
회원을 찾을때도 이렇게 하면 되겠다고 생각해서 위와 같은 코드를 작성하였는데,
테스트중 계속하여 EntityNotFoundException이 발생하였습니다.
디버깅으로 체크하였더니 String currentPassword = new BCryptPasswordEncoder().encode(request.getCurrentPassword()); 부분에서 매번 다른 비밀번호가 currentPassword에 들어갔습니다.
왜 다른 값이 나오는지 알고 싶어 BCryptPasswordEncoder 클래스 파일을 열어보았는데,
encode 부분에서 rawPassword 와 salt값을 생성하여 두개의 값으로 패스워드를 해싱하고 있었습니다.
해당 클래스 파일안에 matches(CharSequence rawPassword, String encodedPassword)라는 함수가 있었고,
클래스의 인터페이스를 확인하였더니,
1 2 3 4 5 6 7 8 9 10 11
/** * Verify the encoded password obtained from storage matches the submitted raw * password after it too is encoded. Returns true if the passwords match, false if * they do not. The stored password itself is never decoded. * * @param rawPassword the raw password to encode and match * @param encodedPassword the encoded password from storage to compare with * @return true if the raw password, after encoding, matches the encoded password from * storage */ boolean matches(CharSequence rawPassword, String encodedPassword);
라는 주석을 확인하였고, 구현체가 아닌 인터페이스를 사용하고자 org.springframework.security.crypto.password.PasswordEncoder 를 의존성 주입하여,
1 2 3 4 5 6 7 8
finalUserpersistUser= userRepository.findById(userId) .orElseThrow(() -> newEntityNotFoundException("회원정보를 찾을 수 없습니다.")); if(!passwordEncoder .matches(request.getCurrentPassword(), persistUser.getPassword())) { logger.info("changePassword is Not Equal Current Password"); returnnewResponseEntity<>(UserRegisterResult.ERROR.getResponseBody(), HttpStatus.FORBIDDEN); }
이와 같이 수정하였고, 기대했던 결과대로 수행되었습니다.
아직 자바와 스프링이 많이 서툴러서 코드를 작성하는 시간보다 검색해보는 시간이 많아 더 어려운거 같습니다.