설명
코드 내에 하드코딩된 비밀번호를 포함하면 보안 사고 발생 시 쉽게 유출될 위험이 있습니다.
하드코딩된 비밀번호는 소스 코드 저장소(GitHub, GitLab 등)에 노출될 가능성이 크며,
공격자가 이를 활용하여 시스템에 불법적으로 접근할 수 있습니다.
비밀번호는 코드에 넣지 말고 비밀 저장소나 접근이 제한된 런타임 설정에서 읽어야 합니다.
잠재적 영향
- 비밀번호 노출: 코드가 유출되거나 버전 관리 시스템(Git 등)에 포함되면 비밀번호가 노출될 가능성이 있음.
- 자동화 공격: 공격자가 코드에서 비밀번호를 추출하여 자동화된 로그인 공격을 수행할 수 있음.
- 비밀번호 변경 어려움: 코드 내에 하드코딩된 비밀번호를 수정하려면 소스 코드를 변경하고 다시 배포해야 함.
해결 방법
-
비밀번호를 코드에 직접 포함하지 않기
- 비밀 저장소나 런타임 설정에서 읽고, 이미 노출된 비밀번호는 교체합니다.
-
용도에 맞는 비밀 저장소 사용
- HashiCorp Vault 같은 비밀 관리 기능으로 비밀번호를 보관하고 접근을 제한합니다. AWS KMS와 Google Cloud KMS는 암호화 키를 관리하며, 비밀번호를 저장하는 기능과 구분해야 합니다.
-
환경 변수 또는 구성 파일 보호
.env파일이나 OS 환경 변수로 값을 전달할 때도 실제 비밀번호를 저장소에 커밋하지 말고 파일과 실행 환경의 접근 권한을 제한합니다.
예시
변경 전
java
import java.security.KeyStore;
public class InsecurePasswordExample {
public void loadKeyStore() throws Exception {
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(null, "hardcoded_password".toCharArray()); // 하드코딩된 비밀번호
}
}
변경 후
java
import java.security.KeyStore;
public class SecurePasswordExample {
public void loadKeyStore() throws Exception {
String password = System.getenv("KEYSTORE_PASSWORD"); // 환경 변수에서 비밀번호 로드
if (password == null) {
throw new SecurityException("Keystore password is not set");
}
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(null, password.toCharArray());
}
}
설명:
- 변경 전:
keyStore.load(null, "hardcoded_password".toCharArray());에 비밀번호가 직접 포함되어 있습니다. - 변경 후:
System.getenv("KEYSTORE_PASSWORD")로 런타임 값을 읽습니다. 환경 변수에 접근할 수 있는 주체도 제한해야 합니다.
두 예시의 load(null, ...)은 빈 키 저장소를 초기화합니다. 기존 키 저장소 파일을 여는 예시는 아닙니다.