[AWS] EC2 직접 접속(HTTP) 차단하고 CloudFront 트래픽만 허용하기
EC2의 Public IP로 직접 접근하는 것을 차단하고, Security Group의 Managed Prefix List를 활용해 CloudFront를 통한 트래픽만 허용하는 방법을 공유합니다
2025년 9월 26일
현재 제 아키텍처는 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) 이동
- AWS 콘솔에서 EC2 서비스로 이동합니다.
- 왼쪽 메뉴에서 **[보안 그룹 (Security Groups)]**을 클릭합니다.
- 현재 운영 중인 EC2 인스턴스에 적용된 보안 그룹을 선택합니다.
- 하단의 [인바운드 규칙 (Inbound rules)] 탭을 누르고 **[인바운드 규칙 편집 (Edit inbound rules)]**을 클릭합니다.
2단계: 기존 규칙 삭제 및 Prefix List 추가
기존에는 아마 80번 포트가 0.0.0.0/0 (전 세계 모든 IP 허용)으로 열려 있었을 겁니다. 이 부분을 수정합니다.
- 기존 규칙 삭제: 포트 80에 대해
0.0.0.0/0으로 설정된 규칙이 있다면 삭제하거나 수정합니다. (이게 남아있으면 제한하는 의미가 없습니다.) - 규칙 추가:
- 유형 (Type): HTTP
- 프로토콜 (Protocol): TCP
- 포트 범위 (Port range): 80
- 소스 (Source): 사용자 지정(Custom)을 선택한 뒤, 검색창에 **
cloudfront**라고 입력합니다.
- Prefix List 선택:
- 검색 결과에
com.amazonaws.global.cloudfront.origin-facing같은 이름의 리스트가 뜹니다. - 이것을 선택하면 소스 칸에
pl-xxxxxxx형태의 ID가 입력됩니다.
- 검색 결과에
- [규칙 저장 (Save rules)] 클릭.
참고:
com.amazonaws.global.cloudfront.origin-facing은 CloudFront가 오리진 서버로 요청을 보낼 때 사용하는 IP 대역들을 포함하고 있습니다.
3단계: 적용 결과 확인
설정을 마치고 나면 두 가지 테스트를 통해 검증할 수 있습니다.
- EC2 Public IP로 직접 접속 시도:
- 브라우저 주소창에
http://13.x.x.x(EC2 public IP)를 입력합니다. - 결과: 무한 로딩이 걸리다가 **"사이트에 연결할 수 없음
- 브라우저 주소창에
- cloudfront 주소로 접속 시도
- 정상작동 확인
마무리
기존 ec2의 퍼블릭 IP로 아무나 HTTP로 접근이 가능하여 보안이 신경쓰였지만 cloudfront의 요청 ip만 허용할 수 있어 처리 후 개선하였습니다.