하드코딩된 비밀: AI 에이전트가 자동으로 수정할 수 있는 #1 취약점
Source: Dev.to
문제
매주 비밀이 유출됩니다: GitHub에 커밋된 API 키, 설정 파일에 있는 데이터베이스 비밀번호, 환경 변수 기본값에 포함된 AWS 자격 증명.
수정은 간단하지만, 탐지는 쉽지 않습니다—특히 대규모 코드베이스에서는 더욱 그렇습니다.
전형적인 하드코딩된 비밀 패턴:
// ❌ 이것이 생각보다 더 많이 프로덕션에 배포됩니다
const db = new Pool({
host: 'prod-db.example.com',
user: 'admin',
password: 'super_secret_password_123', // CWE-798
});
const stripe = new Stripe('sk_live_abc123xyz789'); // 하드코딩된 API 키
개별적으로는 명확하지만, 50 000줄 규모의 저장소에서는 눈에 잘 띄지 않습니다.
기존 접근 방식
| 접근 방식 | 단점 |
|---|---|
grep "password" | 너무 많은 오탐 |
| 비밀 스캐너 | 커밋된 비밀만 감지 |
| 코드 리뷰 | 사람은 놓칠 수 있음 |
도구
eslint-plugin-secure-coding은 린팅 중에 하드코딩된 자격 증명을 감지하는 규칙 집합을 추가합니다. 오류 메시지는 AI가 활용하기 쉽게 포맷됩니다:
- CWE‑798 – 기계가 읽을 수 있는 취약점 ID
- 수정 지시 – 적용할 정확한 패턴
- 위치 – 정확한 라인과 컬럼
린트 출력 예시
src/db.ts
5:3 error 🔒 CWE-798 OWASP:A02 CVSS:7.5 | Hardcoded credential detected
Fix: Use environment variable: process.env.DATABASE_PASSWORD
보안 패턴
하드코딩된 값을 환경 변수로 교체합니다:
// ✅ 보안 패턴
const db = new Pool({
host: process.env.DATABASE_HOST,
user: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
});
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
Cursor, Copilot, Claude와 같은 AI 어시스턴트는 구조화된 오류를 읽고 인간 개입 없이 코드를 자동으로 수정할 수 있습니다.
설치
npm install --save-dev eslint-plugin-secure-coding
ESLint 설정에 권장 구성을 추가합니다:
// eslint.config.js
import secureCoding from 'eslint-plugin-secure-coding';
export default [secureCoding.configs.recommended];
그게 전부입니다—한 줄의 설정만으로 89개의 보안 규칙이 활성화되고 하드코딩된 비밀이 사라집니다.
자료
- npm 패키지: https://www.npmjs.com/package/eslint-plugin-secure-coding
- 규칙 문서:
no-hardcoded-credentials(플러그인에 포함)