Dev.to Security 🔐 Cybersecurity 👁 0 📖 3 min read

무료로 레포지토리 보안 취약점을 탐지하는 방법

무료로 레포지토리 보안 취약점을 탐지하는 방법 저장소(repo)의 취약점을 무료로 탐지하려면 세 가지 계층을 조합해 보세요. 의존성 스캐너(npm audit, pip-audit 또는 OSV-Scanner), 시크릿 스캐너(Gitleaks), 코드 스캐너(Semgrep Community Edition)가 바로 그것입니다. 이 도구들을 모든 풀 리퀘스트(PR)마다 실행하도록 설정하세요.

무료로 레포지토리 보안 취약점을 탐지하는 방법

무료로 레포지토리 보안 취약점을 탐지하는 방법

무료로 레포지토리 보안 취약점을 탐지하는 방법

저장소(repo)의 취약점을 무료로 탐지하려면 세 가지 계층을 조합해 보세요. 의존성 스캐너(npm audit, pip-audit 또는 OSV-Scanner), 시크릿 스캐너(Gitleaks), 코드 스캐너(Semgrep Community Edition)가 바로 그것입니다. 이 도구들을 모든 풀 리퀘스트(PR)마다 실행하도록 설정하세요. 다만 이 도구들 중 어느 것도 누락된 인가(권한 확인) 로직을 찾아내지는 못하므로, 해당 부분은 런타임 테스트를 추가하여 보완해야 합니다.

지금 Apidog 사용해 보기

npm audit --audit-level=high
pip-audit -r requirements.txt
gitleaks git . --no-banner
semgrep scan --config p/default --metrics=off --error

Vercel Security Review가 가져온 변화

Vercel Security Review는 2026년 11월 2일부터 공개 베타로 제공 중인 Vercel Agent의 새로운 보안 기능입니다. 연결된 GitHub 저장소에 푸시가 발생할 때마다 변경 사항(diff)과 주변 코드를 분석하고, 해당 변경점에 어떻게 도달할 수 있는지 실행 흐름을 추적하며, 탐지된 보안 취약점을 보고하기 전에 재검증합니다.

이 글을 쓰게 된 계기도 바로 Vercel이 든 예시 때문입니다. 인보이스 조회 엔드포인트의 변경 사항에서 조직(Organization) 확인 없이 ID만으로 인보이스를 조회하도록 작성되어, 로그인한 사용자라면 누구나 다른 조직의 인보이스를 다운로드할 수 있는 문제가 있었습니다. 이는 전형적인 비즈니스 로직 결함이며, 기존 패턴 기반 스캐너로는 이러한 로직 결함을 잡아내기 어렵습니다.

사용 대상 및 지원 조건은 다음과 같습니다.

구분 내용
지원 플랜 Pro 및 Enterprise 팀 전용
비용 2026년 11월 10일까지 무료, 이후 제공업체 토큰 요금 + 100만 토큰당 $0.25
지원 저장소 연결된 GitHub 저장소 (Vercel에 배포되지 않는 저장소는 아직 미지원)
검사 범위 기준 브랜치 대비 diff, 또는 최초 리뷰 시 전체 소스 코드
결과 확인 Vulnerabilities 대시보드, GitHub check, 비공개(private) 및 내부(internal) 저장소의 PR 코멘트

Vercel 공식 문서에서도 명시하듯 한계점도 분명합니다. 이 기능은 실행 중인 애플리케이션이 아닌 정적 코드만을 분석하며, 침투 테스트(모의해킹)를 대체할 수는 없습니다. 해당 조건에 맞지 않거나 무료 프로모션 기간이 끝난 후에 이 글을 보시더라도 걱정하지 마세요. 본 가이드의 나머지 내용은 모두 비용이 전혀 들지 않습니다.

저장소 취약점 점검 시 꼭 포함해야 할 네 가지

