반응형
문제
간편결제를 구현하기 위해 6자리 숫자 비밀번호를 도입했다. 근데 평문으로 저장할 순 없으니 암호화를 해야 하는데, 스프링 시큐리티까지는 필요 없이 비밀번호 암호화만 하면 되었다.
해결
dependencies {
// ...
// spring security crypto
implementation 'org.springframework.security:spring-security-crypto' // 여기 !!!
// ...
}
spring-security-crypto 라이브러리를 의존한다.
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 PasswordEncoderConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
시큐리티 없이 PasswordEncoder를 이용할 수 있다!
import java.util.regex.Pattern;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import radiata.common.exception.BusinessException;
import radiata.common.message.ExceptionMessage;
@Service
@RequiredArgsConstructor
public class PayUserValidator {
private static final Pattern PASSWORD_PATTERN = Pattern.compile("^[0-9]{6}$");
private final PasswordEncoder passwordEncoder;
public void validatePassword(String payUserPassword, String inputPassword) {
if (!PASSWORD_PATTERN.matcher(inputPassword).matches()) {
throw new BusinessException(ExceptionMessage.INVALID_PASSWORD);
}
if (!passwordEncoder.matches(inputPassword, payUserPassword)) {
throw new BusinessException(ExceptionMessage.INVALID_PASSWORD);
}
}
}
검증할 땐 우선 숫자 6자리인지 검증 후, 그 비밀번호가 DB에 저장된 비밀번호와 맞는지 확인하도록 했다.
반응형
'TIL ✍️' 카테고리의 다른 글
TIL #116 : 스프링/도커컴포즈에 Graceful shutdown 적용하기 (1) | 2024.11.13 |
---|---|
TIL #115 : 자바에서 offset 있는 DateTime 파싱하기 (0) | 2024.11.13 |
TIL #113 : Assertj로 LocalDateTime.now() 단위 테스트 코드 작성하기 (0) | 2024.11.13 |
TIL #112 : 자바 애플리케이션을 도커 이미지로 만들 때 용량 줄이기 (6) | 2024.11.13 |
TIL #111 : ID를 가진 JPA 엔티티 생성 시 SELECT 문이 나가는 문제 (2) | 2024.11.11 |