5 min read
AI assisted

Claude Code 멀티 계정 셋업 — 한 Mac에서 4계정 분리 운영

CLAUDE_CONFIG_DIR 환경변수와 쉘 함수 한두 개로 회사·개인·실험·고객 Claude Code 계정을 같은 머신에서 독립 운영하는 셋업

Series — Multi-Account Claude Code Operations
  1. 1. Claude Code 멀티 계정 셋업 — 한 Mac에서 4계정 분리 운영
  2. 2. Claude Code 세션 공유 — .jsonl 심볼릭 링크
  3. 3. Claude Code 설정 동기화와 트러블슈팅

Claude Code에는 rate limit이 있다. 일정량을 넘으면 대기가 걸린다. 해결책은 계정을 더 만드는 것이다. 거기에 회사 프로젝트는 회사 계정, 개인 프로젝트는 개인 계정으로 분리하고 싶은 니즈까지 더해지면, 결국 한 Mac에서 여러 Claude Code 계정을 동시에 운영하는 상황이 된다.

문제는 Claude Code가 기본적으로 ~/.claude 하나만 바라본다는 것이다. 계정을 바꿀 때마다 설정 디렉토리를 통째로 교체하거나, 터미널마다 다른 계정으로 로그인하거나, 매번 API 키를 수동으로 바꾸거나 — 어느 방법도 깔끔하지 않다.

CLAUDE_CONFIG_DIR 환경변수를 사용하면 같은 머신에서 여러 Claude Code 인스턴스를 독립된 설정으로 운영할 수 있습니다. 회사·개인·실험·고객 계정을 한 Mac에서 분리해서 굴리는 셋업입니다.


CLAUDE_CONFIG_DIR이 하는 일

Claude Code는 기동 시 CLAUDE_CONFIG_DIR 환경변수를 읽어 설정·히스토리·세션 데이터를 저장할 루트 디렉토리를 결정합니다. 이 변수를 지정하지 않으면 기본값인 ~/.claude를 사용합니다.

변수 하나로 분리되는 항목은 다음과 같습니다.

항목 설명
settings.json 모델·옵션·환경변수 설정
CLAUDE.md 프로젝트 전역 지시문
commands/, hooks/ 커스텀 명령 및 훅
history.jsonl 대화 히스토리
projects/ 세션 데이터 (.jsonl)

반면 분리되지 않는 항목도 있습니다. 전역 zsh 별칭(~/.zshrc), 시스템 PATH, ~/.ssh 같은 OS 레벨 설정은 인스턴스마다 별도로 존재하지 않습니다. Claude Code의 바이너리 자체도 하나이며, 계정별로 별도 설치가 필요하지 않습니다.


디렉토리 생성과 명명 규칙

기본 인스턴스(~/.claude)는 그대로 두고, 추가 인스턴스용 디렉토리를 -N 인덱스로 생성합니다.

mkdir ~/.claude-2   # 두 번째 인스턴스
mkdir ~/.claude-3   # 세 번째 인스턴스
mkdir ~/.claude-4   # 네 번째 인스턴스

-1은 기본 ~/.claude에 대응하는 플래그로 예약합니다. 이 명명 규칙을 지키면 뒤에서 정의하는 쉘 함수의 플래그(-1, -2, -3, -4)와 디렉토리 인덱스가 1:1로 대응됩니다.


쉘 함수 정의

~/.oh-my-zsh/custom/aliases.zsh(또는 ~/.zshrc)의 claude() 함수에 인스턴스 선택 플래그를 추가합니다. -1-2 플래그를 파싱해 CLAUDE_CONFIG_DIR을 결정한 뒤 command claude를 호출하는 구조입니다.

