설명
비밀번호 인증을 기대하는 연결 설정에서 password나 passphrase를 빈 값으로 두면 정상 인증에 실패하거나, 서버가 빈 비밀번호를 허용하는 경우 허술한 자격 증명으로 연결할 수 있습니다. 클라이언트 설정을 비웠다는 사실만으로 서버 인증이 꺼지는 것은 아닙니다. 실제 서버 계정의 인증 방식과 빈 값 허용 여부를 함께 확인해야 합니다.
잠재적 영향
- 빈 비밀번호를 허용하는 계정과 연결 경로가 있으면 허용되지 않은 사용자가 접근할 수 있습니다.
- 획득한 계정 권한에 따라 데이터 조회·변경·삭제, 메일 발송이나 큐 사용 등의 피해가 발생할 수 있습니다.
- 서버가 빈 값을 거부하면 애플리케이션 연결 실패와 서비스 장애가 발생할 수 있습니다.
해결 방법
- 비밀번호 인증을 사용하는 경우 빈 값이나 기본 비밀번호를 사용하지 말고 서비스에 적합한 강도의 비밀 값을 공급하세요.
- 비밀번호를 코드나 저장소에 하드코딩하지 말고, 보호된 환경 변수나 AWS Secrets Manager·Vault 같은 비밀 저장소에서 불러오세요.
- 시작 시 필요한 비밀번호가 없거나 비어 있으면 연결 전에 실패하도록 하세요. 비밀번호를 사용하지 않는 인증 방식은 그 방식에 맞는 자격 증명과 정책을 확인하세요.
예시
변경 전
javascript
// bad: 설정 객체에 빈 password 사용
const mysql = require("mysql2/promise");
const config = {
host: "db.internal",
user: "app_user",
password: "", // 빈 비밀번호: 실제 허용 여부는 서버 인증 설정에 달림
database: "app",
};
async function connect() {
const conn = await mysql.createConnection(config);
console.log("connected");
}
connect().catch(console.error);
변경 후
javascript
// good: Secret은 환경 변수/시크릿 매니저에서 로딩하고, 비어 있으면 시작 차단
const mysql = require("mysql2/promise");
function requiredEnv(name) {
const v = process.env[name];
if (!v || v.trim().length === 0) {
throw new Error(`Missing required secret: ${name}`);
}
return v;
}
const dbPassword = requiredEnv("DB_PASSWORD");
const config = {
host: process.env.DB_HOST || "db.internal",
user: process.env.DB_USER || "app_user",
password: dbPassword,
database: process.env.DB_NAME || "app",
};
async function connect() {
const conn = await mysql.createConnection(config);
console.log("connected");
}
connect().catch((err) => {
// 보안상 민감한 값은 로깅 금지
console.error("DB 연결 실패:", err.message);
process.exit(1);
});
설명:
- 변경 전: 클라이언트가 빈 비밀번호를 전달합니다. 서버 계정이 이를 허용하면 약한 자격 증명을 사용하게 되고, 허용하지 않으면 연결에 실패합니다.
- 변경 후: 필요한 비밀번호를 환경 변수에서 읽고 빈 값이면 연결 전에 중단합니다. 환경 변수의 공급·접근 권한과 실제 서버 인증 설정도 보호해야 합니다.