완전한 저장소 취약점 점검을 구축하려면 다음 네 가지를 반드시 확인해야 합니다. 바로 의존성 패키지의 알려진 취약점, Git에 커밋된 자격 증명(시크릿), 인젝션과 같은 안전하지 않은 코드 패턴, 그리고 인가(Authorization) 로직입니다. 앞의 세 가지는 무료이면서 완성도 높은 스캐너들이 이미 존재합니다. 하지만 네 번째인 인가 로직은 코드의 실제 맥락과 비즈니스 의도에 좌우되므로, 실행 중인 API를 대상으로 직접 테스트를 수행해야 합니다.

Four stacked layers of a repo scan: dependencies, secrets and code patterns each have free scanners, while authorization logic needs a runtime test

코드에서 키를 삭제하더라도 Git 히스토리에는 그대로 남아 있으므로, 커밋 기록 전체를 검사하고 유출된 실제 키는 즉시 교체(rotate)해야 합니다. API 트래픽 및 테스트 컬렉션에 포함된 키 유출을 점검하는 방법은 API 키 유출 점검 가이드를 참고하세요.

무료 취약점 스캐너 비교

가격과 라이선스는 2026년 11월 5일 기준으로 확인되었습니다. 본 가이드에서 소개하는 CLI 도구 명령어들은 계정을 생성하거나 카드를 등록하지 않고도 모두 사용할 수 있습니다.

도구 탐지 대상 비용 및 라이선스 주의사항
npm audit npm 의존성 취약점 무료, npm 기본 내장 락파일(lockfile) 필요
pip-audit Python 의존성 취약점 무료, Apache-2.0 Python 전용
OSV-Scanner 다양한 생태계 전반의 의존성 취약점 무료, Apache-2.0 보고 건수가 많아 선별(트리아지) 작업 필요
Trivy 의존성, 시크릿, 잘못된 설정(misconfiguration) 무료, Apache-2.0 버전 고정 권장(하단 참고)
Gitleaks Git 히스토리 내 시크릿 무료, MIT 조직(Organization)의 경우 GitHub Action 사용 시 무료 라이선스 키 필요
Semgrep Community Edition 코드 패턴, 일부 시크릿 무료, LGPL-2.1 엔진 단일 함수 또는 단일 파일 범위를 벗어난 데이터 추적 불가
Dependabot alerts 의존성 취약점 공개 및 비공개 저장소 모두 무료 GitHub 전용
GitHub secret scanning 시크릿 공개 저장소 무료, 비공개 저장소 활성 커미터당 월 $19 비공개 저장소는 Secret Protection 필요
CodeQL 코드 패턴 공개 저장소 무료, 비공개 저장소 활성 커미터당 월 $30 비공개 저장소는 Code Security 필요

라이선스와 관련해 두 가지 주의할 점이 있습니다. Semgrep의 커뮤니티 규칙은 Semgrep Rules License를 따르므로, 사내 업무 목적의 사용은 허용되지만 재배포하거나 서비스 형태로 제공하는 것은 금지됩니다. 또한 Trivy를 도입할 계획이라면 CVE-2026-33634를 반드시 확인하세요. 2026년 3월 공격자에 의해 Trivy 생태계의 일부 구성 요소가 일시적으로 침해된 바 있습니다. 반드시 최신 릴리스를 사용하고, GitHub Action 적용 시 커밋 SHA를 고정해 사용하는 것이 안전합니다.

몇 가지 명령어로 직접 스캔해 본 결과

실제 테스트를 위해 작은 Express 인보이스 API를 만들어 로컬 저장소에 커밋했습니다. 여기에는 구버전 npm 의존성 4개, Python 의존성 3개, 두 개의 가짜 API 키(Stripe 형식 1개, AWS 형식 1개), SQL 인젝션, 커맨드 인젝션, 그리고 로그인한 사용자라면 누구나 타 조직의 인보이스를 조회할 수 있는 취약한 라우트를 의도적으로 포함시켰습니다.