claude() {
  local args=()
  local config_dir=""
  # ... 기존 플래그 처리 ...
  for arg in "$@"; do
    if [[ "$arg" =~ ^-[ycg12]+$ ]]; then
      local flags="${arg#-}"
      for (( i=0; i<${#flags}; i++ )); do
        case "${flags:$i:1}" in
          1) config_dir="$HOME/.claude"   ;;
          2) config_dir="$HOME/.claude-2" ;;
          # ... 기타 플래그 ...
        esac
      done
    else
      args+=("$arg")
    fi
  done
  if [[ -n "$config_dir" ]]; then
    CLAUDE_CONFIG_DIR="$config_dir" command claude "${args[@]}"
  else
    command claude "${args[@]}"
  fi
}

정의 후 사용 방법은 다음과 같습니다.

# 기본 계정 (플래그 없으면 ~/.claude)
claude

# 명시적으로 기본 계정
claude -1

# 두 번째 계정
claude -2

# 플래그 조합
claude -2y          # 두 번째 계정 + yolo
claude -2cy         # 두 번째 계정 + continue + yolo
claude -2cyg        # 두 번째 계정 + continue + yolo + 다른 플래그

CLAUDE_CONFIG_DIR은 해당 셸 세션 내에서만 유효합니다. 별도 터미널 탭마다 독립적으로 인스턴스를 지정할 수 있기 때문에, 회사 계정과 개인 계정을 탭 단위로 분리해서 동시에 운영하는 것이 가능합니다.


기존 설정 마이그레이션

이미 ~/.claude를 사용 중이라면 기본 인스턴스는 그대로 유지하고, 추가 인스턴스에만 필요한 파일을 복사합니다.

# 설정 파일 복사
cp ~/.claude/settings.json   ~/.claude-2/
cp ~/.claude/CLAUDE.md       ~/.claude-2/
cp -r ~/.claude/commands     ~/.claude-2/
cp -r ~/.claude/hooks        ~/.claude-2/

# 플러그인은 심볼릭 링크 (동기화 유지 + 용량 절약)
ln -sf ~/.claude/plugins ~/.claude-2/plugins

settings.jsonCLAUDE.md는 복사본으로 관리하므로 인스턴스마다 다른 모델이나 옵션을 설정할 수 있습니다. plugins는 심볼릭 링크로 연결해 두면 한쪽에서 설치하거나 업데이트한 플러그인이 양쪽 모두에 반영됩니다.

마이그레이션 후 디렉토리 구조는 다음과 같습니다.

~/.claude/          ← 기본 인스턴스 (-1)
├── settings.json
├── CLAUDE.md
├── commands/
├── hooks/
├── plugins/        ← 원본
└── history.jsonl

~/.claude-2/        ← 두 번째 인스턴스 (-2)
├── settings.json   ← 복사본 (독립 수정 가능)
├── CLAUDE.md       ← 복사본
├── commands/       ← 복사본
├── hooks/          ← 복사본
├── plugins → ~/.claude/plugins  ← 심볼릭 링크
└── history.jsonl   ← 독립 히스토리

파일 소유권은 복사 시 자동으로 현재 사용자로 설정되므로 별도 chown 작업은 필요하지 않습니다. 단, 루트 권한으로 복사한 경우에는 소유권을 확인해야 합니다.


인스턴스별 분리되는 것들

CLAUDE_CONFIG_DIR로 분리되는 항목과 공유되는 항목을 정리하면 다음과 같습니다.

인스턴스별 독립 관리

  • settings.json — 모델 지정, env 블록의 API 키, 각종 옵션
  • CLAUDE.md — 전역 시스템 프롬프트
  • commands/, hooks/ — 커스텀 명령과 훅
  • history.jsonl — 대화 히스토리 (각 디렉토리에 격리)
  • projects/ — 세션 데이터. 기본적으로 인스턴스별 독립 저장됨

공유 상태 유지 (심볼릭 링크 방식)

  • plugins/ — 위 마이그레이션 예시처럼 심볼릭 링크로 공유 가능
  • projects/ — 세션 공유가 필요하면 ~/.claude-shared/projects로 공유 가능 (Ep2에서 다룸)

분리 불가 (OS 레벨 공유)

  • ~/.zshrc, ~/.zshenv 등 전역 쉘 설정
  • 시스템 PATH
  • ~/.ssh, ~/.gnupg 등 자격증명 저장소
  • Claude Code 바이너리 (/usr/local/bin/claude 등)

운영상 주의

API 키 충돌

settings.jsonenv 블록에 API 키를 넣지 않고 셸 환경변수(ANTHROPIC_API_KEY)로 관리하면, 터미널 세션마다 다른 계정의 키가 노출될 위험이 있습니다. 계정별 키는 각 인스턴스의 settings.json env 블록에 명시하거나, 계정별 .env 파일을 분리해서 source 하는 방법을 권장합니다.

쉘 별칭 충돌

위 함수를 정의하기 전에 alias claude=... 형태의 별칭이 이미 있는지 확인합니다. 함수와 별칭이 동시에 존재하면 zsh는 별칭을 우선합니다. 기존 별칭은 unalias claude로 제거한 뒤 함수로 대체합니다.

플래그 없이 실행 시 기본 동작

플래그를 지정하지 않으면 ~/.claude가 사용됩니다. 의도치 않게 기본 인스턴스로 접속하는 실수를 방지하려면 주로 사용하는 계정에 해당하는 플래그(-2 등)를 쉘 프롬프트나 터미널 탭 제목에 표시하는 방법이 유용합니다.

세 번째, 네 번째 계정 추가

~/.claude-3, ~/.claude-4 디렉토리를 생성하고 함수의 case 블록에 3) config_dir="$HOME/.claude-3" ;; 항목을 추가하면 됩니다. 구조가 동일하므로 확장 비용이 낮습니다.


마무리

CLAUDE_CONFIG_DIR 하나와 쉘 함수 수십 줄로 한 Mac에서 여러 Claude Code 인스턴스를 완전히 분리해서 운영할 수 있습니다. 컨텍스트를 격리해야 하는 상황에서 설정 비용 대비 효과가 큰 방법입니다.

다음 글(Ep2)에서는 계정 간 세션 공유를 symlink 구조로 구현하는 방법을, Ep3에서는 sync-claude.sh를 이용한 설정 동기화를 다룹니다.