AI 코딩 도구는 분명히 빠르다. Cursor로 컴포넌트를 뽑고, Lovable로 주말 안에 MVP를 만들고, Bolt로 풀스택 앱을 배포하는 일이 현실이 됐다. 그런데 최근 두 가지 흐름이 같은 질문을 가리키고 있다. AI가 생성한 코드는 '작동하는가'를 기준으로 최적화되어 있지, '안전한가'나 '효율적으로 실행되는가'를 기준으로 설계되지 않는다.
첫 번째 레이어: 보안은 AI의 관심사가 아니다
dev.to에 올라온 감사 사례는 숫자가 꽤 직접적이다. 5개 AI 빌드 앱을 수동 감사했더니 5개 모두 치명적 취약점이 있었다. Wiz가 5,600개 AI 빌드 앱을 스캔했을 때 400개에서 시크릿이 노출됐고, GuardMint의 200개 이상 감사에서는 91.5%가 AI 할루시네이션 직접 기인 취약점을 가지고 있었다. Lovable은 앱의 70%를 Row Level Security가 꺼진 채 배포하고, Bolt는 RLS를 기본값으로 비활성화한다.
패턴은 일관된다. AI는 '가장 저항이 적은 경로'를 선택한다. 스토리지 버킷을 퍼블릭으로 열면 이미지 로딩 문제가 해결되고, RLS를 끄면 쿼리가 바로 동작하며, API 키를 프론트엔드 JS에 하드코딩하면 인증이 즉시 붙는다. 코드는 작동한다. 다만 그 코드가 프로덕션에 나가는 순간, 누구나 데이터베이스 전체를 읽을 수 있고, 시크릿 키가 번들에 노출되고, 인증 없는 라우트가 열려 있다.
Thoughtworks의 Martin Fowler 팀이 정확하게 짚었다. "AI 에이전트에게 '안전하게 해줘'라고 말하는 것은 안전함을 강제하는 것과 다르다. 프롬프트는 재정의되거나, 오해되거나, 무시될 수 있다." .cursorrules나 CLAUDE.md에 보안 컨텍스트를 명시적으로 박아넣지 않으면, AI는 매 세션마다 같은 실수를 반복한다. 보안은 AI에게 위임하는 영역이 아니라, 개발자가 워크플로우 구조 안에 설계해 넣어야 하는 레이어다.
두 번째 레이어: 런타임 CSS 비용은 번들에 숨어 있다
두 번째 문제는 더 조용하게 누적된다. AI가 생성하는 스타일링 코드 상당수는 여전히 런타임 CSS-in-JS 패턴을 따른다. 컴포넌트가 브라우저에 마운트되는 시점에 CSS를 파싱하고 주입하는 구조다. 이 비용은 기능 테스트에서 잘 보이지 않는다. 컴포넌트는 렌더링되고, 스타일은 적용된다. 작동한다.
문제는 LCP(Largest Contentful Paint)와 번들 크기로 나타난다. 런타임 CSS 라이브러리는 파서 코드 자체를 브라우저에 전송한다. 빌드 타임에 정적 CSS로 추출할 수 있는 스타일을 굳이 런타임에 계산한다. 동적 스타일링이 필요한 경우라도, 빌드 타임 스캐너로 정적 CSS를 추출하고 동적 변수만 CSS 커스텀 프로퍼티로 넘기는 zero-runtime 접근이 이미 성숙해 있다. Vanilla Extract, Linaria, Panda CSS가 그 경로다. 그런데 AI가 생성하는 코드는 이 선택을 거의 하지 않는다. 가장 널리 쓰이는 패턴, 즉 styled-components나 Emotion 계열로 수렴한다.
두 문제가 공유하는 구조적 원인
보안 취약점과 런타임 CSS 비용은 표면적으로 다른 문제처럼 보이지만 같은 메커니즘에서 나온다. AI는 현재 컨텍스트에서 작동하는 코드를 생성하도록 학습됐다. 보안 정책, 성능 예산, 아키텍처 제약은 코드가 '작동하는가'와 직접 연결되지 않는다. 이 두 레이어는 코드가 틀렸을 때 즉각 에러를 던지지 않는다. 조용히, 프로덕션 환경에서, 시간이 지난 뒤에야 드러난다.
실무 시사점: AI 워크플로우에 두 개의 게이트를 설계하라
빠른 생성 이후에 검증 단계를 별도로 두는 것이 지금 시점의 현실적인 답이다. 보안 레이어에서는 .cursorrules 또는 CLAUDE.md에 최소 권한 원칙, RLS 활성화 강제, 시크릿 하드코딩 금지를 명시하고, CI 파이프라인에 grep -r "eyJ" 류의 시크릿 스캔을 자동화해야 한다. 런타임 CSS 레이어에서는 신규 프로젝트라면 Tailwind + zero-runtime CSS 조합을 기본값으로 잡고, 기존 코드베이스라면 번들 분석 후 런타임 CSS 라이브러리의 실제 비용을 Core Web Vitals로 측정해 의사결정 근거로 삼는 것이 먼저다.
AI 코딩 도구가 성숙해질수록 생성 속도는 계속 빨라진다. 하지만 보안 컨텍스트와 성능 예산은 생성 속도와 무관하게 개발자가 설계해 넣어야 하는 레이어다. 도구가 빨라질수록 이 두 레이어를 워크플로우 안에 고정하는 일의 중요성은 오히려 커진다. AI가 코드를 짜는 속도만큼, 구멍도 빠르게 쌓인다.