시크릿·.env가 AI 코딩 도구 컨텍스트에 들어가지 않게 막는 설정

Claude Code deny 규칙, Cursor .cursorignore, Copilot 콘텐츠 제외의 범위와 빈틈

핵심 요약

  1. Claude Code의 Read 거부 규칙은 내장 도구와 cat 같은 Bash 파일 명령까지 막지만, 파일을 직접 여는 스크립트는 막지 못한다.
  2. Cursor의 .cursorignore는 에이전트의 터미널과 MCP 도구를 막지 못한다.
  3. Copilot 콘텐츠 제외는 CLI와 IDE Chat 에이전트 모드를 지원하지 않는다.
  4. 차단 설정은 보조 수단이며, 운영 비밀값을 로컬 저장소에 두지 않는 것이 근본 대책이다.

AI 코딩 도구는 작업에 필요한 파일을 스스로 찾아 읽는다. 저장소 안에 .env나 인증서, 서비스 계정 키가 있으면 에이전트가 설정을 확인하려다 그 내용을 읽고, 내용이 모델 요청에 실려 외부로 전송될 수 있다. 도구마다 파일 접근을 막는 설정이 있지만 막는 범위가 서로 다르고, 공통적으로 빈틈이 있다. 이 글은 Claude Code, Cursor, GitHub Copilot의 공식 문서를 바탕으로 각 설정의 적용 범위와 한계를 정리한다. Claude Code 설정 파일 전반은 Claude Code 설정과 토큰 최적화 글에서 다뤘다.

도구별 차단 수단과 적용 범위

도구설정막는 범위막지 못하는 경로
Claude Codepermissions.deny의 Read(...) 규칙내장 파일 도구, Bash의 cat·head·tail·sed·tee, 리다이렉션 대상파일 이름을 직접 쓰지 않는 grep -r, 파일을 스스로 여는 Python·Node 스크립트
Claude Code샌드박스Bash 등 셸 명령과 자식 프로세스의 OS 수준 파일·네트워크 접근셸이 아닌 도구는 권한 규칙으로 통제
Cursor.cursorignoreAgent·Tab·Inline Edit의 파일 접근, @ 멘션에이전트가 쓰는 터미널과 MCP 서버 도구
GitHub Copilot콘텐츠 제외(저장소·조직·엔터프라이즈 설정)IDE의 인라인 제안과 Copilot ChatCopilot CLI, IDE Chat의 에이전트 모드

표에서 보듯 어떤 도구도 "설정 하나로 완전 차단"을 보장하지 않는다. 그래서 차단 설정은 사고를 줄이는 장치로 쓰고, 근본 대책은 운영 비밀값을 개발자 로컬 저장소에 두지 않는 것이다.

1단계: Claude Code에서 비밀 파일 읽기 차단

설정 문서의 예시처럼 permissions.deny에 Read 규칙을 넣는다. 팀 전체에 적용하려면 저장소의 .claude/settings.json에 두고 커밋한다.

{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)",
      "Read(./**/*.pem)"
    ]
  }
}

권한 문서는 Read·Edit 거부 규칙이 내장 파일 도구뿐 아니라 Bash에서 인식하는 파일 명령(cat, head, tail, sed, tee)과 리다이렉션 대상에도 적용된다고 설명한다. 반면 파일을 이름으로 지정하지 않는 명령이나, 파일을 직접 여는 스크립트에는 적용되지 않는다고 경고하며, 모든 프로세스를 OS 수준에서 막으려면 샌드박스를 켜라고 안내한다. 설정 후에는 Claude Code 안에서 /status로 설정 파일이 로드됐는지 확인한다.

2단계: Cursor에서 .cursorignore 설정

# .cursorignore
config/credentials/
*.pem
*.p12
service-account*.json

Cursor는 .gitignore에 있는 파일과 점으로 시작하는 환경 파일 등을 기본으로 무시한다. 따라서 .cursorignore에는 git에는 커밋되지만 AI가 읽으면 안 되는 파일을 주로 적는다. 문서는 에이전트가 사용하는 터미널과 MCP 서버 도구가 .cursorignore로 막히지 않는다고 명시하므로, 에이전트의 터미널 명령 실행은 승인 절차를 유지한다.

3단계: GitHub Copilot 콘텐츠 제외

