블로그

Claude Code는 30일이 지나면 기록을 삭제합니다: 저장하는 방법

Markdown

Claude Code 세션이 저장되는 위치, cleanupPeriodDays 설정 방법, rsync, launchd 또는 cron을 사용해 외부 아카이브를 구성하는 방법을 알아봅니다.

전체 글 읽기

서비스 사용에 도움이 필요하면 Ailoot 문서를 참조하세요.

Claude Code가 정말 세션 기록을 삭제하나요?

핵심 요점

그렇습니다. Claude Code는 시작할 때마다 30일이 지난 세션 파일을 삭제합니다. ~/.claude/settings.json의 cleanupPeriodDays 설정이 이 동작을 제어하며, 기본값은 30입니다. 삭제는 경고나 동의 요청 없이 진행되고, 파일을 복구할 방법도 없습니다.

두 달 전 세션을 이어서 작업하려고 Claude Code를 열었는데 세션이 사라졌습니다. 파일이 디스크에서 완전히 지워진 것입니다. 결함이나 드문 버그가 아닙니다. 기본 정리 기능이 원래 그렇게 작동합니다.

정리를 제어하는 설정은 하나입니다. cleanupPeriodDays이며, 기본값은 30입니다. Claude Code는 시작할 때마다 기록 폴더를 훑고 해당 기간보다 오래된 파일을 전부 삭제합니다. 제 ~/.claude/settings.json에는 이 설정이 아예 없었고, 따라서 기본값이 적용되어 예전 세션 몇 개가 이미 사라진 상태였습니다.

Anthropic 저장소에는 이 문제에 관한 버그 보고가 여러 건 열려 있으며, 해결된 것은 없습니다.

Claude Code는 세션 기록을 어디에 저장하나요?

핵심 요점

각 세션의 기록은 ~/.claude/projects/<project-path>/<session-id>.jsonl에 저장됩니다. 폴더 이름은 Claude Code를 실행한 작업 디렉터리의 절대 경로를 나타내며, 슬래시는 하이픈으로 바뀝니다. .jsonl 파일에는 대화 전체가 한 줄씩 들어 있습니다. 사용자의 프롬프트, 모델 응답, 도구 호출, 파일 수정 내용이 포함됩니다. 정리 기능이 삭제하는 바로 그 기록입니다.

기록을 찾기는 쉽습니다. 터미널을 열고 폴더 내용을 확인하세요.

ls ~/.claude/projects/

각 하위 폴더는 별도의 프로젝트입니다. 폴더 이름은 경로를 나타냅니다. 예를 들어 /Users/alex/dev/shop에 있는 프로젝트는 -Users-alex-dev-shop 폴더가 됩니다. 폴더 안에는 세션 파일이 있습니다.

ls -lt ~/.claude/projects/-Users-alex-dev-shop/
# 3f8a1c2e-....jsonl   ← 세션 하나 = 파일 하나
# a91b7d40-....jsonl

각 .jsonl은 한 줄씩 기록되는 로그입니다. 한 줄이 세션 이벤트 하나에 해당합니다. 대화 텍스트만 들어 있는 것이 아닙니다. 특정 데이터베이스 구조를 선택한 이유, 거부한 선택지, Claude가 실수한 지점과 이를 바로잡은 방법 등 의사 결정의 논리도 담겨 있습니다.

요컨대 프로젝트 개발 일지입니다. 그래서 잃으면 아픕니다. 단순한 “채팅”이 아니라 몇 주에 걸쳐 쌓아 온 맥락을 잃는 것이기 때문입니다. 이 맥락의 구조는 “Claude Memory vs. CLAUDE.md” 가이드에서 다뤘습니다.

Anthropic은 왜 30일이 지나면 대화 기록을 삭제하나요?

핵심 요점

Anthropic은 개인정보 보호와 보안을 이유로 듭니다. 세션 파일은 디스크에 일반 텍스트로 저장되며 소스 코드, 암호, API 키가 포함될 수 있습니다. 파일을 영구 보관하는 것은 위험합니다. 노트북을 도난당하거나 누군가 디스크에 접근하면 민감한 데이터 전체를 얻을 수 있습니다. 30일이라는 기간은 “최근 작업을 이어 가는 것”과 “필요 이상으로 디스크에 비밀 정보를 보관하지 않는 것” 사이에서 선택한 절충안입니다.

