agent 금지 경로 deny 리스트 — secrets·vendor·우회 탐지
에이전트에 저장소 전체를 열면 시크릿·벤더 트리·로컬 자격 증명이 컨텍스트·도구 경로로 새어 나가기 쉽습니다. “읽지 마”라고 채팅에만 적는 것보다, .gitignore와 .cursorignore(또는 동등한 agent deny path 목록) 에 같은 패턴을 고정하는 편이 재현 가능합니다.
이 글의 축은 셋뿐입니다. secrets는 어떻게? · vendor는? · 우회 탐지는? 요금·플랜·토큰·제휴·창작 후기는 없습니다.
근거는 Git — gitignore 패턴 문법, Cursor Ignore file(.cursorignore = .gitignore 문법 · Agent/Tab/Inline/@ 차단 · 기본 ignore에 .env*·node_modules/ 등), Ignore files (help)입니다. 터미널·MCP는 파일 도구와 경계가 다를 수 있으므로, 그 한계까지 deny 설계에 넣습니다.
secrets는 어떻게?
한 줄 답: 시크릿은 커밋 금지(.gitignore) + 에이전트 접근 금지(.cursorignore / deny 목록) 를 겹쳐 걸고, 패턴은 파일명·확장자·디렉터리를 명시합니다. “조심해” 한 줄은 deny가 아닙니다.
실무에서 자주 올리는 시크릿 축(공개 문서·관행; 특정 서비스 요금 아님):
| 축 | 예시 패턴 | 역할 |
|---|---|---|
| 환경 파일 | .env, .env.*, **/.env, **/.env.* | 로컬·CI 시크릿. Cursor 기본 ignore에도 .env*가 있음 |
| 키·인증서 | **/*.pem, **/*.key, **/id_rsa, **/*.p12 | TLS·SSH 개인키 계열 |
| 자격 증명 JSON | **/credentials.json, **/secrets.json, **/service-account*.json | 클라우드·OAuth 클라이언트 파일 |
| 로컬 시크릿 디렉터리 | secrets/, .secrets/, private/ | 팀이 모은 키 묶음 |
| 토큰 덤프 | *.token, *token*.txt (팀 규칙에 맞게) | 실수로 저장된 토큰 텍스트 |
.gitignore만으로는 이미 트래킹된 파일이 남고, 인덱싱·에이전트 파일 도구는 .cursorignore(추가 deny) 가 필요합니다. Cursor 문서는 .gitignore를 자동 존중한다고 하면서도, 시크릿·대용량·서드파티는 .cursorignore로 더 막는 용도라고 설명합니다.
권장 deny 조각(개념; 저장소 루트):
# secrets — keep out of git AND agent file tools
.env
.env.*
!.env.example
secrets/
**/*.pem
**/*.key
**/credentials.json
**/secrets.json
Rule / AGENTS.md에 한 줄로 고정하는 예:
Deny paths (do not read, @-mention, or paste contents):
.env*, secrets/, **/*.pem, **/credentials.json
If a task needs a secret: stop and ask a human — never invent or echo values.
하지 말 것:
.env.example까지 통째로 ignore해 온보딩 문서를 지우기 →!.env.example로 예외를 둡니다(gitignore 문법).- 시크릿을
docs/notes.md처럼 무시되지 않는 경로에 붙여 넣기 → deny 우회가 됩니다. - “일단 읽고 요약만 해”로 에이전트에게 시크릿 파일을 열게 하기 → 요약에도 값이 남을 수 있습니다.
vendor는?
한 줄 답: node_modules/, vendor/, 락파일·빌드 산출물처럼 서드파티·생성물은 기본/추가 ignore로 빼 컨텍스트 노이즈와 잘못 편집을 줄입니다. “벤더 안을 고쳐서 배포”는 deny 정책과 별도 티켓입니다.
| 경로 축 | 대표 패턴 | deny하는 이유 |
|---|---|---|
| JS 의존성 | node_modules/ | Cursor 기본 ignore에도 포함. 인덱스·검색 노이즈 |
| PHP 등 | vendor/ | Composer 등 벤더 트리. 앱 코드와 혼동 |
| 기타 벤더 | third_party/(팀이 수정 안 하는 경우), .venv/, __pycache__/ | 생성·외부 코드 |
| 락·산출물 | *.lock(정책에 따름), dist/, build/, .next/ | 대용량·생성물. 기본 ignore에 락·캐시 다수 |
.cursorignore 예(시크릿과 분리해 주석으로 구역을 나눕니다):
# vendor / generated — noise for agent context
node_modules/
vendor/
.venv/
dist/
build/
.next/
주의점:
- 앱이 벤더를 포크해 수정하는 저장소면
vendor/전면 deny가 작업을 막습니다. 그때는vendor/acme-fork/만 허용(!)하거나, 작업 루트를 앱 패키지로 좁히십시오(monorepo-agent-root 축). - gitignore negation 한계: 부모 디렉터리를
*로 통째 ignore하면 하위!재포함이 실패할 수 있습니다. Cursor 문서도 gitignore와 동일하다고 명시합니다. 중첩 재포함이 필요하면 한 단계씩 디렉터리를 열어 두십시오. - 락파일은 기본 ignore에 들어가는 경우가 많아, 에이전트에게 버전을 맞추게 할 때는
!package-lock.json같은 명시적 재포함이 필요할 수 있습니다.
한 줄 원칙: 사람이 리뷰하는 1st-party 소스만 에이전트 기본 범위에 두고, vendor·secrets는 deny 목록의 기본값으로 둡니다.
우회 탐지는?
한 줄 답: deny는 파일 도구 경계이지 만능 보안 경계가 아닙니다. 터미널·MCP·복사·! 실수·비 git 워크스페이스를 점검 목록으로 돌리십시오.
공개 문서가 말하는 한계와 대응:
| 우회·구멍 | 증상 | 탐지·대응 |
|---|---|---|
터미널 cat/grep | 파일 Read는 거부인데 셸로 읽힘 | Cursor: 터미널·MCP는 .cursorignore를 항상 막지 못한다고 명시. 샌드박스 ON·git 백 워크스페이스에서 셸 제한을 확인 |
| MCP 도구 | 외부 서버가 같은 경로를 읽음 | MCP 허용 목록·리소스 URI를 시크릿 경로에서 제외 |
| 경로 복사 | .env 내용을 tmp/debug.md로 복사 | PR diff·git status에 새 시크릿성 파일 검사 |
@ 멘션 / 드래그 | UI로 ignore 파일을 컨텍스트에 넣으려 함 | ignore가 막는지 한 번 확인하고, 막히면 우회 요청을 거절하도록 Rule에 명시 |
| negation 실수 | !로 시크릿이 다시 노출 | git check-ignore -v path로 실제 적용 패턴 확인(Cursor 트러블슈팅도 동일) |
| 트래킹된 시크릿 | 예전에 커밋된 .env | ignore만으로는 부족 → 히스토리·시크릿 로테이션은 사람 절차 |
복붙용 점검:
[ ] .gitignore has secrets + vendor patterns
[ ] .cursorignore mirrors secrets (and extra vendor noise)
[ ] .env.example allowed with ! if needed; real .env denied
[ ] git check-ignore -v .env secrets/foo.pem
[ ] Agent file read on denied path → permission denied / blocked
[ ] No “cat the secret file” in Auto-run allowlist
[ ] MCP resources do not point at secrets/
[ ] PR checklist: new credential-like filenames
주의: deny 리스트는 편의·노출 면적 축소입니다. 완전한 보장은 Cursor 문서도 하지 않습니다(LLM 예측 불가능성). 프로덕션 키는 에이전트 워크스페이스 밖에 두고, 필요 시 사람만 주입하십시오.
한 줄 정리: secrets·vendor 패턴을 gitignore와 cursorignore에 겹쳐 걸고 → 터미널·MCP·복사 우회를 체크리스트로 탐지합니다. 채팅 주의만으로 deny를 대체하지 마십시오.
FAQ
.gitignore만 있으면 되나?
커밋 누출 방지에는 필수입니다. 에이전트·인덱스까지 막으려면 .cursorignore(또는 제품의 deny path 설정)를 추가로 맞추는 편이 안전합니다. Cursor는 .gitignore를 존중하지만, 시크릿·벤더는 명시 ignore를 권합니다.
.env.example은 어떻게?
실파일 .env는 deny하고, 플레이스홀더만 있는 .env.example은 !.env.example로 재포함합니다. 예시 파일에 실토큰을 넣지 마십시오.
vendor를 고쳐야 하는 작업이면?
전면 deny를 풀지 말고, 수정할 하위 경로만 허용하거나 작업 cwd를 그 패키지로 좁히십시오. 작업 끝나면 다시 deny 기본값을 확인합니다.
git check-ignore가 아무것도 안 찍으면?
패턴이 안 맞거나, 파일이 이미 트래킹 중이거나, 다른 경로에 있을 수 있습니다. -v로 어느 규칙이 맞는지 보고, .cursorignore도 같은 패턴인지 대조하십시오.
출처 (Sources)
- Git — gitignore — 패턴 문법,
!negation, 디렉터리 미순회 - Cursor — Ignore file —
.cursorignore, Agent/Tab/Inline/@ 차단, 기본 ignore, 터미널·MCP 한계,git check-ignore -v - Cursor — Ignore files (help) —
.gitignore자동 존중, 시크릿·벤더·생성물 이유 - 인접: monorepo-agent-root(작업 루트), agent-eval-checklist(머지 전 시크릿 축 eval)