← 개발 로그 목록

website: gitleaks — 테스트 전용 JWT_SECRET 더미 값 오탐 무시

/ 4분 분량 / 개발 로그

멋사 경희대 사이트 프로젝트의 dev → main 승격 PR에서 gitleaks가 테스트 fixture의 더미 JWT_SECRET을 실제 시크릿으로 오탐지한 문제를 `.gitleaksignore`에 fingerprint를 추가해 해결한 PR입니다.

요약

이 PR은 .gitleaksignore 파일에 5줄을 추가하는 아주 작은 변경이지만, dev 브랜치를 main으로 승격하는 PR(#110)의 CI를 막고 있던 gitleaks 오탐 문제를 해결한 PR입니다. 2026년 7월 13일 생성되어 2분 만에 병합됐습니다. 변경된 파일은 .gitleaksignore 하나뿐이고, 코드 로직 변경은 전혀 없습니다.

배경 및 목적

dev → main 승격 PR(#110)을 진행하던 중 gitleaks 스캔이 backend/src/test/resources/application.yml:17에 있는 값을 generic-api-key로 걸어냈습니다. 문제가 된 값은 test-secret-key-for-ci-must-be-at-least-32-characters-long이라는 문자열로, CI 프로필에서만 쓰이는 JWT_SECRET 테스트 더미 값입니다. 실제 배포 환경에서 쓰이는 시크릿이 아니라 테스트를 위해 하드코딩해둔 값인데, JWT_SECRET 특성상 32자 이상의 무작위처럼 보이는 문자열이어야 하다 보니 gitleaks의 generic-api-key 규칙에 걸린 것입니다.

이런 오탐이 있으면 CI가 계속 실패 상태로 남아 승격 PR을 막게 되므로, 실제 위험이 없다는 걸 확인한 뒤 해당 fingerprint를 명시적으로 무시 처리해줄 필요가 있었습니다.

구현 내용

변경은 .gitleaksignore 파일에 주석과 fingerprint 한 줄을 추가하는 것으로 끝났습니다.

# backend/src/test/resources/application.yml:17 — CI 테스트 전용 JWT_SECRET 더미 값
# ("test-secret-key-for-ci-must-be-at-least-32-characters-long"). 실제 시크릿 아님,
# 무작위처럼 보이는 문자열이라 generic-api-key 규칙에 오탐.
0f759d0a583172632ef6caa94a449ee843a01391:backend/src/test/resources/application.yml:generic-api-key:17

전체 파일을 무시 대상으로 두는 대신, 커밋 해시 + 파일 경로 + 규칙명 + 라인 번호로 구성된 fingerprint 단위로 무시 처리했습니다. 이렇게 하면 이 특정 커밋의 이 특정 라인만 예외로 처리되고, 같은 파일에 다른 문제가 생기면 gitleaks가 여전히 잡아낼 수 있습니다.

기존 .gitleaksignore에도 이미 비슷한 사례들이 있었습니다 — 문서 내 개인정보 예시나 테스트 코드의 placeholder 도메인 등, 실제 위협이 아니지만 패턴만으로 오탐된 항목들을 fingerprint 단위로 관리해온 흐름을 그대로 따랐습니다.

기술적 의사결정

gitleaks 오탐 대응 방법은 크게 두 가지입니다. 하나는 해당 파일/라인을 스캔 대상에서 완전히 제외하는 것이고, 다른 하나는 이번처럼 fingerprint(커밋 해시 기반) 단위로 특정 발견 건만 무시하는 것입니다. 이 PR은 후자를 택했는데, 이렇게 하면 무시 범위가 딱 그 커밋의 그 라인으로 한정되기 때문에 향후 같은 파일에 진짜 시크릿이 섞여 들어가더라도 gitleaks가 놓치지 않습니다. 테스트 fixture라도 시크릿 스캔 자체를 꺼버리지 않고 최소 단위로 예외를 관리한 셈입니다.

배운 점 및 개선점

CI 테스트용 더미 값이라도 시크릿 스캐너 입장에서는 "무작위처럼 보이는 긴 문자열"이라는 패턴만으로 판단하기 때문에 오탐이 발생할 수 있다는 걸 다시 확인한 케이스였습니다. .gitleaksignore를 파일 단위가 아니라 fingerprint 단위로 세밀하게 관리해온 이 프로젝트의 기존 방식 덕분에, 이번에도 동일한 패턴으로 빠르게 해결할 수 있었습니다. 다만 이런 오탐이 반복적으로 발생한다면, 애초에 테스트 fixture에서 JWT_SECRET 같은 값을 더 명확하게 "이건 더미다"라고 구분되는 형태(예: 접두사 규칙)로 작성해서 오탐 자체를 줄이는 방향도 고려해볼 만합니다.