웹 애플리케이션에서 사용자의 비밀번호를 암호화하지 않고 저장한다면 보안 문제가 발생할 수 있습니다.
데이터베이스가 해킹당하면 사용자의 비밀번호가 그대로 노출될 수 있기 때문입니다.
이를 방지하기 위해 Spring Boot 비밀번호 암호화 기능을 구현해야 합니다.
이번 글에서는 BCrypt와 PasswordEncoder를 사용해 비밀번호 암호화 및 비밀번호 검증 과정을 소개하겠습니다.
🔨 개발 환경 및 사전 준비
- Spring Boot 3.0+
- Java 11 이상
- Gradle 프로젝트
- at.favre.lib:bcrypt 라이브러리 사용
build.gradle에 의존성 추가
implementation 'at.favre.lib:bcrypt:0.10.2'
🔍 PasswordEncoder 클래스 구현하기
BCrypt 라이브러리를 사용해 비밀번호를 암호화하는 PasswordEncoder 클래스를 만들어 보겠습니다.
config 패키지에 클래스를 생성합니다.
import at.favre.lib.crypto.bcrypt.BCrypt;
import org.springframework.stereotype.Component;
@Component
public class PasswordEncoder {
public String encode(String rawPassword) {
return BCrypt.withDefaults().hashToString(BCrypt.MIN_COST, rawPassword.toCharArray());
}
public boolean matches(String rawPassword, String encodedPassword) {
BCrypt.Result result = BCrypt.verifyer().verify(rawPassword.toCharArray(), encodedPassword);
return result.verified;
}
}
`encode(String rawPassword)`
사용자가 입력한 원본 비밀번호를 BCrypt 알고리즘으로 암호화합니다.
`matches(String rawPassword, String encodedPassword)`
암호화된 비밀번호와 입력한 비밀번호가 일치하는지 비교합니다.
💡 비밀번호 암호화를 서비스 계층에 적용 - 예시
비밀번호 암호화는 서비스(Service) 계층에서 처리하는 것이 좋은 설계 방식입니다.
아래 예제에서는 UserService에서 비밀번호 암호화와 검증을 구현해 보겠습니다.
@Service
public class UserService {
private final PasswordEncoder passwordEncoder;
public UserService(PasswordEncoder passwordEncoder) {
this.passwordEncoder = passwordEncoder;
}
// 유저 정보 저장
public void registerUser(String username, String rawPassword) {
// 입력한 비밀번호를 암호화된 비밀번호로 저장
String encodedPassword = passwordEncoder.encode(rawPassword);
System.out.println("암호화된 비밀번호: " + encodedPassword);
}
// 유저 정보로 로그인
public boolean login(String username, String rawPassword, String storedEncodedPassword) {
// 입력한 비밀번호와 암호화된 비밀번호가 동일한지 비교
return passwordEncoder.matches(rawPassword, storedEncodedPassword);
}
}
Spring Boot에서 비밀번호 암호화는 보안을 강화하고 사용자의 정보를 보호하는 핵심 요소입니다.
이번 글에서 BCrypt와 PasswordEncoder를 사용해 비밀번호를 암호화하고 검증하는 과정을 살펴보았습니다.
이 방식을 활용하면 데이터 유출 시에도 사용자의 비밀번호가 안전하게 보호됩니다.
이번 글에서는 비밀번호 암호화와 검증 방법을 살펴보았지만,
더 나아가 Spring Security를 활용해 인증과 권한 관리를 함께 구성하는 것도 추천합니다.
예를 들어, 비밀번호 재설정 기능이나 JWT(JSON Web Token)를 이용한 토큰 기반 인증을 추가하면
더 완성도 높은 보안 구조를 구축할 수 있습니다.