git clone https://사용자명:토큰@호스트/리포지토리.git
처럼 URL에 토큰을 포함하여 클론(clone)할 경우, 해당 토큰은 (2026-11-11, git 2.47.3, 더미 값・로컬 HTTP 서버에서 실기 확인) .git/config
의 url =
줄에 평문으로 저장되었습니다 -
git remote -v
을 실행하면 해당 토큰이 그대로 표시되었습니다. AI 에이전트가 리포지토리 상태를 조사할 때 자주 사용하는 명령어입니다 (자주 사용한다는 것은 추측이며, 횟수는 계산하지 않았습니다). -
프로젝트를 tar로 압축(archive)하면 .git/config 파일에 토큰도 포함되었습니다. -
GIT_TRACE=1을 붙여 git fetch를 실행하자, 트레이스 출력에 토큰이 포함된 URL이 그대로 나타났습니다. -
반면, 연결 실패 시 발생하는 fatal: unable to access ... 오류 메시지에서는 토큰 부분이 사라져 있었습니다. -
git -c transfer.credentialsInUrl=warn로 경고(warning)를 받거나, =die로 중단(stop)시킬 수 있습니다. 메시지 내의 토큰은 <redacted>로 대체되었습니다. -
git remote set-url origin https://호스트/리포지토리.git으로 URL을 수정하자, .git 내부에서 토큰 문자열이 사라졌습니다 ( grep -r로 확인).
본 기사는 'AI 에이전트와 비밀 정보' 검증 시리즈입니다. 새로운 검증 내용은 X (@supportapp3_lab)에서도 공지하고 있습니다.
리포지토리 폴더에서 다음을 실행합니다. 아무것도 출력되지 않으면, remote.*.url에는 사용자명:비밀번호@ 형태의 URL이 없습니다.
git config --get-regexp '^remote\..*\.url$' | grep -E '://[^/@]+@'
출력에는 토큰이 그대로 표시됩니다. 화면 공유 중이나 AI와의 채팅에 붙여넣기 전에 주의해야 합니다.
CI의 예시나 절차서에서는 https://x-access-token:<토큰>@github.com/...처럼 URL에 토큰을 작성하는 방법이 소개되기도 합니다. 직접 사용해 본다면, 토큰은 .git/config에 남게 됩니다.
AI 에이전트는 작업 중에 git remote -v나 cat .git/config를 실행하거나, .git을 포함하는 폴더를 읽는 경우가 있습니다. 이때 토큰이 대화 기록이나 로그에 남을 수 있다고 생각됩니다 (추측). 본 기사에서는 AI 툴 자체를 구동하지 않았습니다.
더미 토큰 ghp_DUMMY000…을 사용하여, 로컬에 구축한 HTTP 서버 (python3 -m http.server로 bare 리포지토리를 배포)로부터 클론했습니다.
git clone http://x-access-token:[email protected]:18731/repo.git c1
grep -n url c1/.git/config
클론 시 경고는 발생하지 않았습니다 (기본 설정).
| 작업 | 토큰 노출 여부 |
|---|
git remote -v | 출현함 (fetch 및 push 두 줄 모두) |
cat .git/config | 출현함 |
tar czf로 압축한 내부의 .git/config | 포함되어 있었다 |
GIT_TRACE=1 git fetch | 출현함 (run_command: ... git remote-https origin https://x-access-token:ghp_...@...) |
연결 실패 시 fatal: unable to access | |
GIT_CURL_VERBOSE=1 git fetch (연결 실패 시) | 노출되지 않았다 |
GIT_CURL_VERBOSE는 연결에 실패하는 경우만을 확인하기 위한 것입니다. 연결이 되어 서버가 인증을 요구하는 경우에는 출현 여부를 테스트하지 않았습니다.
git -c transfer.credentialsInUrl=warn fetch origin
warning: URL 'https://x-access-token:<redacted>@127.0.0.1:9/demo/repo.git' uses plaintext credentials
git -c transfer.credentialsInUrl=die fetch origin
fatal: URL 'https://x-access-token:<redacted>@127.0.0.1:9/demo/repo.git' uses plaintext credentials
die 옵션에서는 종료 코드 128로 중단되며, unable to access 연결 오류보다 더 이전에 멈춥니다.
Git 공식 문서(git-config의 transfer.credentialsInUrl)에는 다음 내용이 적혀 있습니다.
- 기본값은
allow이며, 경고 없이 진행됩니다. - 대상은 remote.<name>.url이고, remote.<name>.pushurl에 작성된 인증 정보는 감지하지 못합니다. - Git 프로그램 간의 통신은 명령줄 인수로 URL을 전달하기 때문에 다른 사용자에게 프로세스 목록에서 노출될 수 있습니다.
pushurl의 동작 방식은 직접 확인한 바 없습니다(공식 문서상의 내용만 참고). 프로세스 목록에서 인수가 보이는 건에 대해서는, API 키를 명령줄 인수에 작성하면 다른 사용자의 ps 명령어에서도 그대로 보인다는 것을 별도로 확인했습니다.
git remote set-url origin https://github.com/OWNER/REPO.git
직접 테스트한 결과, 이후 grep -rl ghp_DUMMY .git 명령으로는 아무것도 발견되지 않았습니다. 만약 pushurl을 설정했다면, git config --get-regexp '^remote .'로 확인하여 해당 부분도 수정해야 합니다.
- 토큰은 URL이 아닌, 자격 증명 도우미(git-credential)를 통해 전달합니다. GitHub의 경우
gh auth login 이후 gh auth setup-git 등의 방법이 있습니다. - 평소에도 인지할 수 있도록 경고를 발생시키는 설정으로 유지합니다.
git config --global transfer.credentialsInUrl warn
- 한 번 URL에 작성된 토큰은 어딘가에 남아있을 가능성이 있으므로, 발급처에서 재발급(폐기)하는 것도 고려해야 합니다.
- 프로젝트를 zip이나 tar로 압축하여 AI에게 전달할 때는
.git 폴더를 포함하지 않도록 합니다 (tar나 zip으로 묶으면 .env 파일과 .git의 히스토리 모두 포함될 수 있습니다).
ai-secret-check scan은 AI가 읽을 수 있는 위치에 있는 .env 계열의 파일 이름을 찾습니다(내용물은 표시하지 않습니다). .git/config 내부의 URL까지는 볼 수 없으므로, 위에서 언급한 git config 확인과 함께 사용해 주십시오.
npx github:supportapp3-lab/ai-secret-check scan
리포지토리: https://github.com/supportapp3-lab/ai-secret-check (Node.js 20 이상, MIT)
※ 2026년 11월 11일에 Debian 13, git 2.47.3, 더미 값 및 로컬 HTTP 서버를 사용하여 확인했습니다.
업데이트 정보나 간단한 팁은 X(@supportapp3_lab)에서 발신하고 있습니다.