그다음 2026년 11월 5일 macOS 환경에서 각 도구를 순서대로 실행해 보았습니다.

npm audit
pip-audit -r requirements.txt --no-deps --disable-pip
osv-scanner scan source -r .
trivy fs --scanners vuln,secret .
gitleaks git . --no-banner
semgrep scan --config p/default --metrics=off
semgrep scan --config p/nodejsscan --metrics=off
도구 (버전) 탐지한 항목 놓친 항목
npm audit (npm 11.12.1) 취약한 패키지 9개: High 6개, Low 3개 npm 패키지가 아닌 모든 항목
pip-audit 2.10.1 고정된 3개 패키지에서 16개 보안 권고 전이 의존성 패키지(--no-deps 옵션을 전달했기 때문)
OSV-Scanner 2.7.0 Python 전이 의존성을 포함한 15개 패키지에서 66개의 고유 보안 권고 시크릿 및 코드 결함
Trivy 0.76.1 의존성 취약점 33건 및 Stripe 형식 키 AWS 형식 키
Gitleaks 8.30.1 Stripe 형식 키 AWS 형식 키
Semgrep 1.183.0, p/default Stripe 형식 키, 커맨드 인젝션, CSRF 미들웨어 누락 경고 SQL 인젝션, AWS 형식 키
Semgrep 1.183.0, p/nodejsscan SQL 인젝션, 커맨드 인젝션, AWS 형식 키 Stripe 형식 키

결과에서 주목할 만한 세 가지 시사점이 있습니다.

  • 단순 탐지 건수를 1:1로 비교할 수 없습니다. 패키지, 보안 권고, 탐지 결과는 각각 집계 단위가 다르며 도구마다 분석하는 데이터 소스도 다릅니다. 따라서 총합 수치가 아니라 실제로 무엇을 잡아냈는지를 비교해야 합니다.
  • 시크릿 스캐너 하나만으로는 부족합니다. Gitleaks와 Trivy 모두 AWS 형식 키를 놓쳤습니다.
  • 룰셋(Rule set) 선정이 매우 중요합니다. Semgrep 기본 룰팩(p/default)은 단순 문자열 결합 방식의 SQL 쿼리를 놓쳤습니다. p/javascript, p/nodejs, p/owasp-top-ten, p/sql-injection 역시 이 저장소에서 아무것도 발견하지 못했지만, p/nodejsscan은 정확히 찾아냈습니다.

취약한 인보이스 라우트는 어떤 도구도 잡아내지 못했습니다. 이는 하나의 소규모 저장소를 대상으로 진행한 실증 테스트이므로 절대적인 벤치마크는 아니며, CodeQL은 테스트에 포함하지 않았습니다.

모든 PR마다 GitHub 저장소 자동 스캔하기

표준 GitHub 호스팅 러너는 공개 저장소에서 무료로 제공됩니다. 비공개 저장소의 경우에도 GitHub Free 플랜에 매월 $12 상당의 크레딧이 포함되어 있어, 표준 요율 기준 2코어 Linux 러너를 약 2,000분 동안 실행할 수 있습니다. 아래 워크플로는 기본 CLI 명령어를 직접 사용하므로, 조직 계정에서도 별도의 Gitleaks Action 라이선스 키 없이 바로 실행할 수 있습니다.

name: repo-scan
on:
  pull_request:
  push:
    branches: [main]
permissions:
  contents: read
jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7 # pin to a commit SHA
        with:
          fetch-depth: 0
      - name: Dependencies (npm)
        run: npm audit --audit-level=high
      - name: Dependencies (Python)
        run: pipx run pip-audit -r requirements.txt
      - name: Secrets
        run: |
          curl -sSL https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_linux_x64.tar.gz | tar xz gitleaks
          ./gitleaks git . --no-banner
      - name: Code patterns
        run: pipx run semgrep scan --config p/default --config p/nodejsscan --metrics=off --error

