Skip to main content

CloudFront

  • 콘텐츠 전송 네트워크 서비스 (CDN, Contents Delivery Network)
  • 콘텐츠를 글로벌 사용자에게 더 빨리 배포하도록 지원하는 서비스
  • 전 세계에 배포된 200개 이상의 엣지 로케이션을 이용하여 콘텐츠 전송
  • 엣지 로케이션은 데이터를 임시 저장할 수 있는 캐싱 기능이 있음

리전과 거리가 있는 사용자는 데이터 원본이 저장된 오리진으로 데이터를 가져오는 것이 아니라 주변에 있는 엣지 로케이션을 활용하여 데이터를 전달받는다.

CloudFront 보안 액세스 - Viewer/Origin 프로토콜 정책

AWS-ANS_cloudfront1

오리진 프로토콜의 뷰어 일치는 뷰어 프로토콜이 HTTPS Only일 경우 HTTPS Only 정책을 따른다. 즉, 뷰어 프로토콜 정책을 따라가는 것이 아니고 오리진 프로토콜이 자동으로 HTTP Only로 선택된다.

CloudFront 보안 액세스 - OAI (Origin Access Identity)

AWS-ANS_cloudfront2

OAI(Origin Access Identity)를 통해 S3 버킷(오리진)의 액세스를 클라우드 프론트를 통해서만 오리진에 접근할 수 있게 하는 기능

  • S3 버킷 정책이 퍼블릭으로 되어있어 클라이언트가 버킷의 도메인 이름을 통해 오리진으로 바로 접속할 수 있었다.
  • 리전과 거리가 먼 사용자는 버킷의 도메인 이름으로 오리진으로 접속하여 데이터를 전달받을 경우 CloudFront를 경유하는 것보다 속도가 느리다.
  • 따라서 OAI를 사용하여 OAI라는 아이디 값을 CloudFront에서 클라이언트에게 전달하여 다이렉트로 버킷에 붙을 경우 해당 아이디 값이 존재하지 않으므로 직접 연결을 거부하게 되어 CloudFront를 통해서만 버킷의 오리진에 저장된 콘텐츠를 전달받도록 한다.

CloudFront 보안 액세스

note

Signed URL, Signed Cookies

  • 서명된 URL 또는 쿠키를 이용해서 콘텐츠에 접속하는 기능
  • URL 또는 쿠키에는 콘텐츠 만료기간, 액세스 가능한 IP 주소를 저장할 수 있다.
  • 유료 콘텐츠나 보안을 위해 콘텐츠의 유효/만료 기간을 지정해야 하는 경우 사용
  • 서명된 URL은 1개의 파일에 1개의 서명만 저장 (1개의 파일 접속을 위한 URL)
  • 서명된 쿠키는 하나의 쿠키로 여러 개의 파일 접속 가능

지역 제한 (Geographic Restrictions)

  • 특정 국가에서의 콘텐츠 액세스를 제한하는 기능
  • 법률적인 사항으로 국가별로 저작권이 다른 경우에 사용 가능

AWS WAF (Web Application Firewall)

Application Load Balancer에 대한 액세스 제한

  • Application Load Balancer로 보내는 요청에 사용자 지정 HTTP 헤더(Customer Header)를 추가하도록 CloudFront를 구성
  • 사용자 지정 HTTP 헤더가 포함된 요청만 전달하도록 Application Load Balancer를 구성

비대칭키 암호화 방법을 이용한 필드 레벨 암호화 사용

CloudFront OAI 설정하기

  1. CloudFront -> 보안 -> 원본 액세스 ID 생성 -> 이름 설정
  2. CloudFront -> 배포 -> 원본 -> 편집 -> S3 버킷 액세스: 예, ID로 입력 (OAI), 버킷 정책: 예, 버킷 정책 업데이트 -> 저장 -> S3 버킷 정책 자동 추가
  3. S3 버킷 정책 -> 모든 퍼블릭 액세스 차단

CloudFront -> 배포 -> 원본 -> 편집에서 원본 도메인을 S3 버킷 객체에서 로드 밸런서로 변경할 경우 오리진 프로토콜을 설정하는 화면이 나오는데 이는 S3 버킷이 원본 도메인일 경우에 자동으로 오리진 프로토콜이 HTTP Only로 설정되기 때문이다.

특정 국가(IP) 차단하기

CloudFront -> 배포 -> 지리적 제한 탭에서는 허용 목록과 차단 목록에 특정 국가를 선택하여 해당 국가의 IP를 차단할 수도 있다.

Lambda@Edge

  • CloudFront를 통해 전달되는 콘텐츠를 사용자 지정 함수로 실행할 수 있게 해주는 AWS Lambda가 확장된 컴퓨팅 서비스
  • Node.js 또는 Python 함수를 작성한 후 뷰어에게 가까운 전 세계 AWS 위치에서 해당 함수를 실행

다음과 같은 CloudFront 이벤트가 발생할 때 Lambda 함수를 실행

  • CloudFront가 최종 사용자의 요청을 수신할 때 (최종 사용자 요청)
  • CloudFront가 오리진에 요청을 전달하기 전 (오리진 요청)
  • CloudFront가 오리진의 응답을 수신할 때 (오리진 응답)
  • CloudFront가 최종 사용자에게 응답을 반환하기 전 (최종 사용자 응답)

