스프링 시큐리티에서 제공하는 PasswordEncoder
를 사용하여 사용자의 비밀번호를 암호화하여 보다 안전하게 저장할 수 있다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
//...
}
스프링 시큐리티 설정 파일에서 PasswordEncoder
를 빈으로 등록해준다. 구현체로는 BCryptPasswordEncoder
를 사용한다.
@Autowired
PasswordEncoder pwEncoder;
회원가입을 처리하는 컨트롤러에 패스워드 인코더를 @Autowired
로 추가해준다.
@RequestMapping("/memRegister.do")
public String memRegister(Member m, ...) {
//...
//회원가입 폼 검증 => 올바른 요청이면 DB에 저장
String encyptPw = pwEncoder.encode(m.getMemPassword()); //비밀번호 암호화
m.setMemPassword(encyptPw); //객체에 암호화된 패스워드 세팅
int result = memberMapper.register(m); //회원을 DB에 등록
//...
//회원가입이 성공하면 => 로그인 처리하기
return "redirect:/memLoginForm.do";
}
마이바티스 매퍼를 통해 DB에 비밀번호를 저장하기 전, 패스워드 인코더의 encode()
메서드를 통해 사용자로부터 입력받은 비밀번호를 암호화한 뒤 DB에 저장한다.
가입이 완료된 뒤 DB를 확인해보면 사용자가 입력한 비밀번호 그대로가 아닌 암호화되어 추정 불가능한 상태로 저장되어 있다. 가입한 사용자가 로그인할 때 입력한 비밀번호와 DB에 저장된 암호화된 비밀번호가 일치하는지 확인할 때는 패스워드 인코더가 제공하는 메서드를 사용하면 된다.
<select id="memLogin" parameterType="kr.board.entity.Member" resultMap="memberMap">
select * from mem_stbl mem LEFT OUTER JOIN mem_auth auth on
mem.memID=auth.memID where mem.memID=#{memID}
</select>
사용자가 로그인 요청을 하면 DB에서 로그인 ID와 일치하는 회원 정보를 검색해온다. 로그인 비밀번호는 컨트롤러에서 체크한다.
Member mvo = memberMapper.memLogin(m);
if (mvo != null && pwEncoder.matches(m.getMemPassword(), mvo.getMemPassword())) {}
컨트롤러에서 사용자가 입력한 로그인 비밀번호가 올바른지 확인하기 위해서는 패스워드 인코더의 matches()
메서드를 사용하면 된다.