//
바이브 코딩 너머 개발자 생존법 · 애디 오스마니
AI가 생성한 코드에는 보안 취약점이 내포될 가능성이 높다. AI 모델의 학습 데이터에는 스택오버플로우의 오래된 답변, 보안을 고려하지 않은 튜토리얼 코드, 간소화된 예제 코드가 포함되어 있기 때문이다. 저자는 AI 생성 코드에서 흔히 발견되는 보안 취약점을 정리한다.
| 취약점 유형 | 설명 | AI가 생성하기 쉬운 이유 |
|---|---|---|
| SQL 인젝션 | 사용자 입력을 쿼리에 직접 삽입 | 문자열 보간 예제가 학습 데이터에 다수 |
| XSS | 사용자 입력을 이스케이프 없이 렌더링 | 간단한 예제에서 이스케이프를 생략 |
| 자격 증명 하드코딩 | API 키, 비밀번호를 코드에 직접 포함 | 예제 코드에서 환경변수 대신 직접 값을 사용 |
| 부적절한 에러 노출 | 스택 트레이스를 사용자에게 그대로 전달 | 개발 환경 코드와 프로덕션 코드를 구분하지 않음 |
| 권한 검증 누락 | 인증은 있지만 인가 로직이 없음 | "로그인 기능"과 "권한 관리"를 별개로 인식 |
특히 자격 증명 분리는 AI가 가장 빈번하게 실수하는 영역이다. 환경변수나 시크릿 매니저를 사용해야 하는데, AI는 코드의 가독성과 완결성을 위해 값을 직접 하드코딩하는 경향이 있다.
AI 생성 코드의 보안을 체계적으로 검증하기 위해 여러 레이어의 감사가 필요하다.
코드를 실행하지 않고 소스 코드를 분석하여 취약점을 탐지한다. ESLint 보안 플러그인, SonarQube, Semgrep 등이 대표적이다. CI/CD 파이프라인에 통합하여 AI가 생성한 코드가 머지되기 전에 자동으로 검사하는 것이 효과적이다.
AI를 활용하여 다른 AI가 생성한 코드의 보안을 검토하는 방식이다. "보안 엔지니어 관점에서 이 코드를 리뷰해 줘"와 같은 프롬프트로 잠재적 취약점을 식별할 수 있다. 다만 이것만으로는 충분하지 않으며, 다른 감사 방법과 병행해야 한다.
침투 테스트(Penetration Testing) 는 공격자의 관점에서 시스템의 취약점을 탐색하는 방식이다. AI 생성 코드에는 개발자가 미처 인식하지 못한 공격 벡터가 존재할 수 있으므로, 주기적인 침투 테스트가 중요하다.
퍼즈 테스트(Fuzz Testing) 는 무작위 또는 비정상적인 입력을 시스템에 제공하여 예상치 못한 동작을 탐지하는 방식이다. AI가 예상하지 못한 입력 패턴에서 코드가 어떻게 동작하는지를 검증한다.
보안 외에도 전반적인 소프트웨어 신뢰성을 확보하기 위한 테스트 전략이 필요하다.
특정 입력에 대한 특정 출력을 검증하는 대신, 코드가 만족해야 하는 속성을 정의하고 무작위 입력으로 검증한다. 예를 들어 "정렬 함수의 출력은 항상 오름차순이어야 한다"와 같은 속성을 정의하면, 테스트 프레임워크가 수천 가지 입력을 자동 생성하여 검증한다. AI 생성 코드의 엣지케이스를 발견하는 데 효과적이다.
AI가 생성한 코드의 성능 특성을 파악하기 위해 부하 테스트를 수행한다. AI는 기능적으로 올바른 코드를 생성하지만, 동시 접속이나 대량 데이터 처리 시 성능 문제가 드러나는 경우가 많다.
AI 생성 코드의 에러 처리가 포괄적인지 검증한다. 네트워크 장애, 타임아웃, 잘못된 입력, 리소스 부족 등 다양한 실패 시나리오에서 시스템이 적절하게 대응하는지 확인해야 한다.
AI가 생성한 코드의 성능은 "동작하지만 최적은 아닌" 수준인 경우가 많다. 저자는 다섯 가지 영역의 최적화를 다룬다.
| 영역 | 핵심 질문 |
|---|---|
| 알고리즘 복잡도 | 시간/공간 복잡도가 적절한가? O(n^2)를 O(n log n)으로 개선할 수 있는가? |
| 메모리 관리 | 불필요한 복사, 메모리 누수, 과도한 객체 생성이 있는가? |
| 동시성 | 비동기 처리를 적절히 활용하고 있는가? 경합 조건은 없는가? |
| 캐싱 | 반복 연산의 결과를 캐싱할 수 있는가? 캐시 무효화 전략은 적절한가? |
| DB 쿼리 | N+1 문제, 불필요한 풀 스캔, 인덱스 미사용 등이 있는가? |
AI에게 "이 코드의 성능을 최적화해 줘"라고 요청하면 일반적인 개선을 제안하지만, 프로파일링 데이터와 함께 구체적인 병목 지점을 알려주면 훨씬 정확한 최적화를 제안한다.
AI 생성 코드의 보안과 성능을 검증하는 가장 실용적인 방법은 CI/CD 파이프라인에 자동화된 검사를 통합하는 것이다. SAST, 유닛 테스트, 부하 테스트를 파이프라인에 포함시키면, AI가 생성한 코드라 하더라도 일정 수준 이상의 품질을 보장할 수 있다.
보안, 신뢰성, 유지보수성은 AI가 가장 자주 간과하는 영역이다. AI는 기능 구현에 집중하므로, 비기능적 요구사항은 개발자가 직접 챙겨야 한다. 보안 감사 체계를 갖추고, 다층적 테스팅을 적용하고, 성능을 프로파일링 기반으로 최적화하는 것이 AI 시대 개발자의 필수 역량이다.