214. 상태 검사 방화벽 (Stateful Inspection Firewall)
⚠️ 이 문서는 패킷의 겉봉투만 한 장씩 낱개로 검사하여 융통성이 전혀 없던 1세대 패킷 필터링 방화벽의 한계를 극복하기 위해, 통신이 처음 시작될 때부터 끝날 때까지의 흐름(Session State)을 메모리에 기억해 두고 "내가 내보낸 패킷에 대한 정상적인 응답 패킷인가?"를 지능적으로 판별하여 자동으로 문을 열어주는 2세대 방화벽 기술을 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: 방화벽 내부에 '상태 추적 테이블(State Table)'이라는 장부를 만들어, 지나가는 모든 TCP/UDP 통신의 출발지, 목적지, 포트, 통신 상태(SYN, ESTABLISHED 등)의 맥락(Context)을 기록하고 관리하는 동적 필터링 장비다.
- 가치: 내부에서 외부로 나가는 통신만 허용해 두면, 그에 대한 외부의 응답(Inbound)을 받기 위해 위험하게 포트를 억지로 뚫어놓을 필요가 없다. 방화벽이 알아서 장부를 보고 정상적인 대답만 쏙 들여보내 주어 보안성이 비약적으로 상승한다.
- 기술 체계: TCP의 3-Way Handshake(통신 연결 과정)를 철저히 추적하며, 아무리 허가된 IP와 포트를 달고 오더라도 장부에 '질문(요청)'한 기록이 없는 뜬금없는 대답(응답 패킷)이라면 무조건 차단(Drop)한다.
Ⅰ. 1세대 Stateless 방화벽의 비극: 억지 개방
과거에는 외부 응답을 받으려면 아파트 뒷문을 활짝 열어둬야만 했다.
- 상태를 기억하지 못하는 바보 (Stateless):
- 내부 PC(10.0.0.5)가 포트 50000번을 써서 구글(80번 포트)에 접속 요청을 보낸다. (방화벽은 통과시킴)
- 구글이 웹페이지 화면을 담아 PC의 50000번 포트로 응답 패킷을 돌려보낸다.
- 하지만 1세대 방화벽은 방금 전의 요청 상황을 기억하지 못하므로, 외부에서 들어오는 이 응답 패킷을 "외부의 낯선 놈이 내부의 50000번 포트로 들어오려 한다!"며 무조건 차단해 버린다.
- 에페머럴(Ephemeral) 포트 개방의 위험성:
- 결국 직원이 웹서핑을 하려면, 방화벽 관리자는 1024번부터 65535번까지의 고정되지 않은 임시 포트(응답을 받을 포트)로 들어오는 트래픽을 몽땅 열어두는(Allow) 룰을 만들어야 했다. 해커는 이 열린 문을 통해 마음대로 내부망을 유린할 수 있었다.
📢 섹션 요약 비유: 초보 경비원이 피자 배달부를 문밖으로 내보내 주긴 했는데 얼굴을 기억하지 못해서, 그 배달부가 그릇을 찾으러 빈손으로 다시 돌아왔을 때 누군지 몰라 쫓아내는 격입니다. 할 수 없이 아파트 뒷문을 24시간 활짝 열어두고 "배달부는 알아서 이쪽으로 돌아오시오"라고 했다가 그 문으로 도둑들이 물밀듯 들어오는 최악의 보안 사고가 터진 것입니다.
Ⅱ. Stateful Inspection: 상태 장부(State Table)의 마법
방화벽에 머리(메모리)를 달아주자 모든 문제가 우아하게 해결되었다.
- 상태 테이블의 기록 (Session Tracking):
- 내부 직원이 구글에 요청(TCP SYN)을 보내는 순간, 2세대 방화벽은 그 패킷을 룰에 따라 통과시키면서 동시에 장부(메모리)에 한 줄을 적는다.
[내부 IP 10.0.0.5:50000 -> 외부 구글 IP:80 | 상태: 통신 대기 중(SYN_SENT)]
- 응답 패킷의 프리패스 (Dynamic Hole):
- 0.1초 뒤 구글에서 응답 패킷(SYN-ACK)이 들어온다.
- 방화벽은 1번부터 100번까지 적힌 ACL(정적 룰)을 검사하기 전에, 상태 테이블을 먼저 훑어본다.
- "아, 아까 10.0.0.5가 질문했던 그 구글의 응답이구나!"라고 확인되면, 정적인 허용 룰이 아예 없어도 자동으로 임시 구멍(Dynamic Hole)을 뚫어 패킷을 통과시킨다.
- 세션 종료와 구멍의 소멸:
- 양측의 통신이 끝나 종료 패킷(FIN)이 오가거나 일정 시간(Time-out)이 지나면, 방화벽은 장부에서 해당 줄을 지워버리고 임시로 뚫어뒀던 문을 굳게 닫는다.
📢 섹션 요약 비유: 똑똑한 베테랑 경비원이 나가는 사람의 목적지와 나간 시간을 수첩(State Table)에 꼼꼼히 적어둡니다. 외부인이 들어오려 할 때 수첩을 보고 "아, 우리 아파트 101호 주민이 아까 시켰던 짜장면 배달부시군요!" 하고 신원 확인 룰(ACL) 없이 프리패스로 들여보내 주며, 배달부가 나가면 수첩에서 지우고 철문(Port)을 닫아버리는 완벽한 융통성을 보여줍니다.
Ⅲ. 방어의 진화: 비정상 트래픽(Out-of-State) 차단
상태를 기억한다는 것은, 비정상적인 흐름을 단박에 알아챈다는 뜻이다.
- 스푸핑 및 스캐닝 공격 원천 봉쇄:
- 해커가 내부망의 포트를 탐색하기 위해, 처음 인사(SYN)도 없이 다짜고짜 연결된 척(ACK) 하거나 종료하는 척(FIN)하는 비정상 패킷을 찔러보는 공격(Stealth Scan)을 매우 흔하게 쓴다.
- 하지만 Stateful 방화벽은 상태 장부에 '인사를 시작한(SYN) 기록'이 없는데 중간부터 대뜸 들이미는 패킷을 만나면 "장부에 묻지도 않은 것에 대한 뜬금없는 대답"으로 간주하고 가차 없이 차단(Drop)한다.
- 트레이드오프 (성능 저하 및 메모리 고갈 공격):
- 장부를 꼼꼼히 뒤적거려야 하므로 패킷을 기계적으로 통과시키는 1세대 장비보다 속도가 조금 느리다.
- 특히, 해커가 응답을 받지 않을 가짜 인사(SYN Flooding)만 수백만 개를 쏟아내면, 방화벽의 수첩(상태 테이블 메모리)이 꽉 차버려 진짜 정상적인 고객의 통신을 기록하지 못해 서버가 뻗어버리는 디도스(DDoS) 공격에 취약한 면이 있다.
📢 섹션 요약 비유: 뜬금없이 누군가 경비실에 "101호가 주문한 피자입니다!"라며 들이닥쳐도, 수첩에 101호가 피자를 시킨 기록(SYN 요청)이 없으면 절대 문을 안 열어주는 철통 보안입니다. 다만, 동네 초등학생 수만 명이 경비실에 가짜 주문 전화를 장난으로 계속 걸면, 수첩이 꽉 차서(메모리 고갈) 진짜 배달을 못 받는 단점이 있습니다.