코드 보안

AI가 짜준 코드, 보안은 안전할까?
Claude·ChatGPT 생성 코드의 7가지 취약점

2026.04.10 · 8 min read · CyberShield
Advertisement (AdSense 승인 후 활성화)

2024년 Stanford 연구에 따르면 AI 생성 코드에는 인간이 작성한 코드보다 3배 많은 보안 취약점이 존재합니다. AI는 "작동하는 코드"를 만드는 데는 탁월하지만, "안전한 코드"를 만드는 데는 아직 한계가 있습니다.

Claude, ChatGPT, GitHub Copilot이 생성하는 코드에서 가장 자주 발견되는 7가지 취약점을 실제 코드 예시와 함께 살펴봅니다.

1 하드코딩된 API 키 / 비밀번호

AI는 "빠르게 작동하는 예제"를 보여주기 위해 자주 API 키를 코드에 직접 넣습니다. 이 코드가 GitHub에 올라가는 순간 키가 유출됩니다.

# AI가 생성한 코드 (취약)
OPENAI_API_KEY = "sk-proj-abc123xyz..."
RESEND_API_KEY = "re_f4Pkdvz1_PEm52d5..."

response = openai.ChatCompletion.create(
    api_key=OPENAI_API_KEY,
    model="gpt-4"
)
# 안전한 버전
import os
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
if not OPENAI_API_KEY:
    raise ValueError("OPENAI_API_KEY environment variable not set")

response = openai.ChatCompletion.create(
    api_key=OPENAI_API_KEY,
    model="gpt-4"
)
✓ 해결책: 모든 시크릿은 환경변수로. .env 파일에 저장하고 .gitignore에 추가하세요. Railway, Vercel 등 플랫폼의 환경변수 기능을 사용하세요.

2 CORS 와일드카드 — 모든 출처 허용

AI는 CORS 오류 해결을 위해 종종 모든 출처를 허용하는 설정을 제안합니다. 프로덕션에서 이렇게 설정하면 모든 도메인에서 API에 접근할 수 있습니다.

# AI가 생성한 코드 (취약) — FastAPI 예시
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],   # 모든 출처 허용!
    allow_methods=["*"],
    allow_headers=["*"],
)
# 안전한 버전 — 신뢰하는 도메인만 허용
ALLOWED_ORIGINS = os.getenv("ALLOWED_ORIGINS", "").split(",")
app.add_middleware(
    CORSMiddleware,
    allow_origins=ALLOWED_ORIGINS,  # ["https://myapp.com"]
    allow_methods=["GET", "POST"],
    allow_headers=["Content-Type", "Authorization"],
)

3 JWT 서명 검증 비활성화

"일단 작동만 하게" 만들기 위해 AI가 JWT 검증을 끄는 경우가 있습니다. 이렇게 하면 누구나 임의의 JWT 토큰을 위조할 수 있습니다.

# AI가 생성한 코드 (취약)
payload = jwt.decode(
    token,
    key,
    algorithms=["HS256"],
    options={"verify_signature": False}  # 서명 검증 비활성화!
)
# 안전한 버전
SECRET_KEY = os.getenv("JWT_SECRET_KEY")
payload = jwt.decode(
    token,
    SECRET_KEY,
    algorithms=["HS256"]
    # verify_signature는 기본값 True — 건드리지 마세요
)

4 os.getenv() 폴백 하드코딩

이건 많은 개발자가 놓치는 패턴입니다. "환경변수가 없을 때를 대비해" 폴백 값을 넣으면, 환경변수가 설정되지 않은 경우 하드코딩된 값이 그대로 사용됩니다.

# 취약 — 환경변수가 없으면 실제 키가 사용됨
API_KEY = os.getenv("API_KEY", "sk-prod-real-key-here")
# 안전 — 환경변수 없으면 에러 발생 (의도적)
API_KEY = os.getenv("API_KEY")
assert API_KEY, "API_KEY environment variable is required"

5 디버그 모드 활성화

# AI 예제 코드에 자주 등장 (취약)
app.run(debug=True, host="0.0.0.0")
# 환경변수로 제어
DEBUG = os.getenv("DEBUG", "false").lower() == "true"
app.run(debug=DEBUG, host="0.0.0.0" if DEBUG else "127.0.0.1")

6 SQL 인젝션 — 문자열 직접 삽입

# AI가 생성한 코드 (취약)
user_id = request.args.get("id")
query = f"SELECT * FROM users WHERE id = {user_id}"
cursor.execute(query)  # SQL 인젝션 가능!
# 파라미터화된 쿼리 사용
user_id = request.args.get("id")
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))

7 안전하지 않은 역직렬화 (pickle/yaml.load)

# 취약 — 신뢰할 수 없는 데이터로 역직렬화
import yaml
config = yaml.load(user_input)  # 임의 코드 실행 가능!

import pickle
obj = pickle.loads(user_data)   # 위험!
# 안전 — yaml.safe_load 사용
config = yaml.safe_load(user_input)

# pickle은 신뢰할 수 있는 데이터에만, 또는 json 사용
import json
obj = json.loads(user_data)

내 코드 바로 검사하기

CyberShield의 코드 파일 스캔 기능으로 위 7가지 취약점을 포함해 14가지 패턴을 즉시 탐지할 수 있습니다. Python, JavaScript, TypeScript, Go 등을 지원합니다.

내 코드 파일 보안 검사 — 무료

파일 업로드 → 30초 → 취약점 위치 + 수정 방법까지

🔍 코드 파일 스캔
Advertisement (AdSense 승인 후 활성화)

관련 글: SSL 인증서 무료 자동 갱신 가이드 · 이메일 스푸핑 방지 SPF·DKIM·DMARC 가이드