본문 바로가기
스프링과 JPA 기반 웹 어플리케이션 개발/1부 (개발환경, 회원가입, 로그인, 계정설정)

07. 회원 가입: 패스워드 인코더

by Backchus 2020. 4. 18.

절대로 패스워드를 평문으로 저장해서는 안 됩니다.

  • Account 엔티티를 저장할 때 패스워드 인코딩 하기

스프링 시큐리티 권장 PasswordEncoder

  • PasswordEncoderFactories.createDelegatingPasswordEncode()
  • 여러 해시 알고리듬을 지원하는 패스워드 인코더
  • 기본 알고리든 bcrypt

해싱 알고리듬(bcrypt)과 솔트(salt)

  • 해싱 알고리듬을 쓰는 이유? 1234567 => aaaabbbb 이런식으로 암호화 하기 위해서
  • 솔트를 쓰는 이유? 해당 문자열에 대해 암호화를 여러번 해본경우 aaaabbbb => 1234567이라는 것을 알아낼 수 있다. 따라서 저장할때 1234567 + salt값 => aaafwefqwefasdf 전혀 다른 값이 나오도록하면 1234567 => aaaabbbb처럼 일치하는 값을 찾기가 어려워 진다.

 

PasswordEncoder 설정

package me.weekbelt.studyolle.config;

@Configuration
public class AppConfig {
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }
}

 

Account 엔티티를 저장할때 Password를 인코딩

package me.weekbelt.studyolle.account;

@RequiredArgsConstructor
@Service
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()))     // 패스워드 인코딩
                .emailVerified(false)
                .studyEnrollmentResultByWeb(true)
                .studyUpdatedByWeb(true)
                .build();

        return accountRepository.save(account);
    }
    
    // 기존 코드 ...........

}

 

패스워드 인코딩이 되었는지 확인하기 위한 테스트 코드 추가

AccountRepository에 findByEmail()메소드 추가

package me.weekbelt.studyolle.account;

@Transactional(readOnly = true)
public interface AccountRepository extends JpaRepository<Account, Long> {

    // 기존코드 .....

    Account findByEmail(String email);
}

 

패스워드 인코딩 확인 코드 추가

package me.weekbelt.studyolle.account;

@AutoConfigureMockMvc
@SpringBootTest
class AccountControllerTest {

	// 기존코드 .........
    
    @DisplayName("회원 가입 처리 - 입력값 정상")
    @Test
    public void signUpSubmit_with_correct_input() throws Exception {
        // 기존코드 ........

        // 저장된 계정의 Password값이 인코딩이 되어있는지 확인
        Account account = accountRepository.findByEmail("vfrvfr4207@hanmail.net");
        assertThat(account).isNotNull();
        assertThat(account.getPassword()).isNotEqualTo("12345678");
        assertThat(account.getEmailCheckToken()).isNotNull();

        // 기존코드 ...........

    }

}

 

 

 

참고: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-JPA-%EC%9B%B9%EC%95%B1#

 

스프링과 JPA 기반 웹 애플리케이션 개발 - 인프런

이 강좌에서 여러분은 실제로 운영 중인 서비스를 스프링, JPA 그리고 타임리프를 비롯한 여러 자바 기반의 여러 오픈 소스 기술을 사용하여 웹 애플리케이션을 개발하는 과정을 학습할 수 있습니다. 이 강좌를 충분히 학습한다면 여러분 만의 웹 서비스를 만들거나 취직에 도움이 될만한 포트폴리오를 만들 수 있을 겁니다. 활용 웹 개발 프레임워크 및 라이브러리 Java Spring Spring Boot Spring Data JPA Thymeleaf 온라인 강의 스

www.inflearn.com