본문으로 건너뛰기

© 2026 Molayo

Qiita헤드라인2026. 06. 23. 15:41

Claude Code의 커밋이 공개 리포지토리에 '개인 세션 URL'을 유출한 사례와 방지 방법

요약

Claude Code 사용 시 개인 세션 URL이 커밋 메시지에 포함되어 공개 리포지토리에 유출될 수 있는 보안 이슈를 다룹니다. 유출 여부를 확인하는 명령어와 이를 방지하기 위한 git hook 활용법, 이미 유출된 경우의 히스토리 재작성 방법을 안내합니다.

핵심 포인트

  • Claude Code가 커밋 메시지에 개인 세션 URL을 포함할 위험이 있음
  • git log 명령어를 통해 리포지토리 내 세션 URL 유출 여부 확인 가능
  • PreToolUse hook을 사용하여 커밋 전 유출을 감지하고 차단 가능
  • 이미 유출된 경우 git filter-repo를 이용한 히스토리 재작성 필요

당신이 Claude Code에 맡긴 커밋은, 어쩌면 공개 리포지토리(repository)에 '당신의 개인 세션 URL'을 작성하고 있을지도 모릅니다.

GitHub의 issue #69669에서 한 사용자가 다음과 같이 보고했습니다. Claude Code (Opus 4.8)가 6개의 커밋 메시지 모두 끝부분에

Claude-Session: https://claude.ai/code/session_<id>

라는 줄을 붙여, 그 개인 세션의 식별자를 공개 GitHub 리포지토리에 노출시켜 버렸다는 것입니다. 보고자에 따르면, 이는 리포지토리 측 설정(CLAUDE.md・git hook・commit.template)에도, 사용자나 글로벌 설정에도 적혀 있지 않으며, 하네스(harness) 쪽의 지시만으로 발생했다고 합니다. 본인이 요청한 기억은 없다고 합니다.

이것은 전해 들은 이야기이므로, 저 자신의 환경에서 이 줄이 반드시 나올 것이라고 단정할 수는 없습니다. 실제로 제 손안의 Claude Code는 Co-Authored-By:

라는 줄은 붙이지만, Claude-Session:

의 URL은 현재까지 본 적이 없습니다. 나오는지 여부는 버전이나 설정에 따라 달라지는 것 같습니다. 다만, 나오는 환경이라면, 인증이 필요하더라도 원래 커밋 기록에 필요하지 않은 개인 식별자가 공개된 결과물에 계속 남아 있다는 점—이는 데이터 최소화(data minimization) 관점에서 마음 편한 일은 아닙니다. 보고자의 우려는 타당하다고 생각합니다.

본문에서는 (1) 자신의 리포지토리가 유출하고 있지 않은지 확인하는 방법, (2) 앞으로 유출하지 않도록 감지하고 중단하는 방법, (3) 이미 유출된 경우 대처 방법의 3가지를 순서대로 작성하겠습니다.

공개하고 있는 리포지토리에서 다음 한 줄을 실행해 보세요.

git log --all --grep='claude.ai/code/session' --grep='Claude-Session' -i --oneline

아무것도 나오지 않으면, 그 리포지토리는 (적어도 -m으로 작성된 커밋 범위에서는) 유출하고 있지 않습니다. 나온다면, 해당 커밋 메시지에 개인 세션 URL이 들어 있다는 의미입니다.

참고로, 동의 없이 붙어 있는 Co-Authored-By:

줄도 확인해 보는 것이 좋습니다.

git log --all --grep='Co-Authored-By: Claude' -i --oneline | wc -l

가장 확실한 것은, 커밋이 실행되기 전에 감지해서 멈추는 것입니다. Claude Code의 PreToolUse hook은 도구 호출(tool call) 전에 발동합니다. `git commit -m

# 관측용: 무엇이 들어오는지 기록만 함
jq -c '{tool_name, command: .tool_input.command}' >> /tmp/pretooluse.log; exit 0

참고로, 이 탐지가 작동하는 것은 git commit -m "<메시지>" 형태뿐입니다.

에디터를 여는 방식이나 -F <파일> 형태에서는 메시지가 커맨드 문자열에 포함되지 않으므로, hook(훅)에서는 보이지 않습니다. 따라서 이것을 "최후의 보루"가 아닌 "하나의 계층"으로 간주하여 적용하십시오. 핵심은 애초에 기본 지침(default instruction)이 이 URL을 포함하지 않도록 하는 것입니다.

이미 공개된 리포지토리(repository)에 push(푸시)를 완료했다면, 히스토리(history)를 재작성해야 합니다.

# 예: 메시지에서 해당 행을 제외 (히스토리를 재작성)
git filter-repo --message-callback '
return re.sub(rb"^.*Claude-Session:.*$\n?", b"", message, flags=re.M)
...

그 후에 force-push(강제 푸시)를 진행합니다. 단, 히스토리 재작성은 공동 작업자의 clone(클론)을 망가뜨리거나 PR(Pull Request) 참조를 어긋나게 할 수 있습니다. 영향 범위를 확인한 후 판단하십시오. 개인의 작은 리포지토리라면 가볍게 수행할 수 있지만, 인원이 많아질수록 신중해야 합니다.

  • Claude Code가 버전이나 설정에 따라 커밋 메시지에 Claude-Session:이라는 프라이빗(private) URL을 붙여 공개 리포지토리에 남기는 경우가 있음 (#69669 보고).
  • 우선 git log --grep으로 자신의 히스토리를 확인한다.
  • 앞으로는 PreToolUse hook을 통해 그러한 커밋을 차단한다 (단, -m 형태만 가능하며, 재작성은 불가능하고 되돌리기만 가능).
  • 이미 유출되었다면 git filter-repo로 제거한 뒤 force-push 한다 (공동 작업 시 신중히).

이 기사의 hook은 제가 무료로 공개하고 있는 cc-safe-setup (MIT)의 strip-coauthored-by.sh에 포함되어 있습니다. 원래 이 hook에는 Co-Authored-By 탐지용 정규 표현식이 깨져서 아무것도 탐지하지 못하던 버그가 있었는데 ( grep -E에서 |가 '문자 파이프'로 취급되어 본래의 '또는(OR)' 역할을 하지 못함), 이번에 그 부분도 수정했습니다. 커밋 트레일러(trailer) 주변에서 유사한 hook을 사용 중인 분들은 자신의 것이 정말로 탐지하고 있는지, 실제 커밋 1건으로 한 번 테스트해 보시는 것을 권장합니다.

저 자신이 약 800시간 동안 Claude Code를 "거의 무인" 상태로 구동하며 겪었던 사고와, 설정으로 미리 방지하는 절차는 사고 방지 서적(800엔·제3장까지 무료)에 정리해 두었습니다. 데이터나 코드의 소실, 토큰 비용의 폭주, 무단 과금 등, 막을 수 있었던 사고들을 중심으로 다루고 있습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0