삭제에는 나름의 이유가 있으므로 완전히 끄기 전에 이해해 두는 편이 좋습니다. 대화 기록은 일반 텍스트입니다. 세션 중 Claude가 .env 파일을 읽었거나, 명령어에 키를 넣었거나, 프롬프트에 암호를 붙여 넣었다면 그 내용은 전부 .jsonl에 일반 텍스트로 기록됩니다. 파일이 디스크에 오래 남아 있을수록 언젠가 정보가 유출될 가능성이 커집니다.

Anthropic은 이를 분명히 설명합니다. 대화 기록에는 소스 코드, 인증 정보, 기타 민감한 자료가 포함될 수 있고, 필요 이상으로 디스크에 보관하면 실제 개인정보 보호 위험이 생깁니다. 30일이라는 기간은 절충안으로 정해졌습니다.

커뮤니티가 제기하는 문제는 세 가지입니다. 삭제가 조용히 이뤄지고(설정 중이나 시작 시 경고가 없음), 동의를 구하지 않으며(사용자에게 묻지 않음), 복구할 수 없습니다(휴지통을 사용하지 않고 되돌리기도 불가능함). 이슈 #59248에서 개발자들은 한 가지를 요구합니다. 경고와 복구 기간을 제공하고 기본 기간을 덜 공격적으로 설정해 정리를 공정하게 하라는 것입니다.

백업 스크립트가 오히려 삭제를 유발할 수 있는 이유는 무엇인가요?

핵심 요점

정리 기능은 파일 수정 시간(mtime)을 기준으로 삭제 대상을 결정합니다. 세션에서 실제로 마지막 활동이 있었던 때를 확인하지는 않습니다. 클라우드 동기화, rsync, 편집기, 스크립트 등 .jsonl 파일에 손대는 프로세스라면 무엇이든 mtime을 바꿔 새 세션을 오래된 것처럼 보이게 할 수 있습니다. 다음에 Claude Code가 시작되면 해당 세션을 오래된 것으로 판단해 삭제합니다. 역설적으로 관리 대상 폴더 안에서 기록을 백업하려는 단순한 시도가 기록을 더 빨리 잃게 만들 수 있습니다.

이 부분이 가장 까다롭고, 직접 데이터를 보호하려는 사람들이 자주 놓치는 함정입니다. 정리 기능은 파일의 마지막 수정 시각인 mtime을 확인합니다. mtime이 세션에서 마지막으로 작업한 시점을 나타낸다고 가정합니다. 실제로는 Dropbox나 iCloud 동기화 클라이언트, rsync, 바이러스 백신 소프트웨어, 인덱서, 직접 만든 백업 스크립트 등 무엇이든 mtime을 바꿀 수 있습니다.

이런 함정이 있습니다. 기록을 보존하기로 하고 ~/.claude/projects/에 클라우드 동기화를 설정합니다. 어느 시점에 동기화 서비스가 파일을 다시 쓰면서 mtime을 과거 시각으로 설정합니다(클라우드 사본에서 복원할 때 이런 일이 생길 수 있습니다). Claude Code는 시작하면서 “오래된” 파일을 보고 삭제합니다. 파일을 보존하려 했지만 오히려 삭제를 앞당긴 셈입니다.

결론은 하나입니다. 백업은 ~/.claude/projects/ 바깥에 있어야 합니다. 정리 기능은 이 폴더 안에서만 작동합니다. 외부에 저장된 사본은 정리 기능이 건드릴 수 없습니다. 이 원칙을 바탕으로 해결책을 구성하겠습니다.

지금 당장 기록 삭제를 막으려면 어떻게 해야 하나요?

핵심 요점

설정 하나면 됩니다. ~/.claude/settings.json을 열고 cleanupPeriodDays를 큰 값으로 설정하세요. 예를 들어 3650(10년)으로 설정하면 됩니다. 실질적으로 자동 삭제가 비활성화됩니다. 그 기간보다 오래된 것이 없기 때문입니다. 중요: 이 설정은 아직 삭제되지 않은 기록만 보호합니다. 정리 기능이 이미 지운 기록은 복원할 수 없습니다. 그러므로 또 다른 세션을 잃기 전에 우선 조치를 취해야 합니다.

세 단계로 삭제를 막으세요.

  1. 설정 파일 ~/.claude/settings.json을 엽니다(파일이 없으면 새로 만드세요).
  2. cleanupPeriodDays 설정을 추가하고 큰 값을 지정합니다.
{
  "cleanupPeriodDays": 3650
}
  1. 파일을 저장합니다. 설정은 다음에 Claude Code를 시작할 때 적용됩니다.

