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분 만에 이해하기

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에서 다음 값을 입력하세요.

이 설정 한 줄로 실제 호출 경로는 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를 명시적으로 실행하거나,