본문으로 건너뛰기
중급약 20분

SAST·DAST·SCA: 자동화된 보안 검사 도구 세 가지

사람이 코드를 하나하나 읽지 않아도, 자동화된 도구가 보안 취약점의 상당수를 미리 걸러낼 수 있다. 세 도구가 각각 무엇을, 언제 검사하는지 구분한다.

  • #SAST
  • #DAST
  • #SCA
  • #보안자동화

개념

사람이 다 못 보는 것을 도구가 메운다

레슨 5에서 배운 OWASP Top 10 같은 취약점을, 사람이 코드를 한 줄씩 읽으며 다 찾아내는 건 비현실적이다. 세 가지 자동화된 보안 검사 도구가 이 부담을 나눠서 진다 — 이름이 비슷해 보이지만 검사 대상과 시점이 완전히 다르다.

SAST(Static Application Security Testing) — 정적 분석

애플리케이션을 실행하지 않고, 소스 코드 자체를 분석해서 취약할 수 있는 패턴을 찾는다.

검사 시점: 코드 작성 직후, 실행 전(모듈 14의 CI 파이프라인 초반)
검사 대상: 소스 코드 그 자체
찾는 것: "이 코드 패턴은 SQL 인젝션(레슨 5)에 취약할 수 있다" 같은
         잠재적 위험 패턴

SAST는 모듈 9(레슨 1)에서 배운 코드 읽기를 기계가 대신해주는 셈이다 — 다만 사람보다 훨씬 빠르고 놓치지 않는다는 장점과, 실제로 악용 가능한지는 판단하지 못하고 "위험해 보이는 패턴"을 넓게 잡아낸다는 한계가 함께 있다.

DAST(Dynamic Application Security Testing) — 동적 분석

실제로 애플리케이션을 실행한 상태에서, 외부에서 공격하듯 요청을 보내며 취약점을 찾는다.

검사 시점: 애플리케이션이 실제로 돌아가는 스테이징 환경(모듈 7 레슨 3)
검사 대상: 실행 중인 애플리케이션의 실제 응답
찾는 것: "이 입력을 보냈더니 실제로 에러 메시지에 시스템 정보가
         노출됐다"처럼 실제로 확인된 문제

DAST는 모듈 12에서 배운 API 테스트와 비슷한 방식으로 동작하지만, 목적이 기능 검증이 아니라 공격 시도에 대한 실제 반응을 확인하는 것이다. SAST보다 "실제로 문제가 있는지" 더 확실하지만, 코드 내부 구조는 못 보므로 SAST가 잡는 일부 잠재 위험은 놓칠 수 있다.

SCA(Software Composition Analysis) — 구성 요소 분석

모듈 15(레슨 1)에서 다룬 것과 달리, 우리가 직접 짠 코드가 아니라 우리가 가져다 쓰는 외부 라이브러리·패키지에 알려진 취약점이 있는지 검사한다.

검사 시점: 의존성을 설치하거나 업데이트할 때(모듈 14의 CI 초반)
검사 대상: package.json 같은 의존성 목록
찾는 것: "이 라이브러리 버전은 이미 공개적으로 알려진 심각한
         취약점이 있다"

레슨 5에서 배운 "취약하고 오래된 컴포넌트 사용"이 바로 SCA가 겨냥하는 문제다. 우리 코드가 완벽해도, 가져다 쓰는 라이브러리 하나에 구멍이 있으면 그게 전체 시스템의 약점이 된다.

세 도구를 CI/CD에 배치하기

모듈 14(레슨 4)에서 배운 품질 게이트에 이 세 도구를 자연스럽게 연결할 수 있다.

1. 코드 작성 → SAST 검사 (가장 빠르고 이르게)
2. 의존성 설치 → SCA 검사
3. 스테이징 배포 → DAST 검사 (가장 늦지만 가장 현실적인 검증)

이 순서는 모듈 11(레슨 1)에서 배운 피라미드 순서(빠르고 저렴한 것 먼저)와 같은 논리를 따른다.

QA의 역할 — 결과를 읽고 우선순위를 매기는 것

이 도구들이 자동으로 결과를 쏟아내지만, 모든 결과가 실제 위험은 아니다(레슨 5의 SAST 한계처럼 "잠재적" 경고가 많이 섞여 있다). QA는 모듈 6(레슨 1)에서 배운 심각도 판단 원칙으로, 쏟아지는 경고 중 진짜 위험한 것과 무시해도 되는 것을 가려내는 역할을 할 수 있다.

