하드코딩된 비밀번호 사용 (Hardcoded Password)

Use of Hard-Coded Password

설명

코드 내에 하드코딩된 비밀번호를 포함하면 보안 사고 발생 시 쉽게 유출될 위험이 있습니다.
하드코딩된 비밀번호는 소스 코드 저장소(GitHub, GitLab 등)에 노출될 가능성이 크며,
공격자가 이를 활용하여 시스템에 불법적으로 접근할 수 있습니다.

비밀번호는 코드에 넣지 말고 비밀 저장소나 접근이 제한된 런타임 설정에서 읽어야 합니다.

잠재적 영향

  • 비밀번호 노출: 코드가 유출되거나 버전 관리 시스템(Git 등)에 포함되면 비밀번호가 노출될 가능성이 있음.
  • 자동화 공격: 공격자가 코드에서 비밀번호를 추출하여 자동화된 로그인 공격을 수행할 수 있음.
  • 비밀번호 변경 어려움: 코드 내에 하드코딩된 비밀번호를 수정하려면 소스 코드를 변경하고 다시 배포해야 함.

해결 방법

  1. 비밀번호를 코드에 직접 포함하지 않기

    • 비밀 저장소나 런타임 설정에서 읽고, 이미 노출된 비밀번호는 교체합니다.
  2. 용도에 맞는 비밀 저장소 사용

    • HashiCorp Vault 같은 비밀 관리 기능으로 비밀번호를 보관하고 접근을 제한합니다. AWS KMS와 Google Cloud KMS는 암호화 키를 관리하며, 비밀번호를 저장하는 기능과 구분해야 합니다.
  3. 환경 변수 또는 구성 파일 보호

    • .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, ...)은 빈 키 저장소를 초기화합니다. 기존 키 저장소 파일을 여는 예시는 아닙니다.

참조