스프링 미니 프로젝트 - 암호화(BCryptPasswordEncoder)

Zyoon·2025년 5월 22일

미니프로젝트

목록 보기
10/35
post-thumbnail

📘BCryptPasswordEncoder 사용하여 비밀번호 암호화 기능 구현


0. 비밀번호 암호화

📗JPA 사용한 로그인 기능

  • 로그인 시 비밀번호를 그대로 DB에 노출하게 되면 보안상 위험하기 때문에 암호화를 해준다.
  • BCryptPasswordEncoderSpring Security 에서 제공하는 비밀번호 암호화 기능이다.
  • BCrypt 알고리즘을 기반으로 동작

1. 초기 설정

  • 우선 gradle 에 의존성을 추가해준다.
//기능 전체를 사용하고 싶다면 이 구문을 추가한다.(보안 및 인증/인가 기능이 활성화된다.)
implementation 'org.springframework.boot:spring-boot-starter-security'

//개발단계에서 암호화만 사용하고 싶다면 이 구문만 추가해준다.
implementation 'org.springframework.security:spring-security-crypto'

2. Config 추가

  • BCryptPasswordEncoderBean으로 등록하는 설정을 위해 클래스를 만들어준다.
  • Configuration 으로 Spring 설정 클래스로 만들어주고 메서드는 Bean으로 등록해준다.
  • 그리고 Spring Security에서 제공하는 비밀번호 암호화 인터페이스를 만들어준다.
@Configuration
public class SecurityConfig {
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

3. 암호화 클래스

  • PasswordEncoder 인터페이스를 활용하여 비밀번호를 암호화 및 확인해주는 클래스를 생성한다.
  • encode() 는 비밀번호를 BCrypt 형식으로 암호화를 시켜준다.
  • matches() 는 입력받은 문자열을 암호화된 문자열과의 일치여부를 확인해준다.
  • matches() 를 사용할때 첫번째 파라미터는 암호화되지 않은 문자열(ex:password123)을 넣어주고, 두번째 파라미터에는 암호화된 문자열을 넣어줘야 한다.
@Component
@RequiredArgsConstructor
public class PasswordManager {

    private final PasswordEncoder passwordEncoder;
		//암호화
    public String encodePassword(String rawPassword){
        return passwordEncoder.encode(rawPassword);
    }
		//암호화된 비밀번호와 입력한 비밀번호 확인
    public boolean isPasswordMatch(String inputPassword, String encodedPassword){
        return passwordEncoder.matches(inputPassword, encodedPassword);
    }
}

4. 사용 예시

  • signUp 메서드에 암호화 기능을 추가했다.
@Transactional
public void signUp(SignUpRequestDto requestDto) {
		//암호화 기능 추가
    String encodedPassword = passwordManager.encodePassword(requestDto.getPassword());

    User user = new User(requestDto.getUsername(), requestDto.getEmail(), encodedPassword);

    try {
        userRepository.save(user);
    }catch (DataIntegrityViolationException e) {
        throw new CustomException(HttpStatus.CONFLICT, "이미 존재하는 사용자입니다.");
    }
}
  • DB 에는 암호화된 비밀번호를 확인할 수 있다.

  • Login 메서드에 isPasswordMatch 함수를 사용하여 암호화된 비밀번호가 매칭되는지 확인해준다.
  • requestDto.getPassword() : 암호화 되지 않은 상태의 입력받은 비밀번호
  • user.getPassword() : 암호화된 비밀번호
public LoginResponseDto login(LoginRequestDto requestDto) {

    User user = userRepository.findByEmail(requestDto.getEmail())
            .orElseThrow((
            )->new CustomException(HttpStatus.NOT_FOUND, "유저 정보가 없습니다."));
		//암호화된 비밀번호 확인
    if(!passwordManager.isPasswordMatch(requestDto.getPassword(), user.getPassword())){
        throw new CustomException(HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지 않습니다.");
    }

    return new LoginResponseDto(user.getId());
}
  • 비밀번호가 일치하면 200 OK 와 함께 로그인 성공 메세지를 확인할 수 있다.

profile
기어 올라가는 개발

0개의 댓글