한 줄 답변#

NLB는 L4(TCP/UDP), ALB는 L7(HTTP/HTTPS) 로드밸런서입니다. NLB는 패킷을 그대로 전달하고, ALB는 HTTP 요청을 해석해서 라우팅합니다.


동작 계층#

NLB (L4):
  클라이언트 → [NLB: TCP 패킷 전달] → 서버
  - 패킷 내용을 보지 않음
  - IP + Port로만 분기

ALB (L7):
  클라이언트 → [ALB: HTTP 요청 해석] → 서버
  - Host 헤더, URL 경로, HTTP 메서드 확인
  - 요청 내용 기반으로 라우팅 결정

핵심 차이#

항목NLBALB
OSI 계층L4 (TCP/UDP)L7 (HTTP/HTTPS)
라우팅 기준IP + PortHost, Path, Header, Method
지연~100us (극저지연)~1ms
고정 IP제공 (AZ당 1개)미제공 (DNS 기반)
처리량초당 수백만 요청초당 수만 요청
프로토콜TCP, UDP, TLSHTTP, HTTPS, gRPC, WebSocket

라우팅 기능#

NLB:
  - 포트 기반 분기만 가능
  - :443 → 타겟 그룹 A
  - :8080 → 타겟 그룹 B

ALB:
  - api.example.com/users → User 서비스
  - api.example.com/orders → Order 서비스
  - admin.example.com/* → Admin 서비스
  - Header X-Version: v2 → V2 서비스

ALB는 하나의 로드밸런서로 여러 서비스를 Host/Path 기반으로 분기할 수 있다. NLB는 포트를 나누거나 별도 NLB를 만들어야 한다.


성능#

NLB가 압도적으로 빠르다:

항목NLBALB
지연~100us~1ms (10배 차이)
워밍업불필요트래픽 급증 시 필요할 수 있음
초당 연결수백만수만

NLB는 패킷을 해석하지 않고 전달만 하기 때문이다. ALB는 HTTP 파싱, 헤더 검사, 라우팅 규칙 평가를 하므로 오버헤드가 있다.


고정 IP#

NLB:
  AZ-a: 52.78.xxx.xxx (고정)
  AZ-c: 13.125.xxx.xxx (고정)
  → IP allowlist에 유리

ALB:
  k8s-staging-xxxx.ap-northeast-2.elb.amazonaws.com
  → IP가 변동됨 (DNS 기반)
  → IP allowlist 불가, 도메인으로 연동해야 함

파트너사가 “우리 방화벽에 IP를 등록해야 합니다” 하면 NLB여야 한다.


Security Group — ALB를 선택한 결정적 이유#

CloudFront → LB 구조에서 직접 접근을 막아야 한다#

CloudFront를 앞에 놓는 이유는 DDoS 방어 + WAF인데, 공격자가 ALB 주소를 알아내서 CloudFront를 우회하면 의미가 없다. 실제로 침투테스트에서 이걸 당했다(H-10).

정상 흐름: 사용자 → CloudFront (WAF 검사) → ALB → Pod     ✅
우회 공격: 공격자 → ALB 직접 접근 (WAF 우회)  → Pod     ❌ 막아야 함

이걸 막으려면 ALB가 CloudFront에서 오는 요청만 받도록 해야 한다.

ALB: Security Group + Prefix List로 해결#

CloudFront는 전 세계 Edge 서버에서 요청을 받아서 Origin(ALB)으로 전달한다. 이 Edge 서버들의 IP 주소를 AWS가 pl-22a6434b라는 Managed Prefix List로 관리한다 (약 45개 IP 대역, 자동 업데이트).

ALB Security Group:
  인바운드 규칙:
    443 ← pl-22a6434b          (CloudFront Edge IP 약 45개)
    443 ← 39.119.192.15/32     (팀원 A)
    443 ← 124.49.102.36/32     (팀원 B)
    443 ← 122.34.166.131/32    (팀원 C)

결과:
  CloudFront Edge에서 오는 요청    → 허용 ✅
  팀원 IP에서 직접 접근             → 허용 ✅
  공격자가 ALB 주소로 직접 접근     → 차단 ❌ (SG에 없는 IP)

ALB는 Security Group을 완전 지원하기 때문에 Prefix List를 바로 적용할 수 있다.

NLB: Security Group 적용이 제한적#

NLB는 원래 Security Group을 아예 지원하지 않았다. 2023년에 추가되긴 했지만 제약이 있다:

조건NLB SG 지원
타겟 유형: IP지원
타겟 유형: Instance미지원
타겟 유형: ALB미지원
기존 NLB에 SG 추가불가 (생성 시에만)

EKS 환경에서 AWS Load Balancer Controller가 NLB를 생성할 때 타겟 유형이 Instance인 경우가 많아서, SG를 붙일 수 없는 상황이 발생한다.

NLB (Instance 타겟):
  SG 적용 불가
  → CloudFront Prefix List를 붙일 수 없음
  → 누구나 NLB에 직접 접근 가능
  → CloudFront + WAF 보안 체인이 무력화됨

비교 정리#

항목NLBALB
SG 지원2023년 추가, 타겟 유형 제약완전 지원
Prefix List 적용조건부 (IP 타겟만)바로 적용
CloudFront 직접 접근 차단어렵거나 불가능pl-22a6434b 한 줄로 해결
결과보안 체인에 구멍보안 체인 완성

이 차이가 NLB 대신 ALB를 선택한 결정적 이유다. NLB의 성능(~100us)이 아무리 좋아도, CloudFront → WAF → SG 보안 체인을 구성할 수 없으면 티켓팅 플랫폼에서는 쓸 수 없었다.


AWS 서비스 연동#

서비스NLBALB
CloudFront Origin제약 있음바로 연결
AWS WAFX (L4라 HTTP 해석 불가)O
ACM 인증서수동 관리자동 연동
Cognito 인증XO

보안 체인(CloudFront → WAF → LB → 백엔드)을 구성하려면 ALB가 필수다.


비용 (ap-northeast-2)#

항목NLBALB
시간당 고정$0.0225$0.0225
처리 단위NLCU $0.006LCU $0.008
Public IP고정 IP 포함자동 할당 $0.005/h/IP
월 예상 (2AZ)~$16~$23 (IP 포함)

ALB가 약간 비싸지만 큰 차이는 아니다.


언제 뭘 쓰나#

NLB를 써야 하는 경우#

  • 고정 IP가 필수 (파트너 allowlist)
  • TCP/UDP 직접 처리 (DB, 메시징, 게임 서버)
  • 극저지연이 중요 (실시간 트레이딩)
  • PrivateLink로 서비스 노출
  • 초대량 동시 연결 처리

ALB를 써야 하는 경우#

  • Host/Path 기반 라우팅 (MSA 여러 서비스)
  • CloudFront + WAF 보안 체인
  • HTTP 리다이렉트/고정 응답
  • gRPC 라우팅 (Istio 앞단)
  • Cognito 인증 연동

실무 경험#

PlayBall 프로젝트에서 처음에 NLB를 고려했다. 티켓 오픈 시점의 대량 트래픽에 NLB의 L4 성능이 유리하다고 판단했기 때문이다.

하지만 CloudFront를 앞단에 놓으면서 NLB → ALB로 전환했다:

  1. CloudFront origin 연동: ALB는 DNS로 바로 연결, NLB는 제약
  2. Security Group: ALB SG에 CloudFront Prefix List 적용하여 직접 접근 차단
  3. AWS WAF 연동: ALB에만 WAF 직접 연결 가능
  4. Host 기반 라우팅: 여러 서비스(API, Grafana, ArgoCD)를 하나의 ALB에서 분기

ALB의 ~1ms 지연은 CloudFront 캐싱과 Istio 내부 라우팅이 있기 때문에 체감 차이가 없었다.