본문 바로가기
💻 하나씩 차곡차곡/Back-end

[스프링 시큐리티] 비밀번호 암호화 하기 (BCryptPasswordEncoder)

by 뚜루리 2025. 4. 22.
728x90
320x100

 

1. 비밀번호 암호화란?

비밀번호 **암호화(Encryption)**는 사용자의 비밀번호를 데이터베이스에 저장할 때 읽을 수 없는 형태로 바꾸는 것.

  • 하지만 정확히 말하면, 우리가 흔히 사용하는 방식은 암호화(Encryption)가 아니라 해싱(Hashing).
  • 해싱은 한 방향으로만 변환되는 방식이라 복호화(다시 원래 값으로 되돌리는 것)가 불가능
  • 예를 들어, abc123 → e99a18c428cb38d5f260853678922e03 처럼 변환.

 


 

2. 왜 암호화(해싱)가 필요한가?

🙅 저장 시 평문(원래 비밀번호)을 쓰면 안 되는 이유

  • 해커가 DB를 탈취하면 사용자 비밀번호가 그대로 노출됨.
  • 사람들은 비밀번호를 여러 사이트에 재사용하기 때문에 2차 피해로 이어질 수 있음.

✅ 해싱을 하면?

  • 설령 DB가 유출되어도 해커는 원래 비밀번호를 알 수 없음.
  • 보안을 지키는 데 필수적인 조치

 


 

3. 구현방법 

  • Spring Security에서 BCryptPasswordEncoder(비크립트 패스워드 인코더)를 사용하여 구현
  • BCrypt는 자동으로 Salt도 추가해주기 때문에 보안성이 더 높음.
    • Salt : 같은 비밀번호라도 결과를 다르게 만드는 무작위 문자열 (BCrypt는 내부적으로 자동 적용)

1. 의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-security'

 

2. 설정 클래스에 Bean 등록

@Configuration
public class SecurityConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

 

3. 회원가입 시 비밀번호 암호화

User user = User.builder()
        .email(request.getEmail())
        .password(passwordEncoder.encode(request.getPassword()))
        .build();

 

4. 로그인 시 비밀번호 비교

if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) {
    throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
}
  • passwordEncoder.encode(raw)를 여러 번 호출하면 결과가 계속 다르므로 로그인 시 matches()로만 비교해야 함

 


BCryptPasswordEncoder를 사용하는 이유

  • Salt 자동 적용 (같은 비밀번호라도 결과가 다름)
  • 느린 계산으로 해킹 어렵게 만듦
  • 스프링에서 공식 지원, 사용 편리
  • 고정 길이 결과로 관리 쉬움
728x90
320x100