테스트 저장소에서는 4개 스캐너 모두 종료 코드(exit code) 1을 반환했으며, 이처럼 0이 아닌 종료 코드가 반환되면 GitHub Actions 작업이 실패로 처리됩니다. 기술 스택에 필요 없는 단계는 자유롭게 제외하세요. 동일한 파이프라인에서 API 테스트까지 함께 수행하는 방법은 GitHub Actions에서 Apidog CLI 활용하기를 참고하시기 바랍니다.

Dependabot 알림도 함께 활성화하는 것을 권장합니다. 모든 플랜에서 무료로 제공되며, 풀 리퀘스트를 기다리지 않고도 취약점을 감지해 줍니다.

기존 스캐너의 사각지대: 인가(Authorization) 취약점

인가 관련 버그는 정적 패턴 스캐너로 탐지하기가 매우 까다롭습니다. 정상적인 쿼리, 유효한 매개변수, 앞단에 배치된 auth 미들웨어 등 코드 겉모습만 보면 아무런 이상이 없어 보이기 때문입니다. 문제의 핵심은 특정 조건문의 '누락'이며, 그 조건이 존재해야 하는지 여부는 오직 애플리케이션의 데이터 모델만이 알고 있습니다.

// 모든 스캐너가 문제없이 통과시킨 코드
db.query("SELECT * FROM invoices WHERE id = $1", [req.params.id]);

// 해결책: 요청자의 조직 ID로 조회 범위를 한정
db.query("SELECT * FROM invoices WHERE id = $1 AND org_id = $2",
  [req.params.id, req.user.orgId]);

이러한 결함은 OWASP API Security Top 10 2023에서 1위를 차지한 BOLA(Broken Object Level Authorization, 취약한 객체 수준 인가)에 해당합니다. OWASP는 클라이언트가 전달한 ID를 사용하는 모든 요청에서 접근 권한을 엄격히 검증하고, 배포 전에 인가 실패를 잡아낼 수 있는 테스트를 작성할 것을 권고합니다.

코딩 에이전트를 활용하는 것도 큰 도움이 됩니다. 테스트 저장소에서 주석을 모두 제거한 후 Claude Code에게 코드 리뷰를 요청해 보았는데, 조직 검증에 대한 힌트를 준 경우와 전혀 주지 않은 경우 모두 해당 인보이스 라우트의 취약점을 정확히 지적했습니다. 다만 이는 자체 에이전트 플랜을 소모하므로 완전한 무료 방식은 아니며, 실행할 때마다 결과가 달라질 수 있습니다.

반면 테스트를 작성해 두면 매 풀 리퀘스트마다 확실한 성공/실패 결과를 얻을 수 있습니다. API 관점의 보안 검증에 대해 더 알아보고 싶다면 API 취약점 자동화 탐지, API 보안 스캐닝 도구 모음, 그리고 API 보안 테스팅 체크리스트를 확인해 보세요.

Apidog CLI로 코딩 에이전트를 통한 인가 테스트 자동화하기

모든 라우트에 대해 이런 테스트를 일일이 수작업으로 작성할 필요는 없습니다. Apidog CLI를 이용해 코딩 에이전트에게 맡겨 보세요. 에이전트가 라우트를 분석하고, 보호된 리소스마다 테스트를 생성하여 CI에서 자동으로 실행할 수 있는 테스트 스위트를 완성해 줍니다. Apidog Free 플랜에서는 최대 4명의 사용자까지 무료로 이용할 수 있습니다.

npm install -g apidog-cli@latest
apidog auth login --with-token <YOUR_TOKEN>
apidog skill install

먼저 테스트용 조직 2개와 각 조직에 속한 사용자 1명씩이 미리 시딩(seeding)된 테스트 환경을 준비합니다. 그런 다음 에이전트에게 다음과 같이 프롬프트를 전달합니다.

