여러 기기에서 AI와 같은 기억으로 일하기
AI 비서를 몇 달 쓰다 보면 “기억”이 쌓인다. 진행 중인 사업 현황, 내가 일하는 방식, 시행착오에서 얻은 교훈 같은 것들이다. 이게 쌓일수록 AI는 새 직원이 아니라 오래 함께한 동료가 된다.
그런데 이 기억은 기본적으로 그 컴퓨터 안에만 있다. 사무실 PC에서 쌓은 맥락을 집 노트북은 모르고, 서버에 접속한 AI는 우리 사업이 뭔지도 모른다. 기기를 바꾸면 처음부터 다시다.
이 문서는 기기 두 대가 같은 기억을 쓰게 만드는 전 과정이다. 2026-09-18 사무실 PC와 사교원 운영서버 사이에 실제로 적용하며 밟은 함정까지 그대로 담았다.
전체 그림
기억을 만드는 기기 ──올리기──▶ private 저장소 ──내려받기──▶ 받아 쓰는 기기
가운데에 git 저장소를 둔다. 별도 서비스가 필요 없고, 언제 무엇이 바뀌었는지 이력이 남아서 기억을 잘못 고쳤을 때 되돌릴 수 있다. 이게 단순 파일복사보다 나은 이유다.
필요한 것은 두 가지뿐이다.
| 것 | 왜 필요한가 |
|---|---|
| private 저장소 하나 | 기억에는 사업 메모·연락처가 섞여 있다. 반드시 비공개 |
| 올리기·내려받기 스크립트 | 손으로 복사하면 반드시 빠뜨린다 |
준비 — 내 기억이 어디 있는지 찾기
AI 도구마다 다르지만, 대개 홈 폴더 아래 설정 폴더에 들어 있다.
Claude Code라면 ~/.claude/projects/<작업폴더이름>/memory/ 다.
여기서 첫 번째 함정을 만난다.
⚠️ 폴더 이름은 “작업 경로”에서 자동으로 만들어진다.
C:\Users\Admin에서 일했다면 폴더 이름이C--Users-Admin이 된다. 경로의:와\가 전부-로 바뀐 것이다. 리눅스에서/root라면-root가 된다.그래서 사용자 이름이 다른 기기로 옮기면 폴더 이름이 달라져 기억이 안 잡힌다. 스크립트가 이걸 자동으로 변환해 주어야 한다.
변환 규칙은 한 줄이면 된다.
SLUG=$(printf '%s' "$경로" | sed 's,[:\/],-,g'): \ / 세 가지를 모두 - 로 바꾼다. 처음에 / 를 빠뜨려서 리눅스 서버에서
/root 가 그대로 남았고, 기억이 엉뚱한 곳에 깔렸다. 세 개 다 넣어야 한다.
1단계 — 무엇을 올리고 무엇을 올리지 않을지 정하기 (10분)
이게 이 작업에서 가장 중요한 결정이다. 기술이 아니라 판단의 문제다.
| 분류 | 예 | 이유 |
|---|---|---|
| ✅ 올린다 | 기억 파일, 직접 만든 도구, 화면 설정 | 어느 기기에서든 같아야 함 |
| 🔴 절대 안 올린다 | 로그인 자격증명 파일 | 새 기기에서 다시 로그인하면 된다 |
| ⚠️ 기기마다 달라야 함 | 감시 작업이 “어디까지 봤는지” 같은 진행 상태 | 공유하면 서로 덮어씀 |
| ⏭ 굳이 안 올림 | 지난 대화 기록, 캐시, 플러그인 | 수십~수백 MB이고 다시 만들어짐 |
🔴 자격증명 파일은
.gitignore에 넣어라. 실수로 커밋하면 git 이력에 영원히 남는다. 지워도 이력에서 되살릴 수 있기 때문에, 애초에 들어가지 않게 막는 편이 훨씬 싸다.
설정 파일에 토큰이 숨어 있을 수 있다
Claude Code는 “이 명령은 승인 없이 실행해도 된다”는 허용목록을 쌓아 둔다.
그런데 이 목록에 명령어가 통째로 저장되기 때문에, 예전에 실행한
curl ... -H 'apikey: xxxx' 같은 명령이 토큰째로 들어 있을 수 있다.
실제로 확인해 보니 354개 중 9개에 키나 토큰이 박혀 있었다. 그래서 올리기 전에 걸러내는 절차를 스크립트에 넣었다.
# 올리기 전, 자격증명이 들어간 항목을 제거한 사본을 만든다
python - <<'PY'
import json, re
d = json.load(open('settings.local.json', encoding='utf-8'))
pats = re.compile(r'apikey|Bearer|token|secret|[0-9a-f]{32}', re.I)
allow = d['permissions']['allow']
d['permissions']['allow'] = [a for a in allow if not pats.search(a)]
json.dump(d, open('올릴사본.json','w',encoding='utf-8'), ensure_ascii=False, indent=2)
PY2단계 — 저장소 만들고 올리기 (15분)
private 저장소를 하나 만들고, 위에서 정한 것만 모아서 커밋한다.
gh repo create <내계정>/claude-config --private올리기 스크립트의 뼈대는 이 정도다.
#!/usr/bin/env bash
set -euo pipefail
REPO="$HOME/claude-config"
SRC="$HOME/.claude"
cp "$SRC/settings.json" "$REPO/"
cp -r "$SRC/agents" "$REPO/"
for d in "$SRC"/projects/*/memory/; do
slug=$(basename "$(dirname "$d")")
mkdir -p "$REPO/memory/$slug"
cp "$d"*.md "$REPO/memory/$slug/"
done
cd "$REPO"
[ -z "$(git status --porcelain)" ] && { echo "변경 없음"; exit 0; }
git add -A
git commit -m "sync: $(hostname) $(date '+%Y-%m-%d %H:%M')"
git pull --rebase --autostash # 다른 기기가 먼저 올렸을 수 있다
git push⚠️
git pull --rebase를 커밋 뒤 푸시 앞에 넣어라. 없으면 다른 기기가 먼저 올렸을 때 그냥 실패한다. 자동 실행이라면 조용히 실패한다.
3단계 — 새 기기에서 받기 (10분)
새 기기에서는 AI 도구를 먼저 설치하고 로그인부터 끝내야 한다. 설정 폴더가 만들어진 뒤라야 기억을 넣을 자리가 생기기 때문이다.
내려받기 스크립트에는 안전장치 두 개를 넣는다.
# ① 설정 폴더가 없으면 멈춘다 — 순서를 강제
[ -d "$HOME/.claude" ] || { echo "먼저 로그인하세요"; exit 1; }
# ② 덮어쓰기 전에 백업
backup() {
[ -e "$1" ] || return 0
rel="${1#$HOME/.claude/}"
mkdir -p "$BAKDIR/$(dirname "$rel")"
cp -r "$1" "$BAKDIR/$rel"
}⚠️ 백업을 원본 옆에 만들면 안 된다. 처음에
스킬이름.bak-20260918식으로 옆에 두었더니, 그 백업 폴더가 또 하나의 스킬로 인식돼 같은 이름이 중복 등록됐다. 백업은.sync-backups/<시각>/처럼 도구가 훑지 않는 별도 폴더로 빼야 한다.
4단계 — 매일 자동으로 올리기 (20분)
손으로 하면 잊는다. 자동 실행을 걸되, 두 겹으로 거는 편이 안전하다.
| 방식 | 언제 도나 |
|---|---|
| AI 도구 자체의 예약 작업 | 그 앱이 켜져 있을 때만 |
| OS 작업 스케줄러 | 앱과 무관. 놓친 실행은 다음 부팅 때 보충 |
⚠️ 자동 실행이 “사람 없이 끝까지 가는지”를 반드시 확인하라. 처음 걸었을 때 작업이 시작 6초 만에 멈춰 7분을 서 있었다. 승인 프롬프트에서 기다리고 있었던 것이다. 밤 11시에는 눌러 줄 사람이 없다.
“한 번 실행해서 승인해 두면 된다”는 방식은 사람이 눌러야 하므로 무인 실행의 해법이 아니다. 그 명령을 허용목록에 좁게 명시해 두는 것이 확실하다.
5단계 — 운영 서버는 다르게 다룬다 (핵심)
여기서부터가 이 문서의 진짜 내용이다.
사업 홈페이지를 돌리는 운영 서버에 개인 작업환경을 그대로 옮기면 안 된다. 특히 앞서 말한 허용목록을 운영 서버에 심으면 안 된다.
왜인지 경로를 따라가 보자.
공개 웹서버가 침해됨
→ 공격자가 그 서버의 AI를 쓸 수 있음
→ 허용목록에 있는 명령은 승인 없이 실행됨
→ 파일 삭제·git push·외부 전송이 그대로 나감 (서버가 root면 더 심각)
그래서 서버용 모드를 따로 만들었다. 기억만 받고 설정·허용목록은 받지 않는다. 서버에서는 모든 명령이 승인 대기 상태가 되어 번거롭지만, 그게 맞다.
# 그 기기에서 한 번만. 이후 모든 동기화가 자동으로 이 모드로 돈다
printf 'memory-only\n' > ~/.claude-sync-mode⚠️ 모드 파일을 Windows PowerShell 의
echo x > 파일로 만들지 마라. UTF-16으로 저장돼서 셸 스크립트가 못 읽는다. 리눅스에서printf로 만들어야 한다.
그리고 실패는 조용히 하면 안 된다
이 모드 파일을 못 읽었을 때, 처음 만든 스크립트는 조용히 기본값으로 돌아갔다. 하필 기본값이 “전부 동기화”라서, 허용목록이 운영 서버에 심길 뻔했다.
🔴 안전한 쪽이 기본값이 아닐 수 있다. 설정을 해석하지 못하면 기본값으로 진행하지 말고 중단해야 한다.
case "$내용" in
*memory-only*) MODE="memory-only" ;;
*full*) MODE="full" ;;
*) echo "✖ 모드를 해석할 수 없습니다. 중단합니다."; exit 3 ;;
esac6단계 — 서버에서 만든 기억도 받고 싶다면
여기서 한 번 더 생각해야 한다.
🔴 기억 파일은 데이터가 아니라 지시문이다. AI는 매 세션 기억을 읽고 그에 따라 행동한다. 즉 기억을 고칠 수 있는 사람은 그 AI의 다음 행동을 고칠 수 있다.
서버에 기억 저장소 쓰기 권한을 주면 이런 경로가 열린다.
서버 침해 → 기억 파일에 지시문 삽입 → 내 PC가 내려받음
→ 내 PC의 AI가 그 지시를 읽음 → 내 PC의 허용목록으로 실행
그래서 저장소를 둘로 나눴다.
| 저장소 | 서버 권한 | 역할 |
|---|---|---|
| 본 기억 저장소 | 읽기 전용 | 서버는 못 고침 |
| 수신함 저장소 | 쓰기 | 서버는 여기에만 올림 |
서버가 만든 기억은 수신함으로만 올라가고, 사람이 내용을 읽고 고른 것만 본 기억에 합친다.
왜 폴더를 나누지 않고 저장소를 나눴나? 배포 키는 폴더 단위 권한을 줄 수 없기 때문이다. 같은 저장소에 쓰기를 주면 “이 폴더만 쓰세요”는 규율일 뿐 강제가 아니다. 저장소를 나누면 git 서비스가 접근 자체를 막아 준다.
확인·병합은 자동화하지 않는다
review-server-memory.sh # 신규·변경 목록
review-server-memory.sh diff <파일> # 무엇이 달라졌나
review-server-memory.sh merge <파일> # 고른 것만 합치기⚠️ 이 도구는 “다르다”만 알려주고 “어느 쪽이 최신인지”는 모른다. 서버 것이 더 오래됐는데 그냥 합치면 최신 기억이 되돌아간다. 반드시
diff를 먼저 볼 것.
이 한 단계를 자동화하는 순간 경계가 사라진다. 불편해도 사람이 봐야 한다.
함정 요약 (실제로 밟은 것들)
- 폴더 이름 변환에서
/누락 — 리눅스에서/root가 그대로 남아 기억이 엉뚱한 곳에 깔림 - 백업이 원본 옆에 — 백업 폴더가 도구로 중복 인식됨. 별도 폴더로 뺄 것
- 줄바꿈 차이를 내용 변경으로 오판 — Windows는 CRLF, 저장소는 LF.
47개 중 46개가 “변경됨”으로 나왔다. 비교는
diff --strip-trailing-cr로 - PowerShell
&&미지원 — 5.1에서는;를 쓴다.echo > 파일은 UTF-16으로 저장됨 schtasks는 Git Bash에서 실패 —/TN을 경로로 바꿔 버린다. PowerShell에서 실행할 것- 자동 실행이 승인 프롬프트에서 정지 — 무인 실행 여부를 반드시 실측할 것
- 모드 파일 해석 실패 시 조용한 폴백 — 안전한 쪽이 기본값이 아니면 중단해야 함
이 작업이 남기는 것
기억 공유의 핵심은 저장소를 만드는 기술이 아니라 경계를 어디에 긋느냐다.
- 어느 기기가 무엇을 고칠 수 있는가
- 어디까지 자동으로 하고, 어디부터 사람이 보는가
- 편의와 안전이 부딪힐 때 무엇을 택하는가
이 경계를 권한으로 강제해 두면, 나중에 바빠서 규율이 느슨해져도 구조가 버텨 준다. “조심해서 쓰자”는 약속보다 “애초에 못 하게 되어 있다”가 강하다.
연대지능 활동가에게 이 감각은 AI 도구에만 쓰이지 않는다. 공동 문서함, 회계 시스템, 회원 명부 — 여러 사람이 함께 쓰는 모든 것에 같은 질문이 적용된다. 누가 무엇을 바꿀 수 있는가.
작성: 데카 · 2026-09-19 · 사무실 PC와 사교원 운영서버 연동 실전 기록. 같은 세션의 상세 기술 기록은 비공개 핸드오버 문서에 있다.