패스워드를 암호화 없이 평문으로 저장을 한다면, 정보 유출 문제로 이어진다. 이러한 사항을 방지하기 위해 인코딩 된 패스워드를 데이터베이스에 저장하게 되는데, 이번 포스팅에서는 스프링 시큐리티의 PasswordEncoder를 이용하여 패스워드를 암호화(인코딩/디코딩) 하는 방법을 알아 볼 것이다.
@Configuration
public class WebMvcConfig implements WebMvcConfigurer{
@Bean // IoC 대상 - 싱글톤 처리
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
📌 회원가입 하기 - 패스워드 암호화 적용
@Autowired
private PasswordEncoder passwordEncoder;
... 생략
@Transactional
public void createUser(SignUpFormDto dto) {
// 암호화 처리
User user = User.builder()
.username(dto.getUsername())
.password(passwordEncoder.encode(dto.getPassword()))
.fullname(dto.getFullname())
.build();
int result = userRepository.insert(user);
if(result != 1) {
throw new CustomRestfulException("회원 가입 실패",
HttpStatus.INTERNAL_SERVER_ERROR);
}
}
정의해둔 PasswordEncoder를 선언해준 후 의존성 주입을 해준다.
passwordEncoder 의 encode 메서드를 사용하여 사용자가 입력하는 패스워드 데이터를 암호화하는 단계를 지닌다.
📌 로그인 하기
@Service // IoC 대상 + 싱글톤으로 관리 됨
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
public User readUser(SignInFormDto dto) {
User userEntity = userRepository.findByUsername(dto.getUsername());
if(userEntity == null) {
throw new CustomRestfulException("존재하지 않는 계정입니다", HttpStatus.BAD_REQUEST);
}
boolean isPwdMatched =
passwordEncoder.matches(dto.getPassword(),userEntity.getPassword());
if(isPwdMatched == false) {
throw new CustomRestfulException("비밀번호가 일치하지 않습니다", HttpStatus.BAD_REQUEST);
}
return userEntity;
}
}