Read the routes in src/. For each route that returns data owned by an
organization, create an Apidog test scenario in project <id>: log in as
the Org A test user, request an Org B resource by ID, and assert the
status is 403 or 404. Add an Org A request for its own resource and
assert 200, so a broken login can't pass. Group the scenarios in a test
suite, run it against the staging environment, and summarize failures.

에이전트는 페이로드 구조를 분석하고, 시나리오를 생성한 후 테스트 스위트를 실행합니다.

apidog cli-schema get test-scenario-create
apidog cli-schema validate test-scenario-create --file scenario.json
apidog test-scenario create --project <id> --file scenario.json
apidog test-scenario import-steps <scenarioId> --project <id> --source endpoint --ids <endpointIds>
apidog test-suite create --project <id> --file suite.json
apidog run --test-suite <suiteId> --project <id> -e <envId> -r cli,junit

Sequence diagram: a test user in Org A logs in, gets a token, requests an Org B invoice, and the test passes on 403 or 404 and fails on 200

정상 요청(Positive check)을 함께 검증하는 것이 매우 중요합니다. 정상 확인 단계가 없으면 기본 URL을 잘못 설정해 404가 발생했을 때도 테스트가 엉뚱한 이유로 통과될 수 있기 때문입니다.

앞서 작성한 워크플로에 동일한 apidog run 명령어를 추가하여 프리뷰 또는 스테이징 배포 환경을 대상으로 실행하도록 구성하세요. 이때 반드시 시딩된 테스트 조직을 대상으로 해야 하며 실제 운영(Production) 데이터를 사용해서는 안 됩니다. 기타 옵션에 대한 자세한 내용은 apidog run 명령어 레퍼런스를, 에이전트 연동 방법은 Claude Code에서 Apidog CLI 활용하기를 참조하세요.

자주 묻는 질문 (FAQ)

저장소의 취약점을 무료로 탐지하는 가장 좋은 방법은 무엇인가요? 의존성 스캐너, Gitleaks, Semgrep Community Edition을 조합하고, 인가 검증을 위한 런타임 테스트를 추가하는 것입니다. 단일 도구 하나만으로는 테스트 저장소의 취약점을 모두 커버하지 못했습니다.

Vercel Security Review는 무료인가요? 2026년 11월 10일까지만 무료이며, Pro 및 Enterprise 팀에만 제공됩니다. 그 이후에는 제공업체 토큰 요금 외에 100만 토큰당 $0.25가 추가로 청구됩니다. 또한 Vercel에 배포되지 않는 저장소는 아직 지원하지 않습니다.

GitHub secret scanning은 비공개(private) 저장소에서도 무료인가요? 아닙니다. 시크릿 스캐닝과 CodeQL은 공개 저장소에서는 무료이지만, 비공개 저장소에서는 활성 커미터당 월 $19의 GitHub Secret Protection 또는 월 $30의 GitHub Code Security 플랜이 필요합니다. 단, Dependabot 알림은 두 환경 모두에서 무료입니다.

Semgrep으로 인가 관련 버그를 잡을 수 있나요? 본 테스트에서 실행한 룰셋으로는 인보이스 라우트의 인가 버그를 찾아내지 못했습니다. Community Edition은 단일 함수나 단일 파일의 범위를 넘어선 데이터 흐름을 추적할 수 없기 때문입니다. 다만 자신의 코드베이스 패턴에 맞는 커스텀 룰을 직접 작성해 탐지하도록 구성할 수는 있습니다.

취약점 스캐너가 침투 테스트(모의해킹)를 완전히 대체할 수 있나요? 대체할 수 없습니다. 스캐너와 자동화 테스트는 알려진 패턴과 사전에 정의해 둔 케이스만을 점검합니다. 모의해킹은 미처 생각하지 못한 허점을 찾아내는 작업이며, Vercel 공식 문서에서도 자사 Security Review 기능이 모의해킹을 대체할 수 없다고 밝히고 있습니다.

📰 Read the original article on Dev.to Security

Originally published by Dev.to Security. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.