회원가입을 하는 것에 있어서 필요할 정보들이 무엇이 존재하는지 생각한다.
이번 연습용 프로젝트에서는
이 세가지가 필요할 것이라고 가정했다.
이 정보들을 클라이언트에서 받은 후에 Spring Data JPA를 이용하면 쉽게 저장할 수 있다.
그러나 암호화를 거치지 않고 단순 저장만 하면 유저 정보 보안에 큰 문제가 생길 수 있기 때문에, 비밀번호 데이터를 암호화해서 저장해보도록하자.
BCryptPasswordEncoder
//SecurityConfig.java
//...
@Bean
public BCryptPasswordEncoder encodePwd() {
return new BCryptPasswordEncoder();
}
이러한 암호화를 쉽게 구현하게 해줄 수 있는 것이 BCryptPasswordEncoder
클래스이다.
안에 내장되어있는 encode()
메서드로 데이터를 인코딩할 수 있다. 이 메서드를 이용해 비밀번호 데이터를 암호화할 생각이다.
이 클래스를 Bean으로 등록해서 사용해보도록 하자.
💡 굳이 Bean으로 받아서 사용하는 이유는?
Spring Bean을 사용하는 이유는 다양하지만,
굳이 꼽자면 단순히 Bean이 싱글톤으로 관리되기 때문이라고 할 수 있겠다.
해당 클래스의 용도 특성상 Bean으로 등록하지 않으면 객체가 무분별하게 생성될 수 있는데, 이런 부담을 줄이고자 Bean으로 등록해서 사용하는 것이다.
@PostMapping("/join")
public String join(User user) {
//System.out.println(user);
user.setRole("ROLE_USER");
String rawPassword = user.getPassword();
String encPassword = bCryptPasswordEncoder.encode(rawPassword);
user.setPassword(encPassword);
userRepository.save(user); // 패스워드 암호화가 안 되어있음.
return "redirect:/loginForm";
}
임의의 연습용 프로젝트니까 최대한 편한 방향으로 쉽게 코드를 짰다.
전체적인 흐름은 다음과 같다.
실제로 사용할만하게 사용한다면 Service계층을 파서 그 곳에서 작업하는 게 더 좋을 듯.