그 가려내는 절차 — 허가 확인, 4단계 트리아지, 오탐 분류, CVSS 재평가, 개발팀에 넘길 티켓 형태 — 는 모듈 23(레슨 3) 에서 자세히 다룬다. 최근 늘고 있는 AI 기반 스캐너는 오탐에도 그럴듯한 설명이 붙어 걸러내기가 오히려 더 어려워졌다.

실무에서 왜 필요한가

전담 보안팀이 없는 조직에서는, SAST·DAST·SCA를 CI 파이프라인에 연결해두는 것만으로도 상당한 보안 안전망이 생긴다. QA가 이 도구들의 역할 차이를 이해하고 있으면, "SCA에서 발견된 이 취약점이 실제 심각한지" 판단하거나, "이 기능은 아직 DAST 스캔 대상에 포함이 안 됐다"처럼 빈틈을 짚어낼 수 있다.

실습 과제

과제 1 — 도구 배정하기 (10분)

다음 세 발견이 SAST·DAST·SCA 중 어느 도구에서 나올 가능성이 가장 높은지 배정한다.

  1. "사용하는 이미지 처리 라이브러리 버전에 원격 코드 실행 취약점이 있다"
  2. "로그인 API에 실제로 여러 번 잘못된 요청을 보냈더니 시스템 내부 경로가 노출됐다"
  3. "코드에서 사용자 입력을 검증 없이 SQL 쿼리 문자열에 그대로 이어붙이는 패턴이 발견됐다"

과제 2 — 결과 우선순위 매기기 (10분)

SAST 도구가 "잠재적 위험" 50건을 보고했다고 하자. 이 중 어떤 것부터 우선 검토할지 판단하는 기준을 모듈 6(레슨 1)의 심각도 개념을 참고해 2가지 이상 제시한다.

자가 체크리스트

  • SAST·DAST·SCA가 각각 무엇을, 언제 검사하는지 설명할 수 있다
  • SAST의 한계(실제 악용 가능성 미판단)와 DAST의 한계(코드 내부 미확인)를 설명할 수 있다
  • SCA가 왜 우리가 직접 짜지 않은 코드까지 검사해야 하는지 설명할 수 있다
  • 이 도구들을 CI/CD 파이프라인 어느 시점에 배치하는 게 합리적인지 설명할 수 있다

흔한 실수

  • SAST·DAST·SCA를 같은 것으로 혼동한다. 검사 대상과 시점이 근본적으로 다르다.
  • SAST 결과의 모든 경고를 실제 취약점으로 단정한다. 잠재적 패턴 경고이므로, 실제 악용 가능성은 별도로 판단해야 한다.
  • SCA를 한 번만 돌리고 끝낸다. 새로운 취약점이 계속 발견되므로, 의존성이 바뀔 때마다(또는 정기적으로) 다시 검사해야 한다.

참고 자료

낯선 말 풀이

이 레슨에 나온 약어입니다. 본문에서도 처음 나올 때 점선으로 표시해 두었습니다 (제목과 링크 글자는 그대로 둡니다).

OWASP — 오왁스프
웹과 앱 보안 자료를 공개로 만드는 비영리 단체. 취약점 목록과 점검 기준이 유명하다.
SAST — 정적 보안 분석
프로그램을 돌리지 않고 코드 자체를 읽어 위험한 부분을 찾는 검사.
DAST — 동적 보안 분석
실제로 돌아가는 서비스에 요청을 보내 보며 취약점을 찾는 검사.
API — 응용 프로그램 인터페이스
프로그램끼리 주고받는 창구. 사람이 화면 버튼을 누르는 대신, 프로그램이 정해진 주소로 요청을 보내 답을 받는다.
SCA — 구성 요소 분석
가져다 쓴 부품 코드에 알려진 취약점이 있는지 목록과 맞춰 보는 검사.
CI/CD — 통합·배포 자동화
합치고 시험하고 배포하는 과정을 자동으로 이어 둔 흐름 전체.
QA — 품질보증
만든 것이 쓸 만한지 확인하고, 애초에 덜 망가지게 만드는 방법을 정하는 일. "테스트"는 그 일의 일부다.
CVSS — 공통 취약점 등급 체계
발견된 취약점이 얼마나 심각한지 0~10점으로 매기는 공통 방식.
AI — 인공지능
사람이 규칙을 일일이 적지 않아도 데이터에서 규칙을 찾아 판단하는 소프트웨어.
CI — 지속적 통합
코드를 올릴 때마다 자동으로 합쳐서 빌드하고 시험까지 돌리는 방식.
SQL — 구조화 질의 언어
저장소에 "이런 조건인 줄을 보여 달라"고 묻는 말. 영어 문장에 가까워서 읽기가 비교적 쉽다.

용어집 전체 보기