바이브 코딩 (Vibe Coding)의 속도 위험성
요약
Andrej Karpathy가 정의한 '바이브 코딩(Vibe Coding)'의 위험성을 분석합니다. AI가 생성한 코드를 인간이 검토 없이 빠르게 배포하면서 발생하는 보안 및 성능 문제와 '생성 시간 경고의 간극'을 경고합니다.
핵심 포인트
- 바이브 코딩은 검증 과정을 생략하고 속도에만 집중하는 개발 방식임
- AI는 보안 취약점이 포함된 코드를 경고 없이 생성할 수 있음
- 모델은 통계적 패턴을 따를 뿐, 배포 문맥이나 보안 규약을 인지하지 못함
- 코드 리뷰와 보안 감사 단계가 압축되면서 구조적 보안 위험이 발생함
Andrej Karpathy는 2025년 2월 이 용어를 만들었으며, 그 정의는 당혹스러울 정도로 간단했습니다. 당신이 원하는 것을 설명하면, AI가 그것을 작성하고, 당신은 거의 읽지 않습니다. 코드는 빠르게 배포됩니다. 버그도 마찬가지입니다.
그 간극 — 확신에 찬 생성, 보안에 대한 침묵 — 이 바로 속도 위험 (velocity risk)입니다. 이는 이론이 아닙니다. BrassCoders가 15개의 AI 생성 Python 파일을 스캔한 결과, 9개에서 실제 보안 또는 성능 문제를 발견했으며, 어떤 경우에도 모델로부터 생성 시간 동안의 경고는 전혀 없었습니다.
바이브 코딩 (Vibe Coding)이란 실제로 무엇인가
BrassCoders는 이 관행을 Karpathy의 2025년 2월 포스트로 직접 연결합니다. 개발자가 저작권을 AI에 양도하고, 출력물을 바이브 체크 (vibe-check)한 뒤 배포하는 것입니다. "AI의 도움을 받아 검토하는 것"이 아닙니다. "AI가 초안을 작성하고 인간이 편집하는 것"도 아닙니다. 바이브 코딩의 핵심은 인간이 코드를 거의 읽지 않는다는 점입니다. 속도가 가치 제안 (value proposition)이며, 검증 (verification)이 압축되는 대상입니다.
그 설명은 실제 워크플로우를 포착합니다. 프로토타입 속도로 작동하는 1인 개발자와 소규모 팀은 종종 정확히 이러한 트레이드오프 (tradeoff)를 선택합니다. 빈 페이지 문제 (blank page problem)가 사라집니다. 어떤 구현이든 첫 80%가 몇 분 만에 도착합니다. 이것들은 진정한 장점입니다.
바이브 코딩이 제공하지 못하는 것은 검토 (review)입니다. AI는 자신감은 있지만 문맥(context)이 없는 협업자가 하는 방식대로 코드를 생성합니다. 즉, 당신의 배포 문맥, 데이터 볼륨, 또는 비밀 관리 규약 (secret management conventions)에 대한 지식 없이, 훈련 데이터로부터 그럴듯한 패턴을 빠르게 적용하여 조립합니다. 모델은 통계적으로 프롬프트에 부합하는 것을 생성합니다. 안전한 코드와 그럴듯해 보이는 코드는 대부분의 경우 겹치지만, 항상 그런 것은 아닙니다.
Simon Willison은 AI 보조 코딩에 대한 우려를 다룬 2024년 포스트에서 이를 직접적으로 언급했습니다. 도구는 그럴듯해 보이는 코드를 생성하고, 이를 주의 깊게 읽지 않는 개발자는 보안 문제를 잡아내지 못하며, 그 문제는 배포됩니다. 바이브 코딩은 이것을 우연이 아닌 구조적인 문제로 만듭니다.
생성 시간 경고의 간극
BrassCoders는 생성 시간 경고의 간극(generation-time warning gap)을 바이브 코딩 (vibe-coding) 보안의 핵심 문제로 다룹니다. 즉, 모델이 보안에 취약한 패턴을 생성하는 시점과 누군가가 이를 발견하는 시점 사이의 간극을 말합니다. 표준적인 개발 워크플로우에서는 코드 리뷰 (code review), 보안 감사 (security audit), CI 내의 스캐너 (scanner) 등을 통해 결국 이 간극이 메워집니다. 하지만 바이브 코딩은 이 모든 단계들을 압축해 버립니다.
모델 자체가 이 간극을 메우지는 않습니다. 개발자가 명시적으로 보안 리뷰를 요청하지 않는 한 — 때로는 요청하더라도 — 모델은 해당 작업에 대해 통계적으로 가장 흔한 완성형을 생성합니다. 학습 데이터에는 보안에 취약한 패턴이 흔하게 포함되어 있습니다. 문자열 포매팅 (string formatting)을 통해 SQL 쿼리를 구축하는 Flask 엔드포인트는 모델이 학습한 코퍼스 (corpus) 내에서 드문 일이 아닙니다. 모델은 주저함도, 경고도 없이 이를 생성합니다.
이는 능력의 결여가 아닙니다. 자신의 코드를 리뷰하도록 요청받은 프런티어 모델 (frontier model)은 요청 시 보안 문제를 잡아낼 수 있습니다. BrassCoders의 바이브 코딩 안전망 (vibe-coding-safety-net) 벤치마크는 바로 이 점을 발견했습니다. 하드코딩된 자격 증명 (hardcoded credential)이 포함된 코드를 생성했던 바로 그 모델이, 리뷰를 요청받았을 때는 이를 식별해 낸 것입니다. 간극은 모델이 무엇을 아느냐의 문제가 아니라, 바이브 코딩 워크플로우가 모델에게 무엇을 요구하느냐의 문제입니다.
그 결과는 구조적인 침묵입니다. 코드는 배포됩니다. 문제는 존재합니다. 하지만 아무도 알지 못합니다.
N=15 코퍼스 (Corpus) 연구 결과
BrassCoders는 재현 가능한 코퍼스 연구를 발표했습니다. 이는 AI 어시스턴트가 현실적인 코딩 프롬프트 (웹 핸들러, 데이터 처리, 서브프로세스 호출, 인증, 설정 등)로부터 생성한 15개의 Python 파일로 구성되었으며, 첫 번째 스캔이 실행되기 전에 사전 등록된 후 brasscoders --offline scan으로 스캔되었습니다. 주요 데이터는 발견율 (finding rate)입니다.
전체 결과와 재현 방법은 ai-python-static-analysis-benchmark 포스트에서 확인할 수 있습니다.
15개 파일에 걸쳐 53개의 발견 사항이 있었습니다. 모든 파일에 최소 하나 이상의 문제가 있었습니다. 분류 (Triage) 결과, 15개 중 9개에서 실제 보안 또는 성능 문제가 발견되었습니다. 대표적인 사례로는 문자열 포매팅 (String formatting)으로 구축된 SQL 인젝션 (SQL injection), shell=True를 통한 커맨드 인젝션 (Command injection), 하드코딩된 자격 증명 (Hardcoded credentials), 안전한 로더 (Safe loader) 없는 yaml.load, 타임아웃 (Timeout)이 없는 requests 호출, 핸들러 내 Flask debug=True 설정 등이 있었습니다.
코드가 작성될 때 이 중 단 하나도 경고를 생성하지 않았습니다. 모델은 이를 생성하고, 코드를 반환한 뒤, 멈췄습니다.
이 코퍼스 (Corpus)는 단일 모델 연구이며 (15개 파일은 방향성을 제시할 뿐 결정적이지는 않음), BrassCoders의 발견 사항에는 설계상 포함된 허위 양성 (False positives)이 포함되어 있습니다. 분류 (Triage) 계층이 존재하는 데에는 이유가 있기 때문입니다. 하지만 15개 중 9개라는 신호는 통제된 연구 결과와 일치합니다. 이 질문에 대해 가장 엄격한 통제 연구인 Perry 등의 ACM CCS 2023 연구에 따르면, AI 어시스턴트를 사용하는 참가자들은 인젝션 (Injection), 권한 부여 (Authorization), 암호화 (Cryptographic) 범주 전반에 걸쳐 어시스턴트를 사용하지 않는 참가자들보다 현저히 더 보안에 취약한 코드를 작성했으며, 자신의 코드가 더 안전하다고 평가했습니다. 실제 비율과 인지된 비율 사이의 격차는 바이브 코딩 (Vibe coding)이 의존하는 메커니즘이자 이를 위험하게 만드는 요소입니다.
인용 및 1차 출처 링크가 포함된 이 연구 클러스터의 전체 연구 인덱스는 coppersun.dev/research/vibe-coding-velocity-risk/에서 확인할 수 있습니다.
더 유능한 모델들이 격차를 줄이지 못하는 이유
BrassCoders는 모델의 능력과 코드의 안전성이 동일한 축이 아니라는 전제하에 구축되었으며, 발표된 데이터도 이에 동의합니다. Veracode의 State of Software Security 2026에 따르면, AI가 생성한 코드의 45%가 첫 생성 시점에 여전히 최소 하나 이상의 OWASP Top 10 취약점을 유발하는 것으로 나타났습니다. 이는 모델이 더 유창해짐에 따라 감소하지 않은 수치입니다.
유창함 (Fluency)과 안전성 (Safety)은 동일한 축이 아닙니다. 최신 모델들은 더 깔끔한 코드, 더 나은 관용적 구조 (idiomatic structure), 더 일관된 명명 규칙 (naming)을 생성합니다. 하지만 모델이 생성하는 코드가 기대만큼 더 안전해지지는 않는데, 이는 모델이 재현하는 보안상 취약한 패턴들이 구문 오류 (syntax errors)가 아니기 때문입니다. 그것들은 문맥 오류 (errors of context)입니다.
역량의 역설 — 왜 더 나은 모델이 이를 더 쉽게 만드는 것이 아니라 더 어렵게 만드는가 — 에 대한 내용은 why-better-ai-models-make-bugs-harder-to-catch 포스트에서 다룹니다. 요약하자면 다음과 같습니다: 더 깔끔해 보이는 코드는 리뷰어의 더 많은 신뢰를 얻으며, 리뷰어의 신뢰가 높아질수록 단 하나의 보안 취약한 라인은 더 적은 검토를 받게 됩니다. 유창하고 관용적인 코드를 생성하면서 그 안에 하나의 SQL 인젝션 (SQL injection)을 숨겨놓은 모델은, 동일한 인젝션이 포함되어 있더라도 명백하게 지저분한 코드를 생성하는 모델보다 더 위험합니다. 인젝션을 놓치기가 더 쉽기 때문입니다.
Liu 등의 Lost in the Middle (2023) 연구는 어텐션 (attention) 문제를 직접적으로 보여주었습니다: 언어 모델은 긴 입력값의 시작과 끝에는 강하게 집중하지만, 중간 부분은 놓칩니다. 큰 파일의 중간에 걸쳐 있거나 여러 파일을 가로지르는 버그는, 모델이 코드를 생성할 때나 리뷰할 때나 모델의 사각지대에 놓이게 됩니다. 더 나은 모델이라도 이를 구조적으로 해결하지는 못합니다. 모델은 컨텍스트 윈도우 (context windows)를 가질 뿐, 콜 그래프 (call graphs)를 가지지는 않기 때문입니다.
BrassCoders는 콜 그래프를 따라가는 Pyre/Pysa의 절차 간 오염 분석 (interprocedural taint analysis)을 실행합니다. 이 방식은 컨텍스트 윈도우를 사용하지 않습니다. API 라우트에서 헬퍼 (helper)를 거쳐 데이터베이스 호출로 이어지는 오염 흐름 (taint flow)은 파일 구조와 상관없이 정적 그래프 (static graph) 상에 존재합니다.
30초의 관문
BrassCoders는 바이브 코딩 (vibe coding)이 제거해버리는 관문입니다. 30초짜리 프리커밋 (pre-commit) 스캔이 이를 다시 되돌려 놓습니다.
OSS 코어를 설치(pip install brasscoders)하고 이를 프리커밋 워크플로우에 추가하세요:
# .pre-commit-config.yaml
repos:
- repo: local
...
이 훅(hook)은 심각한(CRITICAL) 탐지 결과가 발견되면 0이 아닌 종료 코드(non-zero)로 종료되며 커밋을 차단합니다. 하드코딩된 비밀 정보(Hardcoded secrets), SQL 인젝션(SQL injection) 패턴, 커맨드 인젝션(command injection), 취약한 암호화(weak cryptography) 등이 저장소(repo)에 반영되기 전에 포착됩니다. AI가 생성한 코드는 여전히 빠르게 배포됩니다. 다만, 스캔 과정을 거친 후 배포될 뿐입니다.
BrassCoders는 Bandit, Pylint, Pyre/Pysa, Semgrep, ast-grep, detect-secrets를 포함하여 비밀 정보, 개인정보, AI 패턴, 성능, 콘텐츠 모더레이션(content moderation), 그리고 JavaScript/TypeScript를 다루는 6개의 커스텀 탐지기까지 총 12개의 스캐너를 실행하며, 오픈 소스(OSS) 코어 모드에서는 외부 네트워크 호출을 전혀 수행하지 않습니다.
계정이 필요하지 않습니다. Apache 2.0 라이선스입니다.
BrassCoders 유료 버전(개발자당 월 $12)은 AI 기반의 강화 기능(AI-powered enrichment)을 추가합니다. 이는 분류(triage) 작업량이 병목 현상이 되는 팀을 위해, 프로젝트 시그니처(project signature)를 기준으로 탐지 결과를 중복 제거하고 순위를 매기는 호스팅 게이트웨이를 제공합니다. 어떤 방식이든 오픈 소스(OSS) 코어는 구조적인 문제들을 잡아냅니다.
바이브 코딩(Vibe coding)은 사라지지 않을 것입니다. 워크플로우는 너무나 빠르고, 백지 상태를 없애주는 효과는 너무나 실질적입니다. 문제는 게이트(gate)를 파이프라인(pipeline)에 다시 도입할 것인가입니다. pip install brasscoders는 15초면 충분합니다. 프리커밋(pre-commit) 훅 설정은 단 다섯 줄입니다. 이것이 격차를 메우는 데 드는 전체 비용입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기