[SpringSecurity] 비밀번호 암호화 (BCryptPasswordEncoder)
1. 서론
- 비밀번호 암호화 하는 이유
해커나 바이러스에 의해 db가 털렸을 경우 비밀번호가 암호화가 안 되어 있다고 가정하자.
해당 사이트 외에도 다른 사이트에서도 같은 비밀번호를 사용한 다면?
해당 사이트 외에도 다른 사이트의 정보가 털릴 위험성이 많기 때문에 해야 한다
2. BCryptPasswordEncoder
Spring Security 프레임워크에서 제공하는 클래스
1회 해쉬하는것이 아니라 솔트(salt)를 부여하여 여러번 해싱하여 안전하게 암호화 해준다
**해싱함수란?
키(KEY)값을 해시함수라는 수식에 대입시켜 계산한 후 나온 결과를 주소로 사용하여 바로 값(VALUE)에 접근하게 할 수 있는 방법
단방향이다 즉, 복호화가 불가능하다
해싱에는 치명적인 단점이 존재 한다 12345를 해싱한다고 하면 해싱값이 똑같이 나와 비교하거나 유추할수 있다
이러한 단점을 극복하고자 솔트를 사용
솔트 -> 해시함수를 돌리기 전에 원문에 임의의 문자열을 덧 붙이는 것
솔트를 사용하면 같은 값들이라도 임의의 문자열을 덧 붙여 해싱 하여도 결과값이 같지 않음
2 - 1. BCryptPasswordEncoder 메소드
BCryptPasswordEncoder은 총 3개의 메소드를 제공한다
1.String encode(CharSequence rawPassword)
패스워드를 암호화 해주는 메소드로, 8바이트 이상의 무작위로 생성된 솔트와 결합된 SHA-1이상의 해시를 적용
String 타입으로 반환해준다.
2. boolean matches(CharSequence rawPassword, String encodedPassword)
위에서 말 했다싶이 해싱함수는 단방향 이여서 디코딩 되지 않는다 즉, 아무도 암호화된 비밀번호를 풀지 않는다.
그러하여 풀수는 없지만 일치하는지 확인해주는 메소드 이다.
일치하지 않으면 false, 일치하면 true로 boolean형태로 반환
3. boolean upgradeEncoding(String encodedPassword)
보안을 위해 인코딩 된 암호를 다시 인코딩 해야 하는 경우 true를 반환하고, 그렇지 않으면 faslse를 반환.
기본 구현은 항상 false 이므로 오버라이딩 하여 encode된 암호의 안정성을 체크하는 로직을 직접 구현하여 사용
3. 예시
- 의존성 주입
우리가 사용 할 PasswordEncoder를 하려면 SpringSecurity에 의존성을 주입하여야 한다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
}
- SecurityConfiguration
SecurityConfgiruation에 PasswordEncoder의 구현 체를 스프링 빈으로 등록해준다.
BCrypt 해싱함수를 사용 하여 내 비밀번호와 저장소에 저장되어 있는 비밀번호의 일치 여부를 확인시켜 주는 메소드이다.
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfiguration {
...
@Bean
public PasswordEncoder getPasswordEncoder() {
return new BCryptPasswordEncoder();
}
}
- 회원가입시 비밀번호 DB 저장
@PostMapping("/signup")
public String signup(@Valid SignupDto signupDto, Errors errors) {
if (errors.hasErrors()) { //오류가 발생 하였을때
return "/member/signup";
}
signupDto.setPassword(passwordEncoder.encode(signupDto.getPassword()));
// 비밀번호를 passwordEncoder를 사용하여 암호화 된 비밀번호로 변경시켜준다.
memberService.save(signupDto);
// 암호화된 비밀번호를 포함한 데이터를 memeberService로 보내 데이터들을 저장 시켜준다.
return "redirect:/login";
}
회원가입을 진행 하였을때 회원이 작성한 데이터 들을 dto로 가져다 준다.
dto에서 가져온 암호화가 되지 않는 데이터를 passwordEncode로 암호화 하여 변경 해준 뒤
memberService에서 데이터들을 저장 해준다.
- 회원가입 후 db 화면 확인
일부러 비밀번호 똑같이 했는데 암호화된 결과값 다르게 나온거 확인 완료.