저장소 관리자는 저장소 설정에서, 조직 소유자는 조직 설정에서 제외할 경로를 YAML로 지정한다. 조직 설정에서는 "*" 키로 모든 저장소에 공통 규칙을 걸 수 있다.

# 조직 설정 예
"*":
  - "**/.env"
  - "**/*.pem"

payment-service:
  - "/config/secrets/**"

GitHub 문서에 따르면 변경 사항이 IDE에 반영되는 데 최대 30분이 걸릴 수 있고, Copilot CLI와 IDE Chat의 에이전트 모드는 콘텐츠 제외를 지원하지 않는다. 에이전트 모드를 쓰는 팀이라면 이 설정만으로는 부족하다.

4단계: 비밀값을 저장소 밖으로 빼기

  1. 운영·스테이징 비밀값은 비밀 관리 도구나 배포 플랫폼의 환경 변수에만 두고, 로컬 .env에는 개발용 값만 둔다.
  2. 저장소에는 키 이름만 적은 .env.example을 커밋하고 실제 값은 넣지 않는다.
  3. .gitignore에 .env*(예외로 !.env.example), 인증서, 서비스 계정 키 패턴을 추가한다.
  4. 서비스 계정 키처럼 파일 형태의 자격 증명은 저장소 폴더 밖 경로에 두고 환경 변수로 경로만 전달한다.
  5. 실수로 커밋된 비밀값은 삭제 커밋만으로는 이력에 남으므로 즉시 키를 폐기하고 새로 발급한다.

설정이 동작하는지 확인하는 방법

  • 각 도구에 ".env 내용을 보여 줘"라고 요청해 파일 읽기가 거부되는지 확인한다.
  • Claude Code에서는 cat .env 실행 요청도 거부되는지 확인한다.
  • Cursor·Copilot의 에이전트 모드에서 터미널 명령으로 같은 파일을 읽으려 할 때 승인 요청이 뜨는지 본다.
  • 모든 확인을 실제 운영 비밀값이 아닌 더미 값으로 진행한다.

사내 도구를 만들 때의 비밀값·개인정보 점검 항목은 바이브 코딩 사내 도구 보안 글에, 자동 승인 범위 설계는 Claude Code Auto Mode 보안 글에 정리했다.

초보자가 자주 실수하는 포인트

  • .cursorignore에 .env를 넣었으니 에이전트가 절대 못 읽는다고 생각하는 경우
  • 운영 비밀값을 로컬 .env에 그대로 두고 개발하는 경우
  • Copilot 콘텐츠 제외를 설정하고 에이전트 모드에서도 적용된다고 가정하는 경우
  • 비밀값이 커밋된 뒤 삭제 커밋만 하고 키를 교체하지 않는 경우

체크리스트

  • Claude Code 팀 설정에 비밀 파일 Read 거부 규칙이 있는가
  • 셸 명령까지 막아야 한다면 샌드박스를 켰는가
  • 도구별 차단 범위의 빈틈을 팀에 공유했는가
  • 로컬 .env에 개발용 값만 있는가
  • .env.example만 커밋하고 실제 값은 커밋하지 않는가

자주 묻는 질문

.gitignore에 넣은 파일은 AI 도구가 자동으로 무시하나요?

Cursor는 .gitignore 파일을 기본 무시 목록에 포함한다. Claude Code는 읽기 차단을 확실히 하려면 permissions.deny 규칙을 명시하라고 안내한다. 도구마다 다르므로 각 문서를 확인한다.

샌드박스를 켜면 deny 규칙은 필요 없나요?

문서는 권한 규칙과 샌드박스를 함께 쓰는 다층 방어를 권한다. 샌드박스는 셸 명령에, 권한 규칙은 모든 도구에 적용된다.

Copilot 콘텐츠 제외 변경이 바로 반영되지 않아요.

문서상 IDE 반영까지 최대 30분이 걸릴 수 있으며, VS Code는 명령 팔레트로 다시 불러오기를 할 수 있다.

참고 자료 · 검증 기준

위 자료와 내용을 대조한 날짜: . 도구·서비스 정책은 이후 바뀔 수 있으므로 적용 전 공식 문서를 다시 확인하세요.

이 글은 위 참고 자료를 바탕으로 정리했으며, 내용은 운영 과정에서 순차적으로 보완될 수 있습니다.