절대로 패스워드를 평문으로 저장해서는 안 됩니다.
- 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
'스프링과 JPA 기반 웹 어플리케이션 개발 > 1부 (개발환경, 회원가입, 로그인, 계정설정)' 카테고리의 다른 글
09. 회원 가입: 인증 메일 확인 테스트 및 리팩토링 (0) | 2020.04.18 |
---|---|
08. 회원 가입: 인증 메일 확인 (0) | 2020.04.18 |
06. 회원 가입: 리팩토링 및 테스트 (0) | 2020.04.17 |
05. 회원 가입: 폼 서브밋 (0) | 2020.04.17 |
04. 회원가입 뷰 (0) | 2020.04.17 |