Lambda@Edge 사용 예시

  • A/B 테스트를 위해 사이트의 다양한 버전을 볼 수 있도록 쿠키를 검사하고 URL을 다시 작성
  • User-Agent 헤더를 확인하여 사용중인 디바이스를 기반으로 디바이스의 화면 크기에 따라 다른 이미지를 반환
  • 최종 사용자 요청 또는 오리진 요청 이벤트가 발생할 때 HTTP 응답을 생성
  • 헤더 또는 권한 부여 토큰을 검사하고 CloudFront가 오리진으로 요청을 전달하기 전에 헤더를 삽입하여 콘텐츠에 대한 액세스 권한을 제어
  • 외부 리소스에 대한 네트워크 호출을 생성하여 사용자 자격 증명을 확인하거나 추가 콘텐츠를 가져와 응답을 사용자 지정

AWS User Guide 정리

note

CloudFront

Amazon CloudFront를 사용하면 HTTPS를 통해 오리진 서버에 대한 종단 간 보안 연결을 설정할 수 있습니다. 필드 레벨 암호화는 추가 보안 레이어를 추가하여 시스템 처리 전체에서 특정 데이터를 보호하고 특정 애플리케이션만 이를 볼 수 있도록 합니다.

필드 레벨 암호화가 포함된 HTTPS 요청이 오리진에 전달될 때 요청은 애플리케이션 또는 하위 시스템 전체에 라우팅되고 민감한 데이터는 계속 암호화되어 민감한 데이터의 침해 또는 우발적 데이터 손실의 위험을 줄입니다. 크레딧 번호에 대한 액세스를 필요로 하는 결제 처리 시스템과 같이 업무상 사유에 따라 민감한 데이터에 대한 액세스를 필요로 하는 구성 요소는 적절한 프라이빗 키를 사용하여 해독하고 데이터에 액세스할 수 있습니다.

CloudFront 필드 레벨 암호화는 퍼블릭 키 암호화라고도 하는 비대칭 암호화를 사용합니다. CloudFront에 퍼블릭 키를 입력하면 지정한 모든 민감한 데이터가 자동적으로 암호화됩니다. CloudFront에 입력한 키는 암호화된 값의 해독에 사용할 수 없습니다. 이는 프라이빗 키만이 가능합니다. 필드 레벨 암호화를 사용하면 오리진이 chunked 인코딩을 지원해야 합니다.

필드 레벨 암호화 구성을 캐시 동작에 연결하려면 항상 HTTPS를 사용하고 최종 사용자의 HTTP POST 및 PUT 요청을 수락하도록 배포를 구성해야 합니다. 즉, 다음 조건이 충족되어야 합니다.

  • 캐시 동작의 Viewer Protocol Policy (최종 사용자 프로토콜 정책)을 HTTP에서 HTTPS로 리디렉션 또는 HTTPS Only로 설정해야 합니다. (AWS CloudFormation 또는 CloudFront API에서는 ViewerProtocolPolicy을(를) redirect-to-https 또는 https-only(으)로 설정해야 합니다.)

  • 캐시 동작이 허용되는 HTTP 메서드를 GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE로 설정해야 합니다. (AWS CloudFormation 또는 CloudFront API에서 AllowedMethods를 GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE로 설정해야 합니다. 이러한 값은 임의의 순서로 지정할 수 있습니다.)

  • 오리진 설정의 오리진 프로토콜 정책을 Match Viewer (최종 사용자와 일치) 또는 HTTPS Only로 설정해야 합니다. (AWS CloudFormation 또는 CloudFront API에서는 OriginProtocolPolicy을(를) math-viewer 또는 https-only로 설정해야 합니다.)

프라이빗 콘텐츠

CloudFront를 통해 프라이빗 콘텐츠를 제공하려면 다음과 같이 합니다.

  • 최종 사용자가 서명된 URL 또는 서명된 쿠키를 사용하여 콘텐츠에 액세스하도록 요구합니다.

CloudFront의 오리진 대상 서버에서만 사용할 수 있도록 오리진에 대한 액세스를 제한합니다. 이렇게 하려면 다음 중 하나를 수행합니다.

  • Amazon S3 오리진의 경우 원본 액세스 ID(OAI)를 사용할 수 있습니다.
  • 사용자 지정 오리진이 Amazon VPC 보안 그룹 또는 AWS Firewall Manager에 의해 보호되는 경우 CloudFront 관리형 접두사 목록을 사용하여 CloudFront의 오리진 대상 IP 주소에서만 오리진으로의 인바운드 트래픽을 허용할 수 있습니다.
  • 사용자 지정 HTTP 헤더를 사용하여 CloudFront의 요청에 대해서만 액세스를 제한합니다. 사용자 지정 헤더를 사용하여 Application Load Balancer 오리진에 대한 액세스를 제한할 수 있습니다.
  • 사용자 지정 오리진에 사용자 지정 액세스 제어 로직이 필요한 경우 Lambda@Edge를 사용하여 해당 로직을 구현할 수 있습니다.