라우팅을 통해 트래픽은 IGW, NAT 등을 거쳐 이동한다. 이때 이동하는 길이 뚫려 있다고 아무나 통과시킨다면 분명 문제가 생길 것이다. 그 길목에 검문소를 세워, 어떤 트래픽은 통과시키고, 어떤 트래픽은 차단시킨다. 이 검문소를 방화벽이라고 부른다.
AWS는 방화벽을 두 군데에 둔다.
첫째는 NACL이다. NACL은 방(Subnet) 전체의 입구에 존재한다. 방 단위로 드나드는 모든 트래픽을 검사한다.
둘째는 SG(Security Group)이다. SG는 서버 한 대마다 문 앞에 존재한다. 그렇기 때문에 서버에 직접 닿는 트래픽만 검사한다.
건물로 비유해보면 NACL은 층 입구에 서있는 경비, SG는 각 사무실 문 앞에 서있는 경비라고 생각하면 된다.
손님이 사무실에 들어가기 위해선 층 입구 경비(NACL)를 통과하고, 사무실 문 앞 경비(SG)를 통과해야 한다. 즉 두 개 모두 통과해야 진입이 가능하다는 뜻이다.(User -> NACL -> SG -> 서버)
SG(Security Group)
SG는 서버를 대상으로 하는 방화벽이다.
그렇기 때문에 같은 Subnet에 존재하더라도 각 서버마다 다른 SG를 부여할 수 있다.
SG는 차단(Deny)라는 개념이 아예 없는 화이트리스트 방식이다. 즉, 허용이라고 적은 것만 통과되고 그렇지 않은 것은 전부 자동으로 다 막히게 된다. 그래서 SG에서는 특정 IP를 콕 집어서 차단하는 것이 불가능하다.
Ex)
- Inbound: TCP 443 from 0.0.0.0/0 → "443 포트로 들어오는 건 어디서 오든 허용" (웹 트래픽)
- Inbound: TCP 8080 from sg-alb → "8080은 ALB의 SG에서 오는 것만 허용"
- Outbound: All → 나가는 건 보통 전부 허용
위 2번 예시를 보면 source에 IP가 아니라 sg-alb(alb의 보안 그룹)이 들어가 있는 것을 확인할 수 있다. ALB로부터 오는 트래픽을 허용하기 위한 IP를 적은 것이 아니라 SG로 표현한 것이다. 이렇게 설정하면 ALB가 여러 대로 늘어나거나 IP가 바뀌어도 SG 규칙을 변경하지 않아도 된다. 이것이 SG의 가장 큰 장점이다.
NACL
NACL은 SG와 전부 반대라고 생각하면 이해하기 쉽다.
NACL의 적용대상은 Subnet이다. 이 방에 드나드는 모든 트래픽에 일괄 적용된다.
NACL은 SG와 다르게 Allow와 Deny 둘 다 가능해서 특정 IP만 차단하는 것이 가능하다. 그래서 특정 악성 IP를 차단하는 것은 NACL의 영역이다.
각 규칙에는 번호가 존재하고 번호 순으로 평가를 한다. 작은 번호부터 검사를 진행하다가 매칭되는 규칙을 만나면 해당 규칙에서 종료한다. 예를 들어
- Rule 100: Allow 443 from 0.0.0.0/0
- Rule 200: Deny 443 from 1.2.3.4
일 때, 1.2.3.4 IP를 통과시키려고 한다. Rule 200에서 1.2.3.4를 차단하는 규칙이 존재하지만 그보다 더 작은 Rule 100에서 모든 IP를 허용하기 때문에 Rule 200은 무시되고 1.2.3.4는 통과된다.
그렇기 때문에 핵심은 Deny는 Allow보다 작은 번호에 두어야 한다는 것이다.
Stateful vs Stateless
SG와 NACL은 가장 큰 차이점이 존재한다.
그전에 한 가지 짚고 넘어가자면, 모든 통신은 왕복으로 이루어진다. 클라이언트가 서버로 요청을 보내면 서버는 응답을 돌려보낸다. 즉, 요청과 응답 두 방향이 항상 짝으로 발생한다.
이때 방화벽이 왕복을 어떻게 다루느냐가 갈린다.
먼저 SG는 Stateful이다. 연결을 기억하고 443 요청을 들여보내라고 규칙을 작성해 두면, 방화벽이 허락된 연결을 기억해두고 그에 대한 응답은 규칙과 상관없이 자동으로 내보내준다. 나가는 규칙을 따로 작성하지 않아도 들어오는 것만 신경 쓰면 된다.
NACL은 Stateless 즉, 기억을 하지 않는다. 트래픽 하나하나를 매번 처음 보는 것처럼 독립적으로 검사한다. 요청을 들여보냈다는 걸 기억하지 않기 때문에, 응답이 나갈 때도 나가는 트래픽이 허용된 건지 또 검사하고 나가는 규칙이 없다면 응답을 막아버린다.

위 그림은 443 웹 요청을 SG와 NACL이 각각 어떻게 처리하는지에 대한 그림이다.
SG는 인바운드 규칙에 의해 허용되어 요청이 통과되었고, 그에 대해 아웃바운드 규칙에 상관없이 자동으로 통과한다.
NACL은 인바운드 규칙에 의해 요청이 통과되었지만, 아웃바운드 규칙이 존재하지 않으면 응답이 통과할 수 없다.
응답은 보통 1024~65535 사이의 임시 포트(ephemeral port)로 돌아가기 때문에 NACL의 아웃바운드 규칙은 해당 범위를 허용하게 설정한다.
그렇기 때문에 NACL을 사용할 때 ephemeral port outbound를 빼면으면 요청은 가는데 응답은 받을 수 없는 문제가 발생하기에 주의해야 한다. 하지만 SG는 Stateful이기 때문에 이런 문제가 발생할 일이 없다.
'Infra' 카테고리의 다른 글
| VPC & Subnet 이해하기(Public/Private Subnet, IGW, NAT) (0) | 2026.06.04 |
|---|---|
| Public/Private IP 이해하기(IGW, NAT) (0) | 2026.05.25 |
| Web Server / Web Application Server 이해하기 (0) | 2026.05.25 |
| CDN(Content Delivery Network)에 대해 이해하기 (0) | 2026.05.25 |
| Proxy/Reverse Proxy 이해하기 (0) | 2026.05.25 |