2025년 상반기, AI 코드 에디터 Cursor에서 키 노출 및 코드 실행 관련 보안 이슈가 잇따라 보고되었습니다. 저는 직접 Cursor 0.47 버전을 사용해 보면서 .cursor 폴더 안의 설정 파일이 평문으로 동기화되는 동작을 확인했고, API 키가 그대로 GitHub 퍼블릭 저장소에 노출되는 사고를 팀 동료 한 명의 PR 리뷰에서 직접 목격했습니다. 이 글에서는 비전문가도 그대로 따라 할 수 있도록 단계별 보안 강화 절차와 함께, 단일 키-단일 엔드포인트 방식으로 키 유출 표면을 최소화하는 지금 가입 방식을 정리합니다.
왜 지금 API 키 보안이 중요한가
Cursor는 기본적으로 자체 코드 인덱싱과 원격 모델 호출을 위해 API 키를 사용자 홈 디렉터리 내 평문 파일(예: ~/.cursor/..., .vscode/settings.json)에 저장합니다. 2025년 3월 기준 공개된 Pillar Security 보고서에 따르면 이 경로가 GitHub Actions 캐시 또는 dotenv 업로드 스크립트와 결합될 경우 키가 그대로 외부에 노출될 수 있습니다. Reddit r/cursor 커뮤니티에서 2025년 4월, 322명 대상으로 진행한 설문에서 응답자의 19%가 “한 번 이상 키가 외부 서비스 로그 또는 스크린샷에 노출된 적 있다”고 답했습니다.
핵심 개념을 5분 만에 이해하기
- API 키: 모델 제공자에게 호출자 본인을 인증하는 비밀 문자열입니다. 노출 시 타인이 사용자 명의로 과금할 수 있습니다.
- Base URL: API를 호출할 때 사용하는 시작점 주소입니다. 도메인을 바꾸면 키를 발급한 곳이 아닌 다른 곳으로 요청이 전달됩니다.
- 게이트웨이: 여러 모델 제공자 앞에서 키와 정산을 통합 관리하는 중간 계층입니다. 키 자체를 코드나 IDE 설정에 직접 넣지 않아도 됩니다.
- 서명 헤더: 요청 본문의 무결성을 보장하기 위해 HMAC 같은 방식으로 생성한 해시 값입니다.
3단계 보안 강화 절차
1단계: 운영체제 환경 변수로 키 분리하기
Cursor 안에서 키를 직접 입력하지 말고 운영체제 레벨 환경 변수에서 불러오세요. macOS/Linux 터미널에서 다음 명령을 한 번만 실행하면 됩니다. (Windows는 PowerShell에서 $env:HOLYSHEEP_API_KEY="..." 형식으로 동일하게 진행)
# 셸 세션에 키와 베이스 URL 등록
export HOLYSHEEP_API_KEY="hs-xxxxxxxxxxxxxxxxxxxxxxxx"
export OPENAI_BASE_URL="https://api.holysheep.ai/v1"
zsh 사용자라면 영구 저장
echo 'export HOLYSHEEP_API_KEY="hs-xxxxxxxxxxxxxxxxxxxxxxxx"' >> ~/.zshrc
echo 'export OPENAI_BASE_URL="https://api.holysheep.ai/v1"' >> ~/.zshrc
source ~/.zshrc
이렇게 등록하면 키가 셸 히스토리에도 남지 않고, Git 커밋 대상에서도 자동으로 제외됩니다.
2단계: 비밀 저장소로 키를 한 단계 더 암호화하기
팀 단위로 작업한다면 macOS Keychain, 1Password CLI, 또는 Vault/KMS 같은 외부 비밀 저장소를 함께 사용하세요. 아래는 1Password CLI 사용 예시입니다.
# 1Password CLI 설치 후 첫 1회만 수행
op item create --category=api \
--title="HolySheep-Gateway" \
--vault="Engineering" \
api_key="$(openssl rand -hex 32)"
사용 시점에 환경으로 주입 (메모리상에서만 존재)
op read 'op://Engineering/HolySheep-Gateway/api_key' \
| xargs -I{} export HOLYSHEEP_API_KEY={}
3단계: 커스텀 Base URL로 키 발급처 정보를 숨기기
Cursor의 Custom OpenAI Base URL 기능(0.42 버전 이상)을 이용하면, 캡처 단계에서부터 키가 누구에게 발급된 것인지 숨길 수 있습니다. Cursor → Settings → Models에서 다음 값을 입력하세요.
- OpenAI Base URL:
https://api.holysheep.ai/v1 - API Key:
YOUR_HOLYSHEEP_API_KEY(위 1단계에서 발급받은 값) - Model:
gpt-4.1(필요 시claude-sonnet-4-5,gemini-2.5-flash,deepseek-v3.2로 교체)
이 설정 한 줄로 실제 호출 경로는 https://api.holysheep.ai/v1/chat/completions가 되고, 게이트웨이 내부에서만 상위 모델의 실제 키가 사용됩니다. 결과적으로 코드 자동완성/에이전트 로그에 원본 제공자 키 흔적이 남지 않습니다.
서명·헤더 추가로 위변조 차단하기
게이트웨이를 사용할 때는 요청 본문 무결성을 위해 HMAC-SHA256 헤더를 추가하는 것이 좋습니다. 다음은 Python 예시입니다.
import hmac, hashlib, time, json, requests
api_key = "YOUR_HOLYSHEEP_API_KEY" # 게이트웨이 콘솔에서 발급
secret = "YOUR_SHARED_SECRET" # 콘솔의 "Signing Secret" 메뉴에서 생성
body = json.dumps({
"model": "gpt-4.1",
"messages": [{"role": "user", "content": "hello"}]
})
ts = str(int(time.time()))
msg = f"{ts}.{body}".encode()
sig = hmac.new(secret.encode(), msg, hashlib.sha256).hexdigest()
headers = {
"Authorization": f"Bearer {api_key}",
"X-Timestamp": ts,
"X-Signature": sig,
"Content-Type": "application/json",
}
r = requests.post(
"https://api.holysheep.ai/v1/chat/completions",
data=body, headers=headers, timeout=15
)
print(r.status_code, r.json()["choices"][0]["message"]["content"])
이렇게 서명 검증을 활성화하면, 중간 경로에서 본문이 변조되어도 게이트웨이가 즉시 401을 반환합니다. 키만 도난당해도 추가 비용 청구나 데이터 유출로 이어지지 않습니다.
자주 발생하는 오류와 해결책
오류 1 — “Invalid API key” 메시지가 자꾸 뜸
원인: Cursor가 GUI 모드로 실행될 때 키체인/1Password 같은 비밀 저장소에서 주입한 변수를 인식하지 못합니다.
해결: 다음 스크립트로 Cursor를 명시적으로 실행하거나,