자동화 slecs

깃이그노어 정비와 텔레그램 봇 토큰 하드코딩 제거로 자동화 레포 보안 강화

목차

보안 이슈가 될 수 있는 두 가지를 한 번에 묶어서 정리한 작업이었다.

배경 — 왜 이게 지금 나왔나

자동화 스크립트를 팀 레포에 점진적으로 넣다 보면 어느 순간 .gitignore가 현실을 못 따라가는 시점이 온다. 초기에는 Python 기본 템플릿 수준으로만 관리하다가 스크립트가 늘고, 로컬 환경 파일이 쌓이고, 새로운 툴이 붙으면서 "이거 혹시 올라간 거 아니야?" 하는 불안감이 팀 내에서 슬슬 나오기 시작한다.

이번에는 거기에 더해 scripts/bulk_seed.py 안에 텔레그램 봇 토큰이 디폴트 값 형태로 박혀 있던 게 같이 발견됐다. 실제 유효한 토큰은 아니었지만, "디폴트 문자열처럼 보이는 자리에 실수로 진짜 토큰을 넣고 커밋하는" 패턴이 생기기 딱 좋은 구조였다. 이런 건 사고가 나기 전에 잡아야 한다.

작업 내용

크게 두 가지.

1. .gitignore 확장

기존에 없던 패턴들을 추가했다. 자동화 프로젝트에서 자주 누락되는 항목들은 대체로 이런 식이다.

# 환경 변수 / 시크릿
.env
.env.*
!.env.example

# 로컬 설정
*.local
config.local.*

# 스크립트 아웃풋 / 임시 파일
scripts/output/
*.tmp
*.log

# Python
__pycache__/
*.pyc
.venv/

특히 !.env.example 패턴은 중요하다. .env.*를 전부 막으면서 예시 파일은 커밋 가능하게 열어두는 것. 이걸 안 해두면 나중에 신규 팀원이 ".env.example도 ignore 됩니까?" 하고 물어보는 상황이 생긴다.

2. bulk_seed.py 토큰 디폴트 제거

구분 변경 전 변경 후
토큰 처리 방식 코드 내 디폴트 문자열 하드코딩 환경변수에서만 로드
토큰 없을 때 동작 디폴트 값으로 조용히 진행 명시적 예외 발생 또는 종료
의도 전달 불분명 (이게 예시인지 실값인지) 명확히 외부 주입 필요하다는 신호

코드 변경은 대략 이런 방향이었을 것이다.

# Before — 디폴트가 있어서 실수 유발
TELEGRAM_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN", "123456:ABC-some-default-string")

# After — 없으면 바로 실패, 의도가 명확
TELEGRAM_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
if not TELEGRAM_TOKEN:
    raise EnvironmentError("TELEGRAM_BOT_TOKEN 환경변수가 설정되지 않았습니다.")

디폴트를 제거하는 게 "엄격해지는 것"처럼 느껴질 수 있는데, 사실 이게 더 안전하다. 조용히 동작하는 것보다 시끄럽게 실패하는 편이 자동화 스크립트에서는 훨씬 낫다. 토큰이 없는 채로 bulk 작업이 돌아가다 중간에 실패하는 것보다, 시작 시점에 "토큰 없음"으로 죽는 게 디버깅도 쉽고 피해 범위도 작다.

회고

이런 작업은 우선순위에서 항상 밀린다. 기능 개발도 아니고 버그 픽스도 아니라서 스프린트 티켓으로 잘 안 잡히는 유형이다. 그래서 팀장이 직접 챙기거나, 코드리뷰 중에 "이거 이번 스프린트 끝나고 바로 하자" 하고 합의를 끌어내야 한다.

이번에 묶어서 처리한 이유도 있다 — .gitignore 이슈를 보다가 bulk_seed.py를 들여다봤고, 거기서 토큰 디폴트를 발견했다. 별개 커밋으로 쪼갤 수도 있었는데, 보안 관련 정비는 한 커밋에 묶는 게 히스토리 추적 면에서 낫다고 판단했다. "보안 설정 관련 작업"이라는 맥락이 하나로 묶여 있으면 나중에 감사 로그를 볼 때도 편하다.

자동화 레포는 조직 내에서 "아무도 제대로 안 보는 레포" 취급받기 쉬운데, 실제로는 시크릿을 제일 많이 다루는 쪽 중 하나다. 그래서 오히려 더 엄격하게 관리해야 한다는 게 요즘 생각이다.


다음은 pre-commit 훅으로 시크릿 패턴 감지를 자동화하는 것까지 연결할 계획이다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.