Vibe 코딩 앱에서 비밀 정보가 유출되기 전에 스캔하고 수정하는 방법
요약
AI 코딩 앱을 사용하면 기능 구현은 빠르지만, 하드코딩된 비밀 정보나 취약한 인증 같은 보안 문제가 코드에 은폐되기 쉽습니다. 따라서 배포 후의 감사보다 커밋 전 스캔 및 수정(scan-and-fix) 루프를 구축하는 것이 중요합니다.
핵심 포인트
- AI 코딩은 빠르지만, 하드코딩된 비밀 정보 유출 위험이 높다.
- 보안 점검은 출시 후가 아닌, 코딩 과정 중에 이루어져야 한다.
- gitleaks 같은 도구로 코드와 Git 히스토리의 모든 비밀 정보를 찾아내야 한다.
- pre-commit hook을 추가하여 커밋 전에 보안 검사를 자동화해야 한다.
요약 (TL;DR)
- Vibe 코딩된 앱은 빠르게 배포되며, 하드코딩된 비밀 정보(hardcoded secrets), 취약한 인증(weak auth), 주입 가능한 쿼리(injectable queries) 등을 정상적으로 작동하는 코드에 은폐합니다.
- 이것들을 포착하기 위해 보안팀이 필요하지 않습니다. 커밋하기 전에 한 번 스캔만 하면 대부분을 잡을 수 있습니다.
- 출시 후에 두려워하는 보안 감사가 아니라, 코딩하는 동안 실행되는 '스캔 및 수정(scan-and-fix)' 루프를 구축하세요.
지난달에 저는 친구가 Cursor에게 프롬프트만으로 완전히 만든 사이드 프로젝트를 물려받았습니다. 작동했습니다. 회원 가입, Stripe 결제 처리, 대시보드까지 모두 주말 안에 완성되었습니다. 그러고 나서 레포지토리를 열어봤습니다.
제가 가장 먼저 검색한 것은 'key'라는 단어였습니다. 14개의 결과가 나왔습니다. 설정 로더(config loader)에 있는 것도 아니고, 환경 변수에서 읽는 것도 아니었습니다. 소스 코드 내부에 하드코딩되어 있었고, 공개 GitHub 레포지토리에 커밋된 상태였습니다.
이것이 바로 Vibe 코딩을 할 때 아무도 경고해주지 않는 세금(tax)입니다. 앱이 작동하기 때문에 괜찮다고 가정합니다. 하지만 '작동한다'와 '배포해도 안전하다'는 두 가지 다른 주장이며, 그 사이의 간극이야말로 언어 모델이 결코 제대로 최적화되지 못한 부분입니다.
취약한 코드 예시
다음은 이 패턴을 보여주는 예시로, 죄를 짓게 만든 코드를 보호하기 위해 약간 수정했습니다:
// CWE-798: 하드코딩된 자격 증명 사용 (Use of Hard-coded Credentials)
const stripe = require('stripe')('sk_live_51H8xR2eZvKYlo2CqQf...');
...
이 서비스 역할(service_role) 키는 데이터베이스의 모든 행 수준 보안 규칙(row-level security rule)을 우회합니다. 이 키는 클라이언트와 인접한 파일에 놓여 있었고, Git 히스토리에는 영원히 남아있었습니다. 레포지토리를 복제(clone)한 사람은 누구나 프로덕션 데이터베이스에 대한 완전한 읽기 및 쓰기 권한을 갖게 됩니다.
왜 이런 일이 계속 발생하는가
AI 에디터에게
아무도 코드 샘플 안에 '그리고 이제 이것을 환경 변수로 옮기고 유출되면 회전시켜라'라는 문구를 작성하지 않습니다. 그래서 모델은 사용 가능한 코드를 제공하지만, 그 자체가 잠재적 위험(liability)이 되며, 이를 매우 확신하는 태도로 수행합니다. 경고는 없습니다. 앱은 실행됩니다.
해결책 (The fix)
해결책 자체는 지루한데, 그것이 요점입니다.
# 1. 코드와 git 히스토리 안에 있는 모든 비밀 정보를 찾는다
gitleaks detect --source . --verbose
...
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
# 3. 커밋에 한 번이라도 닿았던 모든 것을 회전시킨다. 손상되었다고 가정한다.
# 4. 다시는 이런 일이 일어나지 않도록 pre-commit hook을 추가한다
pip install pre-commit
...
이것의 걱정 없는 버전은 '실수하지 않는 것'이 아닙니다. 당신은 실수를 할 것입니다. 중요한 것은 '실수가 발생하는 즉시, 커밋에 도달하기 전에 포착되는 것'입니다. 이것이 전체 요령입니다. 구축하는 동안 스캔하고, 제자리에 수정하며, 다음 프롬프트로 넘어갑니다.
저는 이 작업을 위해 SafeWeave를 사용해 왔습니다. 이는 Cursor와 Claude Code에 MCP 서버로 연결되어 제가 넘어가기 전에 하드코딩된 비밀 정보, 주입 가능한 쿼리, 누락된 인증 확인 등을 플래그합니다. 그렇다고 해도, semgrep과 gitleaks를 사용한 기본적인 pre-commit hook만으로도 이 게시물에 있는 대부분의 것을 포착할 수 있습니다. 중요한 것은 어떤 도구를 사용하든 간에 일찍 포착하는 것입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기