Claude Code 학습·데이터 보존: 내 코드가 남는 곳과 기간
가짜 .env를 하나 만들어 두고 Claude Code에게 DB_PASSWORD 값이 뭐냐고 물어봤습니다. 당연히 값을 알려 주더라고요.
그다음 ~/.claude/projects/ 아래 그 프로젝트의 기록 파일을 검색해 보니, 그 비밀번호가 두 줄에 그대로 들어 있었습니다. Claude가 그 값을 읽고 답했다는 건 값이 모델에게도 건너갔다는 뜻이고요.
그래서 정리해 봤습니다. Claude Code에 보낸 코드는 학습에 쓰이는지, Anthropic 서버에는 얼마나 남는지, 대화 말고 따로 나가는 건 무엇인지요.
짧게 답하면 이렇습니다. 개인 계정(Free·Pro·Max)이면 claude.ai 개인정보 설정에서 학습을 허용했는지가 Claude Code에도 그대로 적용되고, 허용하면 5년, 아니면 30일 보존입니다.
회사 계정(Team·Enterprise)과 API 키는 따로 데이터를 제공하겠다고 선택하지 않는 한 학습에 쓰이지 않고, 표준 보존은 30일입니다.
그리고 어느 계정이든 Claude가 읽은 비밀은 서버로 가고 로컬에도 평문으로 남으니, .env 같은 파일은 읽기 자체를 막아 두는 게 좋습니다.
공식 문서는 2026년 10월 7일 기준이고, 로컬 기록 부분은 같은 날 Ubuntu 24.04 · Claude Code 2.1.292 테스트 환경에서 직접 확인했습니다. 10월 13일에는 Windows 11 · Claude Code 2.1.296에서 같은 실험과 /feedback 화면을 다시 확인했습니다.
확인한 버전·환경
- Claude Code 2.1.296 · Windows 11 · Windows PowerShell 5.1 · 확인일 2026-10-13
- Claude Code 2.1.292 · Ubuntu 24.04 · 확인일 2026-10-07
개인 계정은 설정 하나, 회사 계정은 기본이 ‘안 씀’
학습에 쓰이는지는 Claude Code가 아니라 로그인한 계정이 정합니다. 같은 Claude Code라도 개인 Pro 계정으로 쓰느냐, 회사 Team 계정이나 API 키로 쓰느냐에 따라 규칙이 달라져요.
| 계정 | 학습에 쓰이나 | Anthropic 서버 보존 |
|---|---|---|
| Free·Pro·Max, 학습 허용 | 쓰임 | 5년 |
| Free·Pro·Max, 학습 비허용 | 안 쓰임 | 30일 |
| Team·Enterprise·API | 안 쓰임(데이터 제공을 택한 경우 제외) | 표준 30일 |
| Bedrock·Google Cloud 등 클라우드 플랫폼 | 안 쓰임(상업 약관) | 각 플랫폼 정책 |
개인 계정에서 헷갈리기 쉬운 건 이 설정이 claude.ai 채팅과 Claude Code에 한꺼번에 걸린다는 점입니다. 채팅용으로 학습을 허용해 뒀다면 터미널에서 보낸 코드도 같은 설정을 따릅니다.
설정은 언제든 claude.ai의 개인정보 설정 페이지에서 바꿀 수 있어요. 회사 코드를 개인 계정으로 다루고 있다면 여기부터 확인해 보세요.
회사 계정의 “데이터 제공을 택한 경우”는 Development Partner Program 같은 것입니다. 조직 관리자가 명시적으로 가입해야 하고, Anthropic 자체 API에만 있어서 Bedrock이나 Google Cloud 쪽 사용자는 해당하지 않습니다. 가입하면 제공한 자료가 학습에 쓰일 수 있습니다.
서버에 남는 기간: 30일, 5년, 그리고 ZDR
Claude Code는 로컬에서 돌지만, 모델에 묻는 순간 프롬프트와 모델 출력이 전부 네트워크로 나갑니다(TLS 1.2 이상으로 암호화). 파일 내용이든 명령 출력이든 Claude가 읽은 것은 그 프롬프트에 들어가고요. 서버에 남는 기간은 위 표대로입니다.
회사 쪽에는 보존 기간을 0으로 만드는 ZDR(Zero Data Retention)이 있습니다. 켜면 Claude Code 세션의 프롬프트와 응답이 실시간으로 처리되고 응답 뒤에는 저장되지 않아요. 다만 법을 지켜야 하거나 오남용에 대응해야 하는 경우는 예외라서, 정책 위반으로 표시된 세션은 입력과 출력이 최대 2년까지 남을 수 있습니다.
ZDR은 Claude for Enterprise에서도 기본으로 들어 있지 않습니다. 자격을 갖춘 계정만 영업팀이나 계정 담당 팀을 통해 조직 단위로 켤 수 있고, 관리자 설정에서 직접 켜는 스위치는 없어요.
ZDR을 켜도 덮이지 않는 곳
회사에서 ZDR을 켰으니 다 괜찮다고 볼 때 빠지기 쉬운 자리가 있습니다.
- 개발자가 개인 계정이나 다른 조직의 API 키로 로그인한 세션은 ZDR 밖입니다. 관리 설정의
forceLoginMethod·forceLoginOrgUUID로 로그인을 조직 계정으로 묶어야 합니다. - claude.ai 채팅, Cowork, 사용 분석의 메타데이터(계정 이메일·사용 통계), 좌석 관리 정보는 표준 보존을 따릅니다.
- MCP 서버 같은 서드파티 연동이 처리한 데이터는 그 서비스의 정책을 따로 봐야 합니다.
- 클라우드 세션, Remote Control,
/feedback·/bug·/share, Artifacts, Claude Tag는 Anthropic 쪽에 대화나 내용을 저장해야 해서 ZDR 조직에서는 아예 꺼집니다.
ZDR 조직에서 Fable 모델이 /model 목록에 없거나 비활성으로 보인다면 이 때문일 수 있습니다. Fable 5.1과 Fable 5는 기본적으로 데이터 보존이 필요한 모델이라, ZDR 조직이 쓸 수 있는지는 Claude Code가 아니라 별도 정책이 정합니다.
대화 말고 따로 나가는 것들
학습 설정을 꺼 뒀어도 별도 경로로 나가는 데이터가 있습니다. 대부분 내가 직접 고르는 동작이지만, 무엇을 고르는지 알고 누르는 게 좋습니다.
/feedback을 보내면 대화 사본이 5년 남는다
/feedback(같은 경로를 쓰는 /bug·/share 포함)을 보내면 코드가 들어 있는 대화 기록 사본이 Anthropic에 가고 5년 보존됩니다. 보내기 전에 범위를 고를 수 있는데, 기본은 현재 세션만이고 같은 프로젝트의 최근 24시간이나 7일 세션까지 넓힐 수도 있어요.
경우에 따라 공개 저장소에 GitHub 이슈가 함께 만들어지기도 합니다. 버그를 신고할 때 비밀이 오간 세션이라면 범위를 넓히지 마세요.
Windows의 2.1.296에서 /feedback을 실행하니 바로 보내는 창이 아니라 Feedback drafts 패널이 먼저 열렸습니다. Claude가 눈여겨볼 만한 순간에 피드백 초안을 만들어 두면 여기 쌓이고, 내가 검토한 뒤에 보내는 구조예요.
초안이 쌓여 있다면 보내기 전에 내용을 꼭 열어 보세요. Write new feedback으로 들어가도 설명을 적는 칸에서 Esc를 누르면 Feedback / bug report cancelled로 끝나고 아무것도 보내지 않았습니다.
Bedrock·Google Cloud 같은 서드파티 제공자를 쓰거나 Anthropic 자격 증명이 없으면 /feedback은 보내는 대신 ~/.claude/feedback-bundles/에 로컬 파일로 저장합니다. 그 파일은 내가 직접 전달하기 전까지 밖으로 나가지 않아요.
세션 평가 다음에 뜨는 두 번째 질문
가끔 How is Claude doing this session?이라는 평가 질문이 뜹니다. 여기에 답하는 건(닫기를 골라도) 점수만 기록되고 대화는 보내지 않습니다. 헷갈리는 건 그다음에 따로 뜰 수 있는 질문이에요.
Can Anthropic look at your session transcript to help us improve Claude Code?에 Yes를 고르면 대화 기록, 서브에이전트 기록, 디스크의 원본 세션 로그가 업로드됩니다. 알려진 API 키·토큰 패턴은 가리지만 소스 코드와 파일 내용은 그대로 올라가고, 최대 6개월 보존됩니다(Bedrock·Google Cloud 같은 제공자에서는 업로드 대신 로컬 파일로 저장).
학습에는 쓰이지 않는다고 못 박혀 있긴 해도, 비밀이 오간 세션이었다면 No를 고르세요. Don’t ask again을 고르면 이후 세션에서 이 질문이 다시 뜨지 않습니다.
지표와 오류 보고에는 코드가 없다
지연·안정성·사용 패턴 같은 지표는 Anthropic과 서드파티 로깅 서비스로 갑니다. 코드, 프롬프트, 파일 경로는 들어가지 않아요.
오류 보고는 Claude Code 내부의 오류 메시지와 스택 추적이고, 보내기 전에 비밀·파일 경로·이메일 같은 알려진 패턴을 지웁니다. 오류 보고는 Pro·Max 로그인, v2.1.198 이상, Claude API 직접 연결, ZDR·HIPAA 계약 없음이 모두 맞을 때만 켜집니다.
웹 페이지를 가져오는 WebFetch는 가져오기 전에 호스트 이름만 api.anthropic.com에 보내 차단 목록과 대조합니다. 전체 주소나 페이지 내용은 보내지 않고, 어느 제공자를 쓰든 돕니다.
끄는 방법과 끄면 달라지는 것
하나씩 끄는 변수는 다음과 같습니다. 셸에 두어도 되고, 설정 파일의 env 블록에 적어도 됩니다. 아래는 문서의 변수 이름으로 짠 예시입니다.
{
"env": {
"DISABLE_TELEMETRY": "1",
"DISABLE_ERROR_REPORTING": "1",
"DISABLE_FEEDBACK_COMMAND": "1",
"CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY": "1"
}
}
전부 한 번에 끄려면 CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 하나면 됩니다. 다만 이건 자동 업데이트와 릴리스 노트까지 끄니, 업데이트는 직접 챙겨야 해요.
WebFetch 호스트 확인은 이 변수로도 꺼지지 않고 설정 파일의 skipWebFetchPreflight: true로만 꺼집니다. 설문이 너무 자주 뜨는 게 싫은 정도라면 끄는 대신 feedbackSurveyRate에 0~1 사이 확률을 넣는 방법도 있어요.
여기서 헷갈리기 쉬운 게 하나 있어요. DISABLE_TELEMETRY, DISABLE_ERROR_REPORTING, CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC 셋은 대부분의 켜고 끄는 변수와 달리 값이 아니라 설정했는지만 봅니다. 그래서 0이나 false를 넣어도 꺼진 상태가 되고, 다시 켜려면 변수를 아예 지우거나 빈 값으로 둬야 해요.
주의:
DISABLE_TELEMETRY나CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC를 켜면 기능 플래그도 받아 오지 않아서, Remote Control을 못 쓰게 될 수 있고claude -p·Agent SDK 세션이 권한 모드를 따로 정하지 않았을 때 auto로 시작합니다(v2.1.285 이상, 조직 정책이 막으면 default).
권한 모드가 바뀌는 쪽은 자동화 스크립트에서 특히 놓치기 쉽습니다. 어떤 조건에서 무엇으로 시작하는지는 권한 모드 기본값 정리에 있으니, 텔레메트리를 끄기 전에 스크립트에 --permission-mode를 명시해 두세요. 오류 보고만 끄는 DISABLE_ERROR_REPORTING은 기능 플래그에 영향을 주지 않습니다.
내 디스크에 남는 기록
도입에서 말한 실험을 좀 더 자세히 적어 둡니다. 서버 쪽 정책과 별개로, 로컬에는 대화가 평문 .jsonl로 기본 30일 남습니다.
처음에는 .env의 키 이름만 알려 달라고 했습니다. Claude가 값을 빼고 키 이름만 뽑는 명령을 스스로 짜서 돌리더라고요. 이때 기록 파일에는 비밀번호 값이 한 번도 없었습니다.
다음에 DB_PASSWORD 값을 물었더니 Claude가 grep -n DB_PASSWORD .env를 실행했고, 그 결과 줄과 Claude의 답, 이렇게 두 줄에 값이 남았어요. 한 번도 읽지 않은 API_KEY 값은 기록에 없었습니다.
~/.claude/projects/<프로젝트>/<세션>.jsonl에서 값이 나온 두 줄은 이랬습니다.
도구 결과 2:DB_PASSWORD=not-a-real-password-42
Claude의 답 `.env` 2번째 줄에 `DB_PASSWORD=not-a-real-password-42`로 설정되어 있습니다.
Windows 11의 2.1.296에서도 같은 .env로 다시 해 봤습니다. 이번에는 Claude가 셸의 grep 대신 내장 Grep 도구로 DB_PASSWORD 줄을 찾았는데, 값은 역시 도구 결과와 답 두 줄에 남았고 읽지 않은 API_KEY는 없었어요.
기록에 남는 건 파일 전체가 아니라 도구를 지나간 것뿐입니다. 거꾸로 말하면 Claude가 한 번이라도 읽거나 출력한 비밀은 서버로도 갔고 로컬에도 남는다는 뜻이에요.
테스트 환경에서 기록 폴더는 drwx------, 파일은 -rw-------로 소유자만 읽을 수 있었습니다. 암호화는 없고 이 파일 권한이 보호의 전부입니다.
Windows에서는 기록 폴더에 따로 거는 권한이 없고 사용자 폴더의 권한을 그대로 물려받습니다. icacls로 기록 폴더를 보니 모든 항목이 사용자 폴더에서 물려받은 권한((I))이었고, 본인과 SYSTEM, Administrators가 전체 권한을 갖고 있었어요. 관리자 권한으로 도는 프로그램이면 읽을 수 있다는 뜻입니다.
읽기 전에 막아 두면 기록에도 안 남는다
같은 .env를 둔 폴더에 프로젝트 설정 .claude/settings.json으로 deny 규칙 하나를 걸고 같은 질문을 해 봤습니다.
{ "permissions": { "deny": ["Read(./.env)"] } }
Claude는 이번에도 grep -n DB_PASSWORD .env를 시도했는데, 실행 전에 막혔습니다. Claude가 받은 메시지는 Permission to use Bash with command grep -n DB_PASSWORD .env has been denied.였고, 값은 기록 파일 어디에도 없었어요. 규칙만 뺀 같은 조건에서는 값이 두 줄 남았으니, 차이는 이 한 줄입니다.
Windows에서도 같은 규칙이 먹었습니다. 이번에 막힌 건 셸 명령이 아니라 Grep 도구 호출이었고, 기록 파일에 값은 한 줄도 없었어요. Claude는 다른 도구로 돌아가 읽지 않고 읽기 권한이 거부됐다고만 답했습니다.
Read deny는 파일 도구뿐 아니라 Claude Code가 알아보는 셸의 파일 명령(cat·head·tail·sed 등, 이번 실험에서는 grep도)과 리디렉션까지 막아 줍니다.
다만 파일 이름을 적지 않는 grep -r pattern . 같은 명령이나, 파이썬·노드 스크립트가 안에서 여는 파일은 막지 못합니다. 규칙을 쓰는 자세한 문법은 권한 규칙의 allow·deny 문법에 정리해 뒀어요.
기록 자체를 남기지 않기
기록을 아예 남기지 않으려면 CLAUDE_CODE_SKIP_PROMPT_HISTORY=1을 켜고 실행하면 됩니다. 같은 질문을 이 변수와 함께 했더니 ~/.claude/projects/ 아래에 그 프로젝트 폴더가 생기지 않았어요. 대신 그 세션은 --resume으로 이어 갈 수 없습니다.
보존 기간을 줄이는 cleanupPeriodDays와 프로젝트 단위로 지우는 claude purge는 .claude 폴더에 쌓이는 기록과 지우는 법에 정리해 뒀습니다.
다른 사람들이 겪은 일
세 건 모두 비밀이 대화 안으로 들어가 버린 보고이고, 셋 다 not planned로 닫혔습니다.
- walt93(2025-10-16, #9637, macOS · 2.0.14)은 인증 오류가 나는 엔드포인트를 디버깅시키면 Claude가 자격 증명을 찾아
curl명령에 넣으려 한다고 보고합니다. 모델에 절대 보여 주지 않을 파일 목록을 두는 기능을 제안했어요. - RCushmaniii(2026-04-07, #44868, Windows 11 Git Bash · Opus 4.6 모델)는 형식이 깨진
.dev.vars를 고치던 중 Claude가 실행한grep -n curl .dev.vars가 Cloudflare API 토큰이 든 줄 전체를 출력해 토큰을 바로 교체했다고 합니다.CLAUDE.md로 비밀 출력을 금지해 둔 상태였다고 하고요. - zbrad(2026-06-17, #68958, VS Code 확장 2.1.179 · WSL의 Ubuntu/Debian)는 Claude가 토큰을 대화에 붙여 넣는 방법을 여러 선택지 중 하나로 내밀었고, 붙여 넣어 실행한 뒤에야 토큰이 평문 기록에 남았으니 교체하라고 했다고 보고합니다.
두 번째 사례의 grep -n은 제 실험에서 Claude가 고른 명령과 같습니다. 그 사례는 CLAUDE.md의 금지 문구로 막지 못했고, 두 번째와 세 번째 사례 모두 값이 들어간 뒤에 할 수 있는 일은 토큰 교체뿐이었어요. 그래서 저는 부탁보다 위에서 본 deny 규칙처럼 읽기 자체를 막는 쪽을 권합니다.
마치며
정리하고 나니 “학습에 쓰이나”보다 “한 번이라도 대화에 들어갔나”가 더 중요한 질문이더라고요.
Anthropic 계정이나 API 키로 쓴다면 ZDR이 아닌 한 학습을 꺼도 대화는 Anthropic 서버에 30일 남고, 로컬에도 평문으로 남습니다. Bedrock·Google Cloud 같은 클라우드 플랫폼을 거친다면 서버 쪽 보존은 그 플랫폼의 정책을 따릅니다. 비밀 하나가 지나가면 그 뒤로는 설정으로 되돌릴 수 없어요.
개인 계정이라면 먼저 claude.ai 개인정보 설정에서 학습 허용 여부를 확인해 보세요. 그리고 .env 같은 파일은 deny 규칙으로 막아 두고, 비밀이 오간 세션에서는 /feedback과 설문의 두 번째 질문에 대화를 보내지 마세요. 읽어 온 웹 페이지나 파일이 Claude를 속여 비밀을 내보내게 하는 경우는 프롬프트 인젝션 방어 글에서 이어집니다.
참고한 공식 자료
모두 2026년 10월 7일에 확인했습니다.
- Data usage — 계정별 학습 정책과 보존 기간,
/feedback·세션 평가 설문, 지표·오류 보고, 제공자별 기본값, WebFetch 호스트 확인 - Zero data retention — ZDR 적용 범위와 예외, ZDR에서 꺼지는 기능, 정책 위반 시 보존
- Security — 개인정보 보호 장치와 클라우드 세션 보안
- Explore the .claude directory — 로컬 기록의 평문 저장, 자동 정리, 기록을 남기지 않는 방법
- Environment variables —
DISABLE_TELEMETRY·CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC·CLAUDE_CODE_SKIP_PROMPT_HISTORY의 동작 - Permission modes — 기능 플래그를 받지 않는 세션의 시작 권한 모드
- Configure permissions —
Readdeny 규칙이 막는 셸 명령과 막지 못하는 경우
인용한 공개 사례
- walt93, 2025-10-16, Claude Code AGGRESSIVELY reads secrets out of .env files and leaks them to your servers in so doing (#9637)
- RCushmaniii, 2026-04-07, Claude Code exposes secrets from .env / .dev.vars files via grep -n and Read tool, despite CLAUDE.md prohibitions (#44868)
- zbrad, 2026-06-17, Claude offers/accepts pasting secrets (API keys, tokens, passwords) directly into chat with no upfront warning (#68958)
변경 이력
- 2026-10-13 — Windows 11 · Claude Code 2.1.296에서 다시 확인한 결과를 더했습니다. /feedback이 Feedback drafts 패널부터 여는 화면, .env 값이 Grep 도구를 거쳐 기록 두 줄에 남는 것과 Read deny 규칙이 Grep 도구도 막는 것, Windows 기록 폴더가 사용자 폴더 권한을 그대로 물려받는다는 점입니다.