← 목록으로

WAF란?

WAF란?

서론

웹 서비스를 만들다 보면 "보안은 나중에"라고 생각하기 쉽습니다. 하지만 서비스가 실제로 공개되는 순간, 수많은 자동화된 공격과 취약점 스캐너가 우리 서버를 향해 날아옵니다.
이때 애플리케이션 레벨에서의 공격을 막아주는 보안 장비/서비스가 바로 WAF(Web Application Firewall, 웹 방화벽) 입니다.
이 글에서는 보안을 처음 접하는 초보 개발자도 이해할 수 있도록, WAF의 개념부터 동작 방식, 실무에서 어떻게 활용하는지까지 차근차근 정리해 보겠습니다.

1. WAF란 무엇인가?

1.1 WAF의 정의

WAF(Web Application Firewall) 는 이름 그대로 웹 애플리케이션을 보호하는 방화벽입니다.
일반 방화벽이 IP, 포트, 프로토콜 등 네트워크 레벨에서 트래픽을 필터링한다면, WAF는 HTTP/HTTPS 요청 내용을 분석해서 공격 패턴을 차단합니다.

  • 네트워크 방화벽: "어떤 IP가 어떤 포트로 접속해도 되는가?"를 제어
  • WAF: "이 HTTP 요청이 정상적인 웹 요청인가, 아니면 공격 시도인가?"를 판단

즉, WAF는 웹 애플리케이션을 노리는 공격(SQL Injection, XSS 등)을 탐지/차단하는 데 초점이 맞춰져 있습니다.

1.2 왜 WAF가 필요한가?

현대 웹 서비스는 로그인, 게시글 작성, 파일 업로드 등 다양한 기능을 제공합니다. 이 모든 기능은 곧 입력(input) 이고, 입력이 있는 곳에는 항상 보안 취약점이 숨어 있을 가능성이 있습니다.

WAF는 다음과 같은 이유로 중요합니다.

  • 개발자가 모든 취약점을 완벽하게 막기 어렵기 때문
  • 새로운 취약점(제로데이)이 계속 나오기 때문
  • 외부에서 오는 이상 트래픽을 한 곳에서 모니터링/제어할 필요가 있기 때문

개발 단계에서 보안을 아무리 신경 써도, 실제 운영 환경에서 마지막 방어선 역할을 해주는 것이 WAF입니다.

2. WAF는 어디에 위치할까?

WAF는 보통 아래 그림처럼 클라이언트와 웹 서버 사이에 위치합니다.

클라이언트(브라우저, 앱) ↓ [ WAF ] ↓ 웹 서버 / API 서버

또는 클라우드 환경에서는 다음과 같이 구성되기도 합니다.

  • 클라이언트 → CDN/로드 밸런서(WAF 기능 포함) → 웹 서버

중요한 것은, 모든 웹 트래픽이 WAF를 반드시 거쳐서 서버로 들어가도록 구성해야 한다는 점입니다. 그래야 공격도 WAF에서 먼저 걸러낼 수 있습니다.

3. WAF가 막아주는 대표적인 공격

3.1 SQL Injection

SQL Injection은 공격자가 입력 값에 SQL 코드를 섞어 넣어 데이터베이스를 조작하는 공격입니다.

예를 들어, 로그인 폼에 다음과 같은 값을 넣는 경우입니다.

' OR '1'='1

애플리케이션이 입력 값을 제대로 필터링하지 않았다면, 공격자는 임의로 데이터 조회/수정/삭제까지 할 수 있게 됩니다.
WAF는 이런 의심스러운 쿼리 패턴을 감지해서 요청을 차단할 수 있습니다.

3.2 XSS(Cross-Site Scripting)

XSS는 공격자가 악성 스크립트를 웹 페이지에 주입해 다른 사용자의 브라우저에서 실행되도록 만드는 공격입니다.

예를 들어, 댓글에 이런 내용을 남기는 경우입니다.

<script>alert('해킹!');</script>

출력 시 필터링이 제대로 되지 않으면, 이 페이지를 보는 사용자의 브라우저에서 스크립트가 실행됩니다.
WAF는 스크립트 태그, 이벤트 핸들러(onclick 등), 의심스러운 파라미터 패턴을 기준으로 이런 요청을 차단할 수 있습니다.

3.3 기타 공격들

WAF는 이 외에도 다양한 웹 공격을 막는 데 활용됩니다.

  • 파일 업로드 취약점 악용
  • 디렉터리 트래버설(../ 경로를 이용한 파일 접근)
  • 브루트포스 로그인 시도
  • 봇/스크래퍼 트래픽

물론 모든 걸 100% 막아주는 것은 아니지만, 공격의 상당 부분을 1차적으로 걸러주는 필터 역할을 합니다.

4. WAF는 어떻게 공격을 탐지할까?

WAF는 주로 다음 두 가지 방식으로 공격을 탐지합니다.

4.1 시그니처 기반 탐지

