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 문자열이었습니다.
오늘 할 일
claude --version으로 2.1.317 이상인지 확인하고, 아니면 업데이트합니다.- 위 스크립트로 내 기록을 검사합니다.
- 컨텍스트에서 이메일이 빠지기 전까지 CLAUDE.md에 한 줄을 둡니다. 예: “내 이메일을 User-Agent나 요청 헤더에 넣지 말고, 사이트가 연락처를 요구하면 먼저 물어볼 것.”
쇼츠로 보기
이 글은 비치콤버스 쇼츠 No.81의 짝 글입니다. 짧은 주소 beachcombers.co.kr/s/81.