3650은 10년을 뜻합니다. 실질적으로 삭제가 더는 이뤄지지 않습니다. 정리 기능은 유지하면서 기간을 늘리고 싶다면 365(1년)로 설정하세요. 그러면 1년이 지난 세션만 사라집니다. 다음 명령어로 설정이 적용되었는지 확인할 수 있습니다.

grep cleanupPeriodDays ~/.claude/settings.json

쉽게 놓칠 수 있는 주의 사항이 하나 있습니다. 기간을 늘려도 이미 삭제된 기록은 복원되지 않습니다. 정리는 시작할 때 실행되며, 이전 실행에서 지워진 항목은 영구적으로 사라집니다. 그러므로 이 설정을 먼저 해야 합니다. 앞으로의 손실은 막지만 이미 지워진 기록을 되살리지는 못합니다. Claude Code 기록과 함께 실수로 실행한 명령어 때문에 프로젝트까지 잃는 일을 막고 싶다면 “Claude Code가 프로젝트를 망가뜨리지 않도록 설정하는 방법” 가이드를 참조하세요.

세션 기록은 프로젝트의 세컨드 브레인 일부입니다. 다른 곳에 기록하지 않은 의사 결정의 논리가 들어 있습니다. cleanupPeriodDays는 파일을 보존해 주지만, 6개월 뒤 필요한 내용을 찾아낼 수 있는 시스템을 만들어 주지는 않습니다.

정리 폴더 밖에 기록을 자동 보관하려면 어떻게 하나요?

핵심 요점

정리 기능이 적용되지 않는 ~/.claude/projects/ 바깥의 아카이브에 세션을 복사하세요. 하루에 한 번 별도의 디렉터리로 간단히 rsync -a를 실행하면 됩니다. 새 파일은 추가되고 기존 파일은 그대로 남습니다. 아카이브가 외부에 있으므로 cleanupPeriodDays와 mtime 버그 모두 영향을 주지 않습니다. macOS에서는 launchd, Linux에서는 cron으로 실행을 자동화하면 기록이 저절로 쌓입니다.

아이디어는 간단합니다. Claude Code가 자기 폴더에서 원하는 대로 작업하게 두는 한편, 별도 아카이브를 폴더 밖에 유지하세요. 그 정리 기능에서는 보호되지만 디스크 고장, 실수로 인한 삭제, 복사 실패로 잃을 수 있습니다. 다음과 같이 설정하세요.

  1. 관리 대상 디렉터리 밖에 아카이브 폴더를 만듭니다.
mkdir -p ~/claude-history-archive
  1. 현재 기록을 그곳에 복사합니다. -a 플래그는 구조와 타임스탬프를 보존하고, --ignore-existing은 이미 복사된 파일을 그대로 둡니다.
rsync -a ~/.claude/projects/ ~/claude-history-archive/
  1. 하루에 한 번 실행되도록 자동화합니다. macOS에서는 launchd를 사용합니다. ~/Library/LaunchAgents/com.example.claudearchive.plist 파일을 만드세요.
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.example.claudearchive</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/bin/rsync</string>
    <string>-a</string>
    <string>/Users/YOUR_NAME/.claude/projects/</string>
    <string>/Users/YOUR_NAME/claude-history-archive/</string>
  </array>
  <key>StartInterval</key>
  <integer>86400</integer>
</dict>
</plist>
  1. 에이전트를 로드해 백그라운드에서 실행되게 합니다.
launchctl load ~/Library/LaunchAgents/com.example.claudearchive.plist

Linux에서는 crontab에 한 줄을 추가하면 됩니다(crontab -e).

0 3 * * * rsync -a ~/.claude/projects/ ~/claude-history-archive/

앞 절의 동기화는 실패하는데 이 방법은 왜 작동할까요? 아카이브가 ~/.claude/projects/ 바깥에 있으므로 정리 기능이 아예 볼 수 없습니다. 복사는 한 방향으로만 이뤄집니다(현재 폴더에서 아카이브로). 또한 현재 폴더의 파일 mtime을 건드리지 않으므로 mtime 문제가 생기지 않습니다. 내일 Claude Code가 자기 폴더에서 세션을 삭제하더라도 아카이브 사본은 남습니다.

세션 아카이브를 검색 가능한 세컨드 브레인으로 만들려면 어떻게 해야 하나요?

핵심 요점

