d회원 가입 : 패스워드 인코더
절대로 패스워드를 평문으로 저장해서는 안된다.
> Account 엔티티를 저장할 때 패스워드 인코딩하기
스프링 시큐리티 권장 PasswordEncoder
> PasswordEncoderFactories.createDelegatingPasswordEncoder()
> 여러 해시 알고리즘을 지원하는 패스워드 인코더
> 기본 알고리즘 bcrypt
해싱 알고리즘 솔트(salt)
> 해싱 알고리즘을 쓰는 이유? jong123@naver.com /1234 -> aaabbb
> 솔트를 쓰는 이유? 1234 -> aaabbb 보안 취약 / 1234 + salt -> asgbd2
PasswordEncoder Bean생성
AppConfig.class
@Configuration
public class AppConfig {
@Bean
public PasswordEncoder passwordEncoder(){
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
}
입력받은 평문 pw → bcrypt인코딩
AccountService.class
@Service
@RequiredArgsConstructor
public class AccountService {
private final PasswordEncoder passwordEncoder;
...
private Account saveNewAccount(@Valid SignUpForm signUpForm) {
Account account = Account.builder()
.email(signUpForm.getEmail())
.nickname(signUpForm.getNickname())
.password(passwordEncoder.encode(signUpForm.getPassword())) //인코딩
.studyCreatedByWeb(true)
.studyEnrollmentResultByWeb(true)
.studyUpdatedByWeb(true)
.build();
return accountRepository.save(account);
}
test코드 작성
assertNotEquals 암호 인코딩이 되었다면 통과할 것이다.
@DisplayName("회원 가입 처리 - 입력값 오류")
@Test
void signUpSubmit_with_wrong_input() throws Exception{
mockMvc.perform(post("/sign-up")
.param("nickname", "jongwon")
.param("email", "jong9712@naver.com")
.param("password", "12345678")
.with(csrf()))
// .andExpect(status().isOk())
// .andExpect(view().name("account/sign-up"))
//--올바른 데이터를 입력했을 경우 redirect//
.andExpect(status().is3xxRedirection())
.andExpect(view().name("redirect:/"));
//암호 인코딩 되었는지 확인
Account account = accountRepository.findByEmail("jong9712@naver.com");
assertNotNull(account);
assertNotEquals(account.getPassword(), "12345678");
assertTrue(accountRepository.existsByEmail("jong9712@naver.com"));
then(javaMailSender).should().send(any(SimpleMailMessage.class));
}
참고
인프런 강의 - 스프링과 JPA 기반 웹 애플리케이션 개발
'Dot Programming > Spring Clone' 카테고리의 다른 글
[스프링 웹앱 프로젝트 #10]회원 가입 인증 메일 확인 테스트 및 리팩토링 (0) | 2020.11.19 |
---|---|
[스프링 웹앱 프로젝트 #9]회원 가입 인증 메일 확인 (0) | 2020.11.19 |
[스프링 웹앱 프로젝트 #7]회원가입 : 리팩토링 및 테스트 (0) | 2020.11.18 |
[스프링 웹앱 프로젝트 #6]회원가입 폼 서브밋 처리 (0) | 2020.11.05 |
[스프링 웹앱 프로젝트 #5]회원 가입 폼 서브밋 검증 (0) | 2020.11.03 |