Claude Code가 다른 프로젝트 폴더 파일을 읽고 쓸 수 있는 이유
CLI 툴의 파일시스템 접근 범위 — 작업 디렉토리 ≠ 접근 범위
난이도: ★☆☆☆☆
핵심 요약
- Claude Code는 로컬 프로세스로 실행된다.
- 작업 디렉토리는 “시작 컨텍스트”일 뿐, 접근 범위를 제한하는 샌드박스가 아니다.
- 제한은 OS 파일 퍼미션이 거는 것이지 Claude Code가 거는 게 아니다.
왜 헷갈렸나
“my-project에서 claude를 열었으니 그 폴더 안에서만 작동하겠지” — 작업 디렉토리와 접근 범위를 동일시했음.
메커니즘
[claude.ai 웹 채팅]
브라우저 → 브라우저 샌드박스 → 파일시스템 접근 불가
│
└─ 브라우저는 보안상 로컬 파일에 접근 못함
[Claude Code CLI]
터미널 → 로컬 프로세스 → OS 파일 퍼미션 범위 내 어디든
│
└─ /Users/username/ 아래 모든 경로
(퍼미션이 있는 한)
작업 디렉토리(cwd)의 역할:
~/my-project에서 실행 → 상대 경로의 기준점- 절대 경로(
/Users/username/...)를 쓰면 어디든 접근 가능 - cwd는 jail이 아님
해결 패턴
# cwd가 my-project이어도 절대 경로로 다른 프로젝트 접근 가능
Read("/Users/username/Developer/project-a/src/foo.md")
Write("/Users/username/.claude/notes/bar.md")
Bash("cat ~/Developer/project-b/.gitignore")
다음에 이 상황을 만나면
트리거: “이 세션에서 저 파일에 접근할 수 있나?” 의문이 생길 때
- 절대 경로로 지정하면 된다
- OS 퍼미션이 없으면 거부됨 (Claude Code 문제가 아니라 OS 문제)
- 민감한 파일(
.env, 키 파일)도 접근 가능 → 신뢰할 수 있는 컨텍스트에서만 실행
커넥팅 닷
← 선행 개념 (이걸 알아야 이해된다)
- Unix 프로세스 모델 — 프로세스는 파일시스템에 대해 사용자 권한으로 실행된다. cwd는 상대 경로 해석의 기준이지 접근 제한이 아님
- 브라우저 샌드박스 — 브라우저는 보안을 위해 웹 콘텐츠를 로컬 파일시스템과 격리한다. 이것이 claude.ai 웹과의 차이
→ 확장 개념 (여기서 더 나아가면)
- chroot / Docker 컨테이너 — 프로세스의 파일시스템 접근을 실제로 제한하는 메커니즘. Claude Code가 안 하는 것
- Claude Code 샌드박스 모드 — 특정 실행 환경에서는 도구 호출에 사용자 승인이 필요. 이건 OS 퍼미션이 아닌 Claude Code 레이어 제한
↔ 같은 원리가 적용되는 곳
- npm scripts cwd —
package.json이 있는 디렉토리가 cwd가 되지만, 스크립트 안에서 절대 경로로 다른 곳 접근 가능 - Git worktree — 하나의 리포지토리를 여러 디렉토리에 체크아웃. cwd가 달라도 같은 git 오브젝트에 접근