아카이브를 git으로 관리하면 모든 세션을 버전 관리하고 완전히 검색할 수 있는 데이터베이스를 얻게 됩니다. 아카이브 폴더에서 git init을 실행하고, 매일 git add -A && git commit을 실행하면 변경 기록이 생기고 실수로 덮어쓰는 일에도 대비할 수 있습니다. .jsonl은 줄 단위 JSON이므로 일반 grep으로 과거 세션을 검색하고 jq로 구조화된 내용을 추출할 수 있습니다. 이렇게 아카이브를 실용적인 도구로 만들 수 있습니다.

파일을 쌓아 두는 것만으로는 충분하지 않습니다. 파일을 찾아볼 수 있어야 합니다. 두 단계를 거치면 아카이브를 실제로 쓸 수 있는 도구로 바꿀 수 있습니다.

먼저 git으로 버전을 관리합니다. 아카이브 폴더에서 저장소를 초기화하세요.

cd ~/claude-history-archive
git init
git add -A && git commit -m "First snapshot of Claude Code history"

rsync와 함께 실행하는 일일 작업에 git add -A && git commit을 추가하세요. 이제 버전 기록을 갖게 됩니다. 언제 무엇이 추가됐는지 확인할 수 있고, 명령어 하나로 실수로 덮어쓴 내용을 되돌릴 수 있습니다.

다음으로 검색합니다. .jsonl 파일은 줄 단위 JSON이므로 익숙한 도구를 사용할 수 있습니다. 특정 주제가 논의된 세션을 찾아보세요.

grep -rl "database migration" ~/claude-history-archive/

jq를 사용해 세션에서 프롬프트 텍스트만 추출할 수도 있습니다(JSON 형식이므로 jq를 사용합니다).

jq -r 'select(.type=="user") | .message.content' session.jsonl

이제 세션 기록은 프로젝트의 세컨드 브레인 역할을 하기 시작합니다. “3월에 이 결정을 어떻게 내렸더라?” 같은 정보를 몇 초 만에 찾아낼 수 있는 데이터베이스입니다. 세션에서 맥락이 어디에 들어가며 어떻게 관리하는지 별도로 설명한 내용은 “Claude Code에서 토큰은 어디로 가는가”를 참조하세요.

이미 삭제된 세션을 복구할 수 있나요?

핵심 요점

내장된 방법은 없습니다. Claude Code는 삭제한 파일을 휴지통에 넣거나 되돌리기 기록을 보관하지 않습니다. 파일은 영구적으로 지워집니다. 삭제 전에 만들어 둔 외부 사본이 유일한 가능성입니다. macOS의 Time Machine 스냅샷, OneDrive 또는 Dropbox의 버전 기록, 수동 백업이 이에 해당합니다. 이런 사본이 없으면 세션은 사라진 것입니다. 잃을 것이 생기기 전에 미리 보호를 설정해야 하는 이유입니다.

솔직히 말하면, 아마 복구할 수 없습니다. Claude Code에는 복구 기능도, 휴지통도, 삭제된 대화 기록을 위한 실행 취소 로그도 없습니다. 파일은 디스크에서 그냥 사라집니다.

한 가지 가능성은 미리 활성화해 둔 시스템 백업입니다.

  1. macOS Time Machine — 삭제 전에 스냅샷이 ~/.claude/projects/를 저장했다면, 필요한 날짜의 백업에서 파일을 가져올 수 있습니다.
  2. OneDrive / Dropbox 버전 기록 — 버전 관리가 켜진 상태로 폴더를 동기화했다면 클라우드의 버전 기록에서 파일을 찾아보세요. (단, 동기화가 삭제를 유발했을 수도 있다는 mtime 함정을 기억하세요.)
  3. 수동 복사본 — rsync/cp를 실행해 관리 대상 폴더 밖에 수동으로 복사해 둔 모든 사본입니다.

이런 사본이 하나도 없다면 세션은 사라진 것입니다. 드문 일도 아닙니다. Anthropic 저장소의 버그 보고를 올린 한 작성자는 38개 기록 중 26개가 손상되어 수개월의 작업이 영향을 받았다고 밝혔습니다. 믿을 수 있는 보호 방법은 손실이 발생하기 전에 마련해 둔 방법뿐입니다. 아직 저장할 것이 남아 있을 때 cleanupPeriodDays와 자동 아카이빙을 설정하세요.

cleanupPeriodDays에는 어떤 값을 선택해야 하나요?

핵심 요점

