첫 번째 스캔
Noir로 첫 번째 스캔을 실행하고 결과를 살펴봅니다.
Noir를 설치했으니 프로젝트에 돌려 보고 뭘 찾는지 보자.
각 단계는 앞 단계에 이어지니 처음에는 순서대로 따라가세요.
스캔 실행
프로젝트 디렉터리를 골라 스캔합니다.
noir scan /path/to/your/app
이미 프로젝트 안에 있다면:
noir scan .
Noir는 소스 파일을 읽고 어떤 프레임워크를 쓰는지 탐지한 뒤, 찾은 엔드포인트를 메서드, 경로, 파라미터, 헤더, 쿠키와 함께 모두 출력합니다.
스크린샷에는 -P(시크릿을 찾는 패시브 스캔)와 -T(모든 태거)도 붙어 있습니다. 두 플래그는 아래 주요 플래그 정리 표에 있습니다. 둘 없이 실행하면 태그나 탐지 결과 없이 엔드포인트만 나옵니다.
v0 호환:
noir -b ./app같은 v0 형식도 고치지 않고 그대로 동작합니다. 플래그로 시작하는 호출은 라우터가scan으로 보냅니다.
탐지된 기술 확인
Noir가 탐지한 기술을 보려면 --include techs를 붙입니다.
noir scan . --include techs
Noir가 분석할 수 있는 모든 기술을 보려면:
noir list techs
목록에 없는 프레임워크라면 AI 기반 분석으로 엔드포인트를 탐지할 수 있습니다.
다른 출력 형식 써 보기
기본 출력은 터미널에서 읽기 위한 plain 텍스트입니다. 스크립트나 다른 도구가 읽을 형식이 필요하면 -f를 쓰세요.
# 스크립트와 파이프라인에 적합한 JSON
noir scan . -f json
# YAML
noir scan . -f yaml
# API 도구와 스캐너용 OpenAPI 3.0 명세
noir scan . -f oas3
# 실제 대상에 보낼 cURL 명령
noir scan . -f curl -u https://your-target.com
지원하는 형식 전체는 noir list formats나 출력 형식 섹션에서 볼 수 있습니다.
결과를 파일로 저장
-o로 결과를 파일에 저장합니다. 터미널에도 그대로 출력됩니다.
noir scan . -f json -o results.json
엔드포인트를 소스까지 추적
각 엔드포인트가 정의된 소스 파일과 줄 번호를 보려면 --include path를 붙입니다.
noir scan . --include path
여러 항목을 한 플래그에 묶을 수 있습니다.
noir scan . --include path,techs
스캔 범위 좁히기
여러 프레임워크가 섞인 모노레포라면 스캔 범위를 좁히세요.
# Rails와 Django 탐지기만 실행 (나머지는 건너뜀)
noir scan . --only-techs rails,django
# 자동 탐지 결과에 더해 Rails·Django 분석기도 함께 실행
noir scan . --techs rails,django
# Express만 빼고 전부 스캔
noir scan . --exclude-techs express
# 모노레포에서 glob 패턴으로 파일 제외 (쉼표로 구분)
noir scan . --exclude-path "*_test.go,vendor/*,**/node_modules/**"
--only-techs와 --techs는 비슷해 보이지만 하는 일이 다릅니다.
--only-techs는 실행할 탐지기를 제한합니다(지정한 탐지기만 돌아서 스캔이 빨라짐).
--techs는 자동 탐지 결과에 더해 분석기 집합에 기술을 추가합니다
(탐지가 놓쳐도 그 분석기는 실행됨).
"이 기술만, 탐지되지 않아도 실행"하고 싶다면 둘을 함께 쓰세요.
출력 보강하기
--include는 plain 출력에 엔드포인트별 정보를 더하고,
--ai-context는 AI 감사자를 위한 리뷰 컨텍스트를 붙입니다.
# 1-hop 핸들러 callee 첨부 (라우트 본문 안의 함수/메서드 호출)
noir scan . --include callee
# AI 리뷰용 컨텍스트 첨부 (guards, callees, sources, sinks, validators, signals)
noir scan . --ai-context
# AI 컨텍스트 범위 좁히기
noir scan . --ai-context guards,sinks
필터링해도 관련 근거는 함께 남습니다. signals를 고르면 각 시그널이
근거로 삼은 버킷도 함께 남습니다(예: ssrf 시그널은 sinks와 sources를
유지). 다른 버킷만 고르면 그 버킷에 기대는 시그널과 그 시그널의 근거만
남습니다. 그래서 guards,sinks를 골라도 sources가 함께 나올 수 있습니다.
priority_review 요약은 signals를 골랐을 때만 나옵니다.
--ai-context는 컨텍스트를 만들 때 쓰는 --include callee와 모든 태거(또는
--use-taggers로 고른 태거만)도 함께 켭니다. 그래서 출력에 callees와
tags도 나옵니다.
데이터 모양과 프레임워크별 지원은 Callee 커버리지와 AI 컨텍스트를 참고하세요.
주요 플래그 정리
| 플래그 | 역할 |
|---|---|
| positional 경로 | 스캔할 디렉터리(하나 이상). 예: noir scan ./api ./worker |
-b <경로> |
positional 경로와 같음, v0 호환 |
-f <형식> |
출력 형식 (json, yaml, oas3, curl 등) |
-o <파일> |
출력을 파일로 저장 |
-u <URL> |
경로 앞에 붙는 기본 URL. --status-codes, --probe, --probe-via에 필요 |
--include LIST |
plain 출력에 path, techs, callee 추가 (쉼표 구분) |
--ai-context [LIST] |
AI 리뷰 컨텍스트 첨부 (guards, callee, sources, sinks, validators, signals, 또는 all) |
--pvalue TYPE=VAL |
출력에 파라미터 값 채우기 (TYPE: any / header / cookie / query / form / json / path) |
--only-techs |
이 탐지기만 실행 (나머지 건너뜀) |
-t, --techs |
자동 탐지 결과에 더해 이 기술을 분석기 집합에 추가 |
--exclude-techs |
탐지 후 결과에서 이 기술 제외 |
--exclude-path |
쉼표 구분 glob 패턴에 매치되는 파일 제외. /가 있는 패턴은 스캔 기준 경로, 없는 패턴은 파일·디렉터리 이름과 비교하며, 디렉터리가 매치되면 그 아래 전체를 제외 |
--status-codes |
각 엔드포인트를 호출해 응답 HTTP 상태 코드를 첨부 |
--exclude-codes |
응답 상태가 매치되는 엔드포인트 제외 (쉼표 구분, --status-codes와 함께) |
-P, --passive-scan |
패시브 보안 스캔 활성화 |
-T, --use-all-taggers |
모든 태거 활성화 |
--probe |
발견한 엔드포인트에 HTTP 요청 보내기 (-u 필요) |
--probe-via <url> |
프로브 요청을 이 프록시 URL로 보냄 |
--probe-header VAL |
각 프로브에 헤더 추가 (반복 가능) |
--tls-skip-verify |
프로브/내보내기/웹훅의 TLS 인증서 검증 건너뛰기 (안전하지 않음) |
--use-taggers LIST |
특정 태거만 활성화 (쉼표 구분; noir list taggers 참고) |
--export-es <url> |
엔드포인트를 Elasticsearch에 인덱싱 |
--export-opensearch <url> |
엔드포인트를 OpenSearch에 인덱싱 (--export-es와 같은 전송 형태) |
--export-webhook <url> |
엔드포인트 카탈로그를 JSON으로 웹훅에 POST |
--ai-provider |
AI 제공업체 접두사 또는 전체 URL (AI 기반 분석 참고) |
--ai-model NAME |
AI 모델 이름 |
--ai-key KEY |
AI API 키 (프로세스 목록에 노출되므로 NOIR_AI_KEY 또는 --ai-key-file PATH 권장) |
--diff-path <path> |
Diff 모드용 이전 코드 경로 |
--diff-ref <ref> |
비교할 git 리비전 (예: main, HEAD~1; Diff 모드 참고) |
--fail-on <list> |
diff에 added, removed, changed, auth-removed 중 하나라도 있으면 종료 코드 3 |
--passive-scan-severity LVL |
패시브 스캔 최소 심각도 (critical, high, medium, low 중 하나; 기본 high) |
-d, --debug |
디버그 메시지 활성화 |
--config-file <경로> |
YAML 설정 파일에서 기본 옵션 로드 |
--concurrency <N> |
워커 수 (기본값: CPU 수, 4–32 범위로 제한; 또는 NOIR_CONCURRENCY) |
--cache-disable |
이번 실행에 한해 LLM 응답 캐시 비활성화 |
--cache-clear |
실행 전에 LLM 응답 캐시 초기화 |
--strict |
분석기가 실패했거나 건너뛴 파일이 있으면 종료 코드 2 반환 (결과 출력은 그대로) |
--verbose |
자세한 로그. --include path와 --use-all-taggers도 함께 켬 |
--no-log |
로그를 숨기고 결과만 표시 |
--no-color |
plain 출력의 ANSI 색상 비활성화 |
--no-spinner |
로딩 스피너 애니메이션 비활성화 |
빌드 정보(Crystal / LLVM / 타깃)는 noir version --verbose로 확인합니다. noir help는 최상위 개요를, noir help <command>는 해당 명령어의 전체 플래그 목록을 보여줍니다.
시작하기는 여기까지입니다. 다음으로 볼 만한 문서: