기술

Claude Code가 내 이메일을 웹사이트에? 원인, 지금 막히는 것과 안 막히는 것, 내 기록 검사법

해커뉴스 1,570점을 받은 Claude Code 이슈 #107757. 계정 이메일이 curl User-Agent로 나간 이유, 2.1.317 개인정보 모드가 막는 범위, 내 ~/.claude 기록에서 직접 찾는 스크립트를 정리했습니다.

2026년 11월 5일 올라온 Claude Code 이슈 #107757은 Claude Code가 사용자의 계정 이메일을 웹사이트에 보냈다는 신고입니다. 해커뉴스에서 1,570점, 댓글 500개를 넘겼습니다.

왜 이메일이 나갔나

Claude Code 팀원이 해커뉴스에 설명했습니다.

  • Claude가 @author 같은 곳에 이름을 지어낸다는 신고가 있어, 로그인한 사용자의 계정 이메일을 모델 컨텍스트에 넣었습니다.
  • Claude가 curl 같은 명령을 직접 쓸 때, 그 이메일을 User-Agent의 연락처로 넣는 일이 생겼습니다.
  • 위키백과처럼 자동 접속에 연락처를 적어 달라는 사이트가 있어서, 컨텍스트에 있던 이메일을 썼습니다.

팀원은 사과하며 다음 릴리스(다음 주 초 예정)에서 컨텍스트의 계정 이메일을 빼겠다고 밝혔습니다.

지금 막히는 것과 안 막히는 것

2.1.317부터 내장 모드 cc-plugin-privacy가 기본으로 켜집니다. 소스와 설명에 따르면 범위는 이렇습니다.

막음못 막음
Bash·PowerShell·Monitor 호출 중 계정 이메일과 User-Agent(User-Agent, curl -A, wget -U 등)가 함께 든 것User-Agent 없이 URL·본문·curl -u·From: 헤더로 보내는 것
WebFetch·WebSearch·MCP 도구
변수, $(git config user.email) 같은 실행 중 계산 값, 스크립트 파일 안의 값

설명서 스스로 “경계가 아니라 예의”라고 적었습니다. 업데이트해도 모든 경우가 막히지는 않습니다.

내 기록 검사하기

Claude Code는 대화 기록을 ~/.claude/projects/ 아래 JSONL 파일로 남깁니다. 아래 스크립트는 그 안의 도구 호출 중 계정 이메일과 User-Agent가 함께 든 것을 세고, 이메일은 <EMAIL>로 가려 보여 줍니다. 파일을 읽기만 하고 아무것도 보내지 않습니다.

# ua_scan.py  (실행: python3 ua_scan.py)
import json, os, re, glob
email = json.load(open(os.path.expanduser('~/.claude.json'))).get('oauthAccount', {}).get('emailAddress', '')
UA = re.compile(r'user[-_]?agent|curl[^\n]*\s-A\s|wget[^\n]*\s-U\s', re.I)
files = glob.glob(os.path.expanduser('~/.claude/projects/**/*.jsonl'), recursive=True)
hits = calls = 0
for f in files:
    for raw in open(f, 'rb'):
        if b'tool_use' not in raw:
            continue
        try:
            content = (json.loads(raw).get('message') or {}).get('content') or []
        except Exception:
            continue
        for c in content if isinstance(content, list) else []:
            if not isinstance(c, dict) or c.get('type') != 'tool_use':
                continue
            text = json.dumps(c.get('input'), ensure_ascii=False)
            calls += 1
            if email and email.lower() in text.lower() and UA.search(text):
                hits += 1
                i = text.lower().find(email.lower())
                print('HIT', text[max(0, i - 120):i].replace('\n', ' '), '<EMAIL>')
print(f'transcripts {len(files)}  tool_calls {calls:,}  ua_with_email {hits}')

제 맥에서 돌려 보니 기록 479개, 도구 호출 12만 2,581번 가운데 2번이 나왔습니다. 한 번은 서브에이전트가 crates.io API에 보낸 curl -A "…(<EMAIL>)", 한 번은 스크립트 안의 User-Agent 문자열이었습니다.

오늘 할 일

  1. claude --version으로 2.1.317 이상인지 확인하고, 아니면 업데이트합니다.
  2. 위 스크립트로 내 기록을 검사합니다.
  3. 컨텍스트에서 이메일이 빠지기 전까지 CLAUDE.md에 한 줄을 둡니다. 예: “내 이메일을 User-Agent나 요청 헤더에 넣지 말고, 사이트가 연락처를 요구하면 먼저 물어볼 것.”

쇼츠로 보기

이 글은 비치콤버스 쇼츠 No.81의 짝 글입니다. 짧은 주소 beachcombers.co.kr/s/81.

김현빈 Developer & Writer

기술, 포스팅 관련 질문, 프로젝트 협업 등 연락주시면 언제든지 회신 드립니다.

esc

↑↓ 고르기↵ 열기? 단축키

해변에서 주운 것

읽으러 가기 →
guest@beachcombers — zsh

단축키

⌘K 또는 /
글·작업·개발일지 찾기
R
해변 산책 — 아무 글 하나 줍기
`
터미널 열기
←→
쪽 넘기기 (휠·스와이프도 됩니다)
?
이 안내
esc
닫기