시그니처(Signature) 는 이미 알려진 공격 패턴을 의미합니다.
예를 들어:

  • "UNION SELECT" 가 포함된 쿼리
  • "<script>" 태그가 포함된 입력
  • 알려진 취약점 스캐너의 User-Agent 값

WAF에는 이런 공격 패턴 리스트(룰셋) 가 미리 들어있고, 요청이 들어올 때마다 패턴과 비교하여 차단 여부를 결정합니다.

장점:

  • 잘 알려진 공격에 대해서는 정확하게 차단 가능

단점:

  • 새로운 공격 기법에 대해서는 업데이트가 필요

4.2 행위/룰 기반 탐지

시그니처 외에, 행위 기반 룰을 설정해서 공격을 막을 수도 있습니다.

예시:

  • 동일 IP에서 짧은 시간에 로그인 시도가 수십 번 발생하면 차단
  • 한 IP에서 특정 URL을 과도하게 호출하면 Rate Limit 적용
  • 업로드 파일 확장자/크기 제한

이 방식은 패턴이 딱 떨어지지 않는 공격이나 봇/스크래퍼를 걸러내는 데 유용합니다.

5. 클라우드 환경에서의 WAF

요즘에는 장비를 직접 구축하기보다는, 클라우드에서 제공하는 Managed WAF 서비스를 많이 사용합니다.

대표적인 예:

  • AWS WAF
  • Cloudflare WAF
  • Azure WAF
  • GCP Cloud Armor (WAF 기능 포함)

이런 서비스들은 다음과 같은 장점이 있습니다.

  • 설정 UI/콘솔 제공 → 초보자도 비교적 쉽게 룰을 설정
  • 자동 룰셋 업데이트 → 새로운 취약점에 빠르게 대응
  • 로그/대시보드 제공 → 어떤 공격이 얼마나 들어오는지 시각적으로 확인

초보 개발자라면, 먼저 CDN 또는 클라우드에서 제공하는 기본 WAF 기능을 켜보고,
기본 룰셋 + 필요한 커스텀 룰을 조금씩 추가해 보는 것이 좋은 출발점입니다.

6. WAF를 도입할 때의 오해와 주의점

6.1 "WAF가 있으니 코드 보안은 신경 안 써도 된다?"

가장 위험한 생각입니다.

  • WAF는 마지막 방어선일 뿐입니다.
  • 애플리케이션 코드에서 입력 검증, 인가/권한 체크, 안전한 쿼리 작성(Prepared Statement) 등을 반드시 해야 합니다.

보안의 기본 원칙은 다음과 같습니다.

  • 애플리케이션 레벨에서 최대한 안전하게 만든다.
  • 그 위에 WAF 같은 보안 레이어를 추가로 올려 방어력을 높인다.

6.2 오탐(False Positive) 이슈

WAF는 공격 패턴을 기준으로 요청을 차단하기 때문에, 때로는 정상적인 요청인데도 차단되는 경우가 있습니다.

예시:

  • 개발자가 테스트용으로 SQL 구문이 포함된 텍스트를 전송하는 경우
  • 코드 스니펫을 공유하는 서비스에서 <script> 텍스트를 그대로 보내는 경우

그래서 실무에서는 보통:

  1. 처음에는 감시 모드(Count/Log Only) 로만 켜서 어떤 요청이 차단 대상이 되는지 확인
  2. 룰을 튜닝한 뒤, 실제 차단 모드(Block) 로 전환

하는 과정을 거칩니다.

7. 초보 개발자를 위한 WAF 도입 체크리스트

  1. 내 서비스가 외부에 공개되어 있는가?
  2. 로그인, 회원가입, 게시글 작성 등 입력 폼이 많은가?
  3. API 서버나 관리자 페이지가 인터넷에 직접 노출되어 있는가?

위 질문에 하나라도 "예"라고 답했다면, WAF 도입을 진지하게 고려해 볼 시점입니다.

간단한 시작 방법:

  • 사용 중인 클라우드/호스팅에서 WAF 또는 보안 탭을 찾아본다.
  • 기본 제공 룰셋(예: OWASP Top 10 룰셋)을 활성화한다.
  • 차단 모드가 두렵다면, 처음에는 로그/모니터링 모드로만 켜본다.

마무리

이 글에서는 초보 개발자의 관점에서 WAF가 무엇인지, 왜 필요한지, 어떻게 동작하는지를 살펴보았습니다.

핵심을 정리하면:

  • WAF는 웹 애플리케이션을 노리는 공격을 막아주는 웹 방화벽
  • 네트워크 방화벽이 막지 못하는 애플리케이션 레벨 공격을 필터링
  • 모든 보안을 해결해 주는 마법 도구는 아니지만, 실제 운영 환경에서 매우 중요한 마지막 방어선

앞으로 보안 관련 공부를 더 해 나가면서, WAF뿐 아니라 입력 검증, 인증/인가, 로깅, 모니터링까지 함께 고민해 본다면
한 단계 성장한 "보안에 신경 쓰는 개발자"가 될 수 있을 것입니다.