대부분의 사람에게는 3650(10년으로, 사실상 삭제를 비활성화함)과 외부 자동 아카이브를 함께 사용하는 것이 좋습니다. 기록이 필요 없고 디스크에 비밀 정보를 보관하지 않는 것이 더 중요할 때만 기본값 30을 유지하세요. 365는 1년에 한 번 정리하는 합리적인 중간 선택입니다. 기록을 아예 쓰지 않는 방법도 있습니다. 환경 변수 CLAUDE_CODE_SKIP_PROMPT_HISTORY 또는 --no-session-persistence 플래그를 사용하면 되지만, 이는 정반대의 목적에 해당합니다.

설정은 하나지만 사용 목적은 여러 가지일 수 있습니다. 옵션을 비교하고 사용 사례에 맞는 값을 선택하세요.

값동작적합한 사용자
30 (기본값)시작할 때 30일이 지난 세션을 삭제기록이 필요 없고, 민감한 데이터를 디스크에 저장하지 않는 것이 더 중요함
3651년치 기록을 보관한 뒤 1년에 한 번 정리최근 기록은 필요하지만 영구 아카이브까지는 필요하지 않음
3650사실상 삭제를 비활성화모든 기록과 외부 아카이브를 보관하고 싶음(권장)
CLAUDE_CODE_SKIP_PROMPT_HISTORY기록을 디스크에 전혀 쓰지 않음개인정보 보호가 최우선이며 기록이 전혀 필요하지 않음

중요한 보안상 주의 사항이 있습니다. 3650으로 설정하고 모든 기록을 보관하면 키와 코드가 들어 있을 수 있는 대화 기록을 디스크에 저장하는 데 동의하는 셈입니다. 이는 아카이브의 편리함과 위험 사이의 의도적인 절충입니다. 위험을 줄이려면 암호화된 디스크(macOS의 FileVault)에 아카이브를 보관하고, 공개 클라우드에 넣지 말고, 공개 git 저장소에 커밋하지 마세요. Claude Code를 통해 유출될 수 있는 데이터에 대해서는 별도의 가이드를 작성했습니다. “Claude Code의 데이터 보안”을 참조하세요.

오늘 할 일: 체크리스트

핵심 요점

cleanupPeriodDays: 3650으로 보존 기간을 늘리고 ~/.claude/projects/ 밖에 세션을 복사해 버전 관리하면 기록 손실을 줄입니다. 성공적으로 복사한 파일만 Claude Code 정리에서 보호됩니다. 매일 복사가 성공해도 최근 변경이 최대 하루 남을 수 있고 실패나 누락은 간격을 늘립니다. 같은 디스크의 사본은 디스크 고장 보호가 아닙니다.

단계별로 보호 기능을 설정하세요.

  1. ~/.claude/settings.json에서 cleanupPeriodDays: 3650으로 설정해 삭제를 막습니다.
  2. 관리 대상 폴더 밖에 ~/claude-history-archive를 만들고 첫 rsync -a를 실행합니다.
  3. launchd(macOS) 또는 cron(Linux)을 사용해 매일 실행되도록 예약합니다.
  4. 아카이브에서 git을 초기화하고 같은 실행 작업에 git add -A && git commit을 추가합니다.
  5. 아카이브가 암호화된 디스크에 있으며 공개 클라우드와 동기화되지 않는지 확인합니다.
  6. 예약 실행마다 복사 성공을 확인하고 최근 세션을 살펴보세요. 정기적으로 별도 임시 폴더에 샘플을 복원해 읽을 수 있는지 검증하세요.
  7. 기기·디스크 손실도 대비하려면 적절히 접근을 통제한 독립 저장 백업을 유지하고 복원도 시험하세요. 같은 디스크의 Git 기록은 독립 백업이 아닙니다.

세션 기록은 Claude를 신뢰할 수 있게 해 주는 맥락의 한 층일 뿐입니다.

Ailoot에 대해 알아보세요.

자세히 보기

Claude Code는 30일이 지나면 기록을 삭제합니다: 저장하는 방법: 자주 묻는 질문

매일 보관하면 세션 손실이 전혀 없나요?

아닙니다. 성공한 복사본만 관리 폴더의 정리에서 보호됩니다. 매일 성공해도 최근 하루 변경이 빠질 수 있고 실패하면 간격이 늘어납니다. 같은 디스크의 사본은 원본과 함께 고장 날 수 있습니다.

아카이브가 실제로 사용 가능한지 어떻게 확인하나요?

예약 복사 성공과 최근 세션을 확인하고 별도 임시 폴더에 샘플을 정기 복원하세요. 기기나 디스크 손실을 대비하려면 원본과 독립 저장된 백업 복원도 시험하세요.

모든 글