[AWS] EC2 직접 접속(HTTP) 차단하고 CloudFront 트래픽만 허용하기

EC2의 Public IP로 직접 접근하는 것을 차단하고, Security Group의 Managed Prefix List를 활용해 CloudFront를 통한 트래픽만 허용하는 방법을 공유합니다

2025년 9월 26일


aws browser pipe

현재 제 아키텍처는 CloudFront를 앞단에 두고, 오리진 서버인 EC2와는 HTTP(80) 포트로 통신하고 있습니다. EC2 내부에서는 Nginx가 리버스 프록시로 3000번 포트의 Next.js 서버와 연결해주는 구조입니다.

그런데 한 가지 보안 취약점이 있었습니다. 도메인(CloudFront)을 거치지 않고, EC2의 Public IP로 직접 요청을 보내도 접속이 된다는 점입니다. 이렇게 되면 CloudFront의 캐싱이나 WAF 설정을 우회할 수 있어 보안상 좋지 않습니다.

이를 해결하기 위해 AWS Security Group(보안 그룹) 설정을 변경하여, "오직 CloudFront를 거친 요청만 EC2에 들어올 수 있도록" 제한하기로 했습니다.


해결 방법: AWS Managed Prefix List 활용

AWS는 CloudFront의 전 세계 IP 대역을 묶어서 관리해주는 Managed Prefix List(관리형 접두사 목록) 를 제공합니다. 우리가 IP 대역을 일일이 알 필요 없이, 보안 그룹에서 이 리스트만 선택해주면 됩니다.

1단계: EC2 보안 그룹(Security Group) 이동

  1. AWS 콘솔에서 EC2 서비스로 이동합니다.
  2. 왼쪽 메뉴에서 **[보안 그룹 (Security Groups)]**을 클릭합니다.
  3. 현재 운영 중인 EC2 인스턴스에 적용된 보안 그룹을 선택합니다.
  4. 하단의 [인바운드 규칙 (Inbound rules)] 탭을 누르고 **[인바운드 규칙 편집 (Edit inbound rules)]**을 클릭합니다.

2단계: 기존 규칙 삭제 및 Prefix List 추가

기존에는 아마 80번 포트가 0.0.0.0/0 (전 세계 모든 IP 허용)으로 열려 있었을 겁니다. 이 부분을 수정합니다.

  1. 기존 규칙 삭제: 포트 80에 대해 0.0.0.0/0으로 설정된 규칙이 있다면 삭제하거나 수정합니다. (이게 남아있으면 제한하는 의미가 없습니다.)
  2. 규칙 추가:
    • 유형 (Type): HTTP
    • 프로토콜 (Protocol): TCP
    • 포트 범위 (Port range): 80
    • 소스 (Source): 사용자 지정(Custom)을 선택한 뒤, 검색창에 **cloudfront**라고 입력합니다.
  3. Prefix List 선택:
    • 검색 결과에 com.amazonaws.global.cloudfront.origin-facing 같은 이름의 리스트가 뜹니다.
    • 이것을 선택하면 소스 칸에 pl-xxxxxxx 형태의 ID가 입력됩니다.
  4. [규칙 저장 (Save rules)] 클릭.

참고: com.amazonaws.global.cloudfront.origin-facing은 CloudFront가 오리진 서버로 요청을 보낼 때 사용하는 IP 대역들을 포함하고 있습니다.


3단계: 적용 결과 확인

설정을 마치고 나면 두 가지 테스트를 통해 검증할 수 있습니다.

  1. EC2 Public IP로 직접 접속 시도:
    • 브라우저 주소창에 http://13.x.x.x (EC2 public IP)를 입력합니다.
    • 결과: 무한 로딩이 걸리다가 **"사이트에 연결할 수 없음
  2. cloudfront 주소로 접속 시도
    • 정상작동 확인

마무리

기존 ec2의 퍼블릭 IP로 아무나 HTTP로 접근이 가능하여 보안이 신경쓰였지만 cloudfront의 요청 ip만 허용할 수 있어 처리 후 개선하였습니다.