본문 바로가기

Dot Programming/Spring Clone

[스프링 웹앱 프로젝트 #8]회원 가입 패스워드 인코딩

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 기반 웹 애플리케이션 개발