본문 바로가기

Coding, Testing, Challenge

AI 대화 기록에 비밀번호·키 144개가 남아 있었다, 바이브코딩 전에 할 보안 점검

 

AI 대화 기록에 남아 있던 비밀값 144개

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. 원본 대화 파일이 어디에 얼마나 쌓였는지 한 번 확인합니다.

에이전트가 일을 대신 해 줄수록, 제가 대화창에 친 것들이 어디에 남는지 따져 볼 일이 늘어납니다.

혹시 오늘 에이전트에게 비밀번호를 한 번이라도 직접 쳐 주셨다면, 그 줄이 지금 어느 파일에 있는지 한번 찾아보시는 건 어떨까요?

그러면 오늘도 모두 스테이블 하세요.


만든 것들