웹 개발

[Backend] 비밀번호 암호화

_KH_ 2025. 5. 19. 16:12

1. 스프링 부트에 내장된 암호화 라이브러리 : BCryptPasswordEncoder 클래스

public class BCryptPasswordEncoder {

    public String encode(CharSequence rawPassword) {
        // 내부적으로 salt + 해시 처리
    }

    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        // 해시된 비밀번호와 입력값 비교 (같은 salt로 해시해서)
    }
}

메서드까지 전부 내장되어 있음. 형식 그대로 따라 쓰면 된다!

내장된 클래스는 구글링 등으로 찾아서 쓰면 된다.

메서드도 함께 찾아보고 사용할 것.


2. SecureRandom 클래스

  • SecureRandom: Java 표준 라이브러리(java.security 패키지)에 포함된 클래스
  • 암호 관련 보안이 중요한 기능(비밀번호, 인증번호, 토큰 등)에 사용
  • import 필요
import java.security.SecureRandom;

 


3. PasswordGeneratorUtil에서 @Component가 필요하지 않은 이유

모두 static 메서드로 이루어져 있기 때문이다!! 즉, new 하지도 않고, @Autowired로 주입받지도 않는다.

⇒ 굳이 스프링이 관리하지 않아도 되니까 @Component가 필요 없다.

Util 클래스는 대부분 @Component 안 붙인다.

 


4. StringBuilder란?

: 문자열을 효율적으로 이어붙일 수 있게 해주는 클래스

StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append("World");
System.out.println(sb.toString()); // HelloWorld

일반 문자열(String)은 + 연산을 하면 매번 새로운 문자열을 만들지만, StringBuilder는 한 객체 안에서 문자열을 계속 추가해서 성능이 좋다.

+) append() 메서드는 random 클래스와는 상관없고, StringBuilder 클래스 안에 포함된 메서드이다.

⇒ 문자열 끝에 새로운 글자를 붙이는 메서드


5. CharAt()이란? 

 

charAt(index): 문자열에서 특정 위치의 글자 1개(char)를 가져오는 메서드

  • 문자열에서 원하는 위치의 글자를 뽑을 때 사용
String text = "apple";
char c = text.charAt(0); // 'a'
char d = text.charAt(3); // 'l'

6. 비밀번호 랜덤 섞기 로직

// 랜덤하게 섞기
		String result = password.toString();
		// 현재 upper, lower, .. 차례대로 배열되어 있는 상태이므로 섞음
		StringBuilder shuffledPassword = new StringBuilder(result);
		for (int i = 0; i < result.length(); i++) {
			int j = random.nextInt(result.length());
			char temp = shuffledPassword.charAt(i);
			shuffledPassword.setCharAt(i, shuffledPassword.charAt(j));
			shuffledPassword.setCharAt(j, temp);
		}

		return shuffledPassword.toString();
		// 최종적으로 랜덤하게 섞인 비밀번호를 문자열로 반환
  • 글자들의 순서를 바꿔서 비밀번호를 섞는 작업
  • 글자 하나를 기준으로 잡고 → 랜덤 위치의 글자랑 자리 바꾸기
  • 이걸 전체 글자에 대해 반복하면 순서가 완전히 섞인다.