Cursor는 기능만 만들어준다, 보안은 네 몫이다
Cursor에게 "로그인 기능 만들어줘"라고 하면 작동하는 코드는 나온다. 하지만 JWT 만료 처리가 빠져 있거나, 비밀번호를 평문으로 저장하거나, rate limiting 없이 무제한 로그인 시도를 허용하는 경우가 생각보다 많다.
2026년 현재, Cursor로 만든 프로젝트가 해킹당하는 가장 흔한 경로 세 가지가 있다.
놓치기 쉬운 보안 포인트 5가지
1. .env 파일이 Git에 올라가 있다
Cursor가 프로젝트를 생성할 때 .gitignore를 빠뜨리는 경우가 있다. 배포 전에 반드시 확인하자.
# .env가 git에 추적되고 있는지 확인
git ls-files | grep ".env"
# 이미 올라갔다면 캐시 제거
git rm --cached .env
echo ".env" >> .gitignore
2. 개발용 디버그 모드를 그대로 배포
Flask/Django에서 debug=True 상태로 배포하면 에러 발생 시 서버 내부 정보가 그대로 노출된다. Cursor 생성 코드에서 특히 자주 보이는 패턴이다.
# 위험
app.run(debug=True)
# 안전: 환경변수로 분리
import os
app.run(debug=os.getenv('DEBUG', 'False') == 'True')
3. 인증 없는 관리자 API
Cursor가 빠르게 CRUD API를 만들 때 인증 미들웨어를 빠뜨리는 경우가 있다. /api/admin/users 같은 경로에 토큰 없이 접근 가능한지 직접 테스트해봐야 한다.
4. CORS가 전체 허용으로 설정
"일단 되게 해"라고 프롬프트를 쓰면 CORS를 *로 설정한다. 실제 프로덕션에서는 허용할 도메인을 명시적으로 지정해야 한다.
# 위험
CORS_ALLOW_ALL_ORIGINS = True
# 안전
CORS_ALLOWED_ORIGINS = [
"https://yourdomain.com",
"https://www.yourdomain.com",
]
5. 보안 헤더가 없다
Content-Security-Policy, X-Frame-Options, Strict-Transport-Security 등 보안 헤더를 Cursor가 자동으로 추가하지는 않는다. 배포 후 CodeScan으로 헤더 점검을 돌려보면 대부분 C~D 등급이 나온다.
자동화 점검으로 빠르게 확인하는 법
위 5가지를 수동으로 다 확인하기 힘들다면, URL 하나로 주요 항목을 자동 점검하는 도구를 활용하는 게 현실적이다. 코드 레벨의 취약점은 직접 검토해야 하지만, 인프라/설정 레벨의 문제는 스캐너가 빠르게 잡아준다.