우리가 웹사이트에 회원가입을 하는 과정에서 아이디, 비밀번호 등... 입력하게 된다.
비밀번호를 DB에 평문으로 저장하게 되면, 해커나 외부에서 DB에 접근하게 됬을 때 우리의 아이디와 비밀번호를 손쉽게 얻을 수 있다.
그렇게 되면 개인정보 유출, 금융 피해 같은 다양한 피해가 일어나게 된다.
이러한 사고를 방지하기 위하여 비밀번호를 암호화하여 DB에 저장해야 된다.
이 글에서는 JavaSpring에서 암호화 하는 과정을 보여주려고한다.
우선 순서로는
1. Security 의존성 추가
2. 암호화인코더 Bean 등록
3. 회원가입시 암호화 적용
4. DB 저장
JavaSpring 암호화 방법
1. Spring Security Dependency 추가
암호화해주는 인코더를 사용하기 위하여 필요합니다.
<!-- Maven -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
dependencies {
// Gradle
implementation 'org.springframework.boot:spring-boot-starter-security'
}
2. PasswordEncoder Bean 등록
Bean으로 등록하여 어디서든 주입받아서 사용할 수 있습니다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
3. 암호화 적용
Bean으로 등록된 PasswordEncoder를 주입 받아와
password.encdoe()를 사용하여 암호화를 하여 저장 합니다.
save를 하여 DB에 저장
@Service
@RequiredArgsConstructor
@Transactional
public class MemberService {
private final MemberRepository memberRepository;
private final PasswordEncoder passwordEncoder;
public void registerMember(MemberRegisterRequest memberRegisterRequest) {
String encodedPassword = passwordEncoder.encode(memberRegisterRequest.getMemberPassword());
Member member = new Member(
memberRegisterRequest.getMemberEmail(),
encodedPassword,
memberRegisterRequest.getMemberName(),
memberRegisterRequest.getMemberMobile()
);
memberRepository.save(member);
}
}
4. 로그인 검증
passwordEncoder.matches()를 사용하여 비밀번호 검증 가능.
@Service
@RequiredArgsConstructor
@Transactional
public class MemberService implements MemberServiceImpl {
private final MemberRepository memberRepository;
private final PasswordEncoder passwordEncoder;
@Override
public boolean login(String memberEmail, String memberPassword) {
Member member = memberRepository.findByMemberEmail(memberEmail)
.orElseThrow(() -> new RuntimeException("존재하지 않는 회원입니다."));
if (passwordEncoder.matches(memberPassword, member.getMemberPassword())) {
return true; // 비밀번호 일치시 true
} else {
// 비밀번호 불일치시 Exception
throw new RuntimeException("비밀번호가 올바르지 않습니다.");
}
}
}