ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AI 생성 코드 보안: PR의 87%에서 취약점이 발견되는 이유와 대응법
    AI 2026. 4. 8. 22:25
    반응형

    AI 코딩 어시스턴트의 생산성은 이미 검증됐지만, 보안 측면에서는 심각한 문제가 드러나고 있어요. Stanford 대학의 2023년 연구에 따르면 AI 생성 코드를 사용한 개발자들이 수동으로 작성한 개발자보다 더 취약한 코드를 만들면서도, 본인의 코드가 안전하다고 더 확신했다고 해요. Snyk의 조사에서도 AI가 제안하는 코드의 약 80% 이상에서 입력값 검증 누락, 하드코딩된 인증정보, 인증 체크 부재 같은 교과서적인 취약점이 발견됐어요. 이 글에서는 AI 생성 코드가 왜 취약한지, 어떤 패턴이 반복되는지, 그리고 개발자로서 어떻게 대응해야 하는지를 구체적으로 다뤄볼게요.

    AI가 취약한 코드를 만드는 구조적 원인

    AI 코딩 모델은 GitHub의 공개 저장소를 학습 데이터로 사용해요. 문제는 공개 코드의 대부분이 튜토리얼, 데모, 프로토타입용이라는 점이에요. 프로덕션 수준의 보안 처리가 되어 있지 않은 코드가 "가장 흔한 패턴"으로 학습되는 거예요.

    • 학습 데이터 편향: 튜토리얼 코드는 예제를 간결하게 유지하기 위해 인증, 에러 처리, 입력 검증을 생략해요. 모델은 이 패턴을 그대로 재현해요.
    • 컨텍스트 맹점: 모델은 여러분의 애플리케이션 위협 모델(Threat Model)을 이해하지 못해요. 동작하는 코드를 만들 뿐, 안전한 코드를 만들지는 않아요.
    • 해피 패스 최적화: AI 제안은 기능 구현에 최적화되어 있어요. 엣지 케이스, 에러 경로, 악의적 입력은 후순위예요.
    • 속도 우선 수용: 개발자들은 AI 제안을 빠르게 수락하는 경향이 있어서, 모든 라인을 꼼꼼히 읽지 않는 경우가 많아요.

    이런 구조적 원인 때문에 AI 생성 코드는 기본적으로 "취약한 상태"에서 시작한다고 봐야 해요.

    반복되는 주요 취약점 패턴

    실제 AI가 생성한 코드베이스에서 가장 빈번하게 발견되는 취약점 패턴을 살펴볼게요.

    CSRF 보호 누락

    AI 도구는 폼 핸들러와 API 엔드포인트를 생성할 때 CSRF 토큰을 거의 포함하지 않아요. 어떤 출처에서든 POST 요청을 수락하는 코드를 만들어요.

    # AI가 생성한 Flask 라우트 — CSRF 보호 없음
    @app.route('/transfer', methods=['POST'])
    def transfer():
        amount = request.form['amount']
        to_account = request.form['to']
        process_transfer(current_user, to_account, amount)
        return redirect('/dashboard')

    공격자는 피해자의 브라우저가 세션 쿠키를 자동으로 포함하는 점을 이용해, 외부 페이지에서 해당 엔드포인트로 폼을 전송할 수 있어요.

    위험한 CORS 설정

    CORS 에러를 해결해달라고 요청하면, AI가 가장 흔하게 제안하는 답은 Access-Control-Allow-Origin: *예요.

    // AI가 생성한 Express CORS 설정 — 위험한 와일드카드
    app.use(cors({ origin: '*', credentials: true }));

    와일드카드와 credentials를 함께 사용하면 인터넷의 어떤 웹사이트든 인증된 요청을 보낼 수 있게 돼요. 안전한 버전은 허용 도메인을 명시적으로 지정해야 해요.

    하드코딩된 시크릿과 입력 검증 부재

    AI 모델은 플레이스홀더 API 키와 비밀번호가 포함된 코드를 자주 생성하고, 개발자가 이를 교체하지 않은 채 배포하는 경우가 많아요. 또한 AI 제안은 들어오는 모든 데이터를 신뢰하는 경향이 있어서, 타입 체크, 길이 제한, 새니타이제이션(Sanitization) 없이 폼 입력이나 쿼리 파라미터를 직접 사용해요. 이는 인젝션(Injection) 공격의 문을 열어줘요.

    AI 생성 코드의 보안 취약점 패턴을 보여주는 다이어그램

    AI 코딩 도구를 안전하게 사용하는 전략

    AI 코딩 도구를 아예 안 쓰는 건 현실적이지 않아요. 핵심은 모든 AI 제안을 "보안 요구사항을 모르는 주니어 개발자의 코드"로 취급하는 거예요.

    • 라인 단위 리뷰: 멀티라인 자동완성을 읽지 않고 수락하지 마세요. 코드 생성으로 절약한 시간이 취약점 하나로 날아갈 수 있어요.
    • 보안 린터 도입: Semgrep, Bandit 같은 도구가 AI가 만드는 일반적인 취약 패턴을 잡아줘요.
    • 프롬프트에 보안 컨텍스트 추가: "CSRF 보호 포함", "파라미터화된 쿼리 사용", "시크릿은 환경변수에서 로드" 같은 지시를 명시적으로 포함하세요.
    • 프리커밋 훅 활용: detect-secrets 같은 도구로 하드코딩된 시크릿, console.log, TODO 플레이스홀더가 포함된 커밋을 차단하세요.
    • CI/CD에 보안 스캐닝 통합: 코드 리뷰가 놓치는 부분을 자동화된 스캐너가 잡아줘요. 배포된 애플리케이션에 대한 정기적인 스캐닝도 필수예요.

    가장 큰 리스크는 AI 도구 자체가 아니라 리뷰 프로세스에 있어요. 직접 작성한 코드는 한 줄 한 줄 고민하지만, AI 생성 코드는 빠르게 훑고 넘어가는 경향이 있거든요. 프로세스를 만드는 게 핵심이에요.

    마무리

    AI 생성 코드의 보안 문제는 도구를 안 쓴다고 해결되는 게 아니라, 보안 중심의 리뷰 프로세스를 구축해야 해결돼요. 자동화된 보안 스캐닝, 보안 체크리스트 기반 코드 리뷰, 프롬프트 단계에서의 보안 요구사항 명시를 습관화하세요. AI 도구의 생산성을 누리면서도 안전한 코드를 유지하는 건, 결국 개발자의 프로세스에 달려 있어요.

    반응형

    댓글

Designed by Tistory.