![]()
AI 에이전트에게 일을 시키다 보면 터미널에 비밀번호를 칠 일이 생깁니다.
저는 그게 그 자리에서 쓰이고 사라진다고 생각했습니다.
그런데 지난 대화 기록을 서버로 옮기려고 훑어보니, 비밀번호와 키가 144개나 기록 안에 그대로 남아 있었습니다.
이번 포스팅에서는 그 144개가 어떻게 발견됐는지, 어떤 규칙으로 가렸는지, 그리고 가리고 나서도 남은 문제까지 순서대로 풀어 보도록 하겠습니다.
대화 기록은 로컬 파일로 다 남습니다

Claude Code 는 세션 대화를 PC 의 파일(JSONL)로 남깁니다.
제가 친 말, 에이전트의 답, 도구 호출과 그 결과까지 한 줄씩 쌓입니다.
2026-09-18 에 지난 세션 35건을 기억 서버로 옮겼습니다. 2026-08-02 부터 09-18 까지, 대화 12,425턴입니다.
원본 파일은 801MB 였고, 도구 호출과 결과, 붙여 넣은 이미지, 시스템 안내문을 버리고 사람이 읽을 대화만 남기니 5.8MB 가 됐습니다.
그 5.8MB 를 서버에 올리기 전에 비밀값을 가리는 단계를 넣었고, 거기서 144건이 걸렸습니다.
어디서 들어갔나, 터미널에 친 그대로입니다
걸린 것은 제가 터미널에 친 비밀번호였습니다.
DB 비밀번호를 환경변수로 넣는 명령을 대화창에서 그대로 실행했고, 접속 문자열에 비밀번호를 붙여 쓴 줄도 있었습니다.
VPN 서버를 붙이던 시기라 설정 파일의 개인 키 줄도 같은 위험이 있어서, 검사 대상에 함께 넣었습니다.
그 순간에는 일이 되는 게 중요했고, 그 줄이 어딘가에 남는다는 생각은 하지 못했습니다.
제가 가장 쓰게 느낀 대목입니다. 비밀번호를 코드에 박지 않으려고 환경변수로 뺐는데, 정작 그 환경변수를 넣는 명령이 대화 기록에 그대로 있었습니다.
⚠️ AI 에이전트 대화창은 메모장이 아니라 기록장입니다. 거기에 친 비밀번호는 그 PC 의 파일에 남습니다.
가린 규칙은 일곱 가지입니다

실제 코드를 읽기 쉽게 줄여 옮긴 것입니다.
SECRETS = [
(r'([A-Z_]*(PASSWORD|PWD|PW|SECRET|TOKEN|API_KEY)[A-Z_]*)\s*=\s*\S{3,}', r'\1=***'),
(r'(password\s*=\s*)\S{3,}', r'\1***'), # 접속 문자열
(r'(Authorization:\s*Bearer\s+)\S+', r'\1***'),
(r'sk-[A-Za-z0-9_\-]{12,}', '***'), # API 키
(r'gh[pousr]_[A-Za-z0-9]{20,}', '***'), # GitHub 토큰
(r'(PrivateKey\s*=\s*)\S+', r'\1***'), # WireGuard
(r'(PresharedKey\s*=\s*)\S+', r'\1***'),
]
원칙은 하나입니다. 값만 지우고 이름은 남깁니다.
DB_PW=*** 처럼 남겨 두면, 나중에 "무엇을 바꿔야 하는지"는 알 수 있습니다. 이름까지 지우면 무엇이 새었는지도 모르게 됩니다.
세션마다 몇 개를 가렸는지도 숫자로 따로 남깁니다. 0 이 아닌 세션을 골라 보면 어느 날 무엇을 쳤는지 되짚을 수 있습니다.
가리고 나서도 남은 것
서버에 올라간 사본은 가렸습니다. 그런데 원본 파일에는 그대로 있습니다.
원본을 지우면 나중에 기록을 다시 만들 수 없고, 두면 비밀값이 PC 에 남습니다. 이 둘 사이에서 아직 정리 방법을 정하지 못했습니다.
그리고 일곱 가지 규칙이 모든 것을 잡는다는 보장도 없습니다. 이름에 PW 가 안 들어간 변수에 비밀번호를 넣었다면 그대로 통과합니다.
그래서 가리기는 안전장치의 마지막 칸이고, 첫 칸은 애초에 대화창에 치지 않는 것입니다.
바이브코딩 전에 해 둘 보안 점검
1. 비밀번호는 대화창에 붙이지 않습니다. 사람이 미리 환경변수나 설정 파일에 넣어 두고, 에이전트에게는 변수 이름만 알려 줍니다.
2. 설정 파일에 비밀번호 칸이 있다면 기본값을 비워 둡니다. 빈 값이면 실행이 멈추게 해서 사람이 채우게 합니다.
3. 대화 기록을 어딘가로 옮기거나 공유한다면, 그 전에 가리는 단계를 둡니다.
4. 가릴 때는 값만 지우고 이름은 남깁니다. 무엇을 바꿔야 하는지 알기 위해서입니다.
5. 가린 개수를 기록합니다. 0 이 아닌 날이 곧 비밀번호를 바꿔야 하는 날입니다.
6. 원본 대화 파일이 어디에 얼마나 쌓였는지 한 번 확인합니다.
에이전트가 일을 대신 해 줄수록, 제가 대화창에 친 것들이 어디에 남는지 따져 볼 일이 늘어납니다.
혹시 오늘 에이전트에게 비밀번호를 한 번이라도 직접 쳐 주셨다면, 그 줄이 지금 어느 파일에 있는지 한번 찾아보시는 건 어떨까요?
그러면 오늘도 모두 스테이블 하세요.
만든 것들
'Coding, Testing, Challenge' 카테고리의 다른 글
| AI 기억 서버 백업, DB가 정본이고 git이 백업인데 복원 리허설까지 한 이유 (0) | 2026.10.08 |
|---|---|
| Claude Code 기억 서버를 VPS 월 12달러로 만든 구조, 서버에 둔 것과 PC에 남긴 것 (0) | 2026.10.08 |
| Claude Code 메모리 파일이 24KB를 넘으면 생기는 일과 해결법 (0) | 2026.10.07 |
| 고치지도 않았는데 버그가 사라졌습니다 (0) | 2026.10.06 |
| 롤백 가드를 만들었는데 DDL 에서는 무의미했습니다 (0) | 2026.10.06 |