편집

다음을 통해 공유


CDN 지침

Azure Storage
Azure Blob Storage

CDN(콘텐츠 배달 네트워크)은 사용자에게 웹 콘텐츠를 효율적으로 제공할 수 있는 서버의 분산 네트워크입니다. CDN은 최종 사용자에게 가까운 Edge 서버에 캐시된 콘텐츠를 저장하여 대기 시간을 최소화합니다.

CDN은 일반적으로 이미지, 스타일 시트, 문서, 클라이언트쪽 스크립트 및 HTML 페이지와 같은 정적 콘텐츠를 제공하기 위해 사용됩니다. CDN을 사용하는 주요 이점은 대기 시간이 짧고 애플리케이션이 호스팅되는 데이터 센터와 관련하여 지리적 위치에 관계 없이 사용자에게 콘텐츠를 빠르게 제공할 수 있다는 점입니다. 또한 CDN을 사용하면 웹 애플리케이션이 CDN에 호스트되는 콘텐츠에 대한 요청을 처리할 필요가 없으므로 애플리케이션에 대한 부하를 줄이는 데 도움이 될 수 있습니다.

CDN 다이어그램

Azure 에서 Azure Content Delivery Network 는 Azure 또는 다른 위치에서 호스트되는 높은 대역폭 콘텐츠를 제공하기 위한 글로벌 CDN 솔루션입니다. Azure Content Delivery Network를 사용하여 Azure Blob Storage, 웹 애플리케이션, 가상 머신, 공개적으로 액세스할 수 있는 모든 웹 서버에서 로드된 공개적으로 사용 가능한 개체를 캐시할 수 있습니다.

이 항목에서는 CDN을 사용할 때 몇 가지 일반적인 모범 사례 및 고려 사항에 대해 설명합니다. 자세한 내용은 Azure CDN을 참조하세요.

CDN을 사용하는 방법 및 이유

CDN의 일반적인 용도는 다음과 같습니다.

  • 웹 사이트에서 종종 클라이언트 애플리케이션에 대한 정적 리소스를 제공합니다. 이러한 리소스는 이미지, 스타일시트, 문서, 파일, 클라이언트 쪽 스크립트, HTML 페이지, HTML 조각 또는 서버가 각 요청에 대해 수정할 필요가 없는 기타 콘텐츠일 수 있습니다. 애플리케이션은 런타임에 항목을 만들고 CDN에서 사용할 수 있도록 할 수 있지만(예: 현재 뉴스 헤드라인 목록을 만들어) 각 요청에 대해서는 그렇지 않습니다.

  • 휴대폰 및 태블릿 컴퓨터와 같은 디바이스에 공용 정적 및 공유 콘텐츠 제공 애플리케이션 자체는 다양한 디바이스에서 실행되는 클라이언트에 API를 제공하는 웹 서비스입니다. 또한 클라이언트가 CDN 클라이언트 UI를 생성하는 데 사용할 정적 데이터 세트를 (웹 서비스를 통해) 제공할 수 있습니다. 예를 들어 CDN을 사용하여 JSON 또는 XML 문서를 배포할 수 있습니다.

  • 전용 컴퓨팅 리소스를 요구하지 않고 퍼블릭 정적 콘텐츠로만 구성된 전체 웹 사이트를 클라이언트에 제공합니다.

  • 주문형으로 클라이언트에 비디오 파일을 스트리밍합니다. 비디오는 CDN 연결을 제공하는 전역적으로 위치한 데이터 센터에서 사용할 수 있는 짧은 대기 시간과 안정적인 연결의 이점을 활용합니다. Microsoft Azure Media Services는 Azure Content Delivery Network와 통합하여 추가 배포를 위해 CDN에 직접 콘텐츠를 제공합니다. 자세한 내용은 스트리밍 엔드포인트 개요를 참조하세요.

  • 일반적으로 사용자, 특히 애플리케이션을 호스팅하는 데이터 센터에서 멀리 떨어진 사용자의 환경을 개선합니다. 이러한 사용자는 대기 시간이 길어지는 문제가 생길 수 있습니다. 웹 애플리케이션에 있는 콘텐츠의 총 크기에서 상당 부분이 정적으로, 여러 데이터 센터에 애플리케이션을 배포하기 위한 요구 사항을 제거하면서 성능 및 전반적인 사용자 환경을 유지 관리하는 데 CDN 사용이 도움이 됩니다. Azure Content Delivery Network 노드 위치 목록은 Azure CDN POP 위치를 참조 하세요.

  • IoT(사물 인터넷) 솔루션 지원 IoT 솔루션과 관련된 수많은 디바이스 및 어플라이언스는 각 디바이스에 직접 펌웨어 업데이트를 배포해야 하는 경우 애플리케이션을 쉽게 압도할 수 있습니다.

  • 애플리케이션 크기를 조정할 필요 없이 필요 시 최대치 및 급격한 증가에 대처하여 그에 따른 실행 비용의 증가를 방지합니다. 예를 들어 특정 라우터 모델과 같은 하드웨어 디바이스 또는 스마트 TV와 같은 소비자 디바이스에 대한 운영 체제 업데이트가 릴리스되면 짧은 기간 동안 수백만 명의 사용자 및 디바이스에서 다운로드되므로 수요가 크게 증가합니다.

과제

CDN 사용을 계획할 때 고려해야 할 몇 가지 과제가 있습니다.

  • 배포: CDN이 콘텐츠를 가져오는 원본과 둘 이상의 스토리지 시스템에 콘텐츠를 배포해야 하는지 여부를 결정합니다. 정적 콘텐츠 및 리소스의 배포 프로세스를 고려해야 합니다. 예를 들어 Azure Blob Storage에 콘텐츠를 로드하는 별도의 단계를 구현해야 할 수 있습니다.

  • 버전 관리 및 캐시 제어. 정적 콘텐츠를 업데이트하고 새 버전을 배포하는 방법을 고려합니다. CDN이 캐싱 및 TTL(Time to Live)을 수행하는 방법을 이해합니다. Azure Content Delivery Network의 경우 캐싱 작동 방식을 참조 하세요.

  • 테스트. 로컬로 또는 스테이징 환경에서 애플리케이션을 개발하고 테스트를 수행할 때 CDN 설정의 로컬 테스트를 수행하는 것은 어려울 수 있습니다.

  • 검색 엔진 최적화(SEO). 이미지 및 문서와 같은 콘텐츠는 CDN을 사용할 때 다른 도메인에서 제공됩니다. 이 콘텐츠에 대한 SEO에 영향을 미칠 수 있습니다.

  • 콘텐츠 보안. 모든 CDN이 콘텐츠에 대한 액세스 제어 형식을 제공하는 것은 아닙니다. Azure Content Delivery Network를 비롯한 일부 CDN 서비스는 CDN 콘텐츠를 보호하기 위한 토큰 기반 인증을 지원합니다. 자세한 내용은 토큰 인증을 사용하여 Azure Content Delivery Network 자산 보안을 참조하세요.

  • 클라이언트 보안. 클라이언트가 CDN의 리소스에 대한 액세스를 허용하지 않는 환경에서 연결될 수 있습니다. 알려진 원본 집합만 액세스하도록 제한되거나, 페이지 원본 이외의 위치에서는 리소스를 로드할 수 없는 제한된 보안 환경일 수 있습니다. 이러한 경우를 처리하려면 대체 구현이 필요합니다.

  • 복원력. CDN은 애플리케이션에 대한 단일 오류 지점이 될 수 있습니다.

다음과 같은 시나리오에서는 CDN이 그다지 유용하지 않을 수 있습니다.

  • 콘텐츠의 적중률이 낮은 경우 유효한 동안 몇 번만 액세스할 수 있습니다(TL(Time to Live) 설정에 따라 결정됨).

  • 데이터가 대기업 또는 공급망 에코시스템과 같은 프라이빗인 경우.

일반 지침 및 모범 사례

CDN 사용은 애플리케이션에 대한 부하를 최소화하고 가용성과 성능을 극대화하는 좋은 방법입니다. 애플리케이션에서 사용하는 모든 적절한 콘텐츠 및 리소스에 대해 이 전략을 채택하는 것이 좋습니다. CDN을 사용하는 전략을 설계할 때 다음 섹션에 있는 요소를 고려합니다.

배포

정적 콘텐츠는 애플리케이션 배포 패키지 또는 프로세스에 포함하지 않는 경우 애플리케이션과 독립적으로 프로비전 및 배포해야 할 수 있습니다. 애플리케이션 구성 요소와 정적 리소스 콘텐츠를 모두 관리하는 데 사용하는 버전 관리 방법에 어떤 영향을 미치는지 고려합니다.

번들링 및 축소 기술을 사용하여 클라이언트의 로드 시간을 줄이는 것이 좋습니다. 묶음은 여러 파일을 단일 파일로 결합합니다. 축소는 기능은 변경하지 않으면서 스크립트 및 CSS 파일에서 불필요한 문자를 제거합니다.

콘텐츠를 추가 위치에 배포해야 하는 경우 배포 프로세스의 추가 단계가 됩니다. 애플리케이션이 CDN에 대한 콘텐츠를 정기적으로 또는 이벤트에 대한 응답으로 업데이트하는 경우 업데이트된 콘텐츠를 CDN의 엔드포인트뿐만 아니라 추가 위치에 저장해야 합니다.

일부 정적 콘텐츠가 CDN에서 제공될 것으로 예상되는 경우 로컬 개발 및 테스트를 처리하는 방법을 고려합니다. 예를 들어, 빌드 스크립트의 일부로 CDN에 콘텐츠를 미리 배포할 수 있습니다. 또는 컴파일 지시문 또는 플래그를 사용하여 애플리케이션이 리소스를 로드하는 방법을 제어합니다. 예를 들어, 디버그 모드에서 애플리케이션은 로컬 폴더에서 정적 리소스를 로드할 수 있습니다. 릴리스 모드에서 애플리케이션은 CDN을 사용합니다.

gzip(GNU zip)과 같은 파일 압축 옵션을 고려합니다. 호스트하는 웹 애플리케이션이 원본 서버에서 또는 CDN이 Edge 서버에서 직접 압축을 수행할 수 있습니다. 자세한 내용은 Azure CDN에서 파일을 압축하여 성능 향상을 참조하세요.

라우팅 및 버전 관리

다양한 시간에 여러 CDN 인스턴스를 사용해야 합니다. 예를 들어 새 버전의 애플리케이션을 배포할 때 새 CDN을 사용하고 이전 버전에 대한 이전 CDN(이전 형식의 콘텐츠 보유)을 유지할 수 있습니다. Azure Blob Storage를 콘텐츠 원본으로 사용하는 경우 별도의 스토리지 계정 또는 별도의 컨테이너를 만들고 CDN 엔드포인트를 가리킬 수 있습니다.

Azure Blob Storage에서 콘텐츠를 검색할 때 쿼리 문자열은 리소스 이름(Blob 이름)의 일부이므로 쿼리 문자열을 사용하여 CDN의 리소스에 대한 링크에서 애플리케이션의 다른 버전을 나타내지 마세요. 이 방법은 클라이언트가 리소스를 캐시하는 방법에도 영향을 줄 수 있습니다.

CDN에 이전 리소스가 캐시된 경우에는 애플리케이션을 업데이트할 때 정적 콘텐츠의 새 버전을 배포하는 것이 어려울 수 있습니다. 자세한 내용은 아래의 캐시 제어 섹션을 참조하세요.

국가/지역별로 CDN 콘텐츠 액세스를 제한하는 것이 좋습니다. Azure Content Delivery Network를 사용하면 국가 또는 원본 지역에 따라 요청을 필터링하고 배달된 콘텐츠를 제한할 수 있습니다. 자세한 내용은 국가/지역별로 콘텐츠 액세스 제한을 참조하세요.

캐시 컨트롤

시스템 내에서 캐싱을 관리하는 방법을 고려합니다. 예를 들어 Azure Content Delivery Network에서 전역 캐싱 규칙을 설정한 다음 특정 원본 엔드포인트에 대한 사용자 지정 캐싱을 설정할 수 있습니다. 원본의 캐시 지시문 헤더를 전송하여 CDN에서 캐싱이 수행되는 방식을 제어할 수도 있습니다.

자세한 내용은 캐싱 작동 방식을 참조하세요.

개체를 CDN에서 사용할 수 없도록 하려면 원본에서 삭제하거나 CDN 엔드포인트를 제거 또는 삭제하거나, Blob Storage인 경우 컨테이너 또는 Blob를 프라이빗으로 만들 수 있습니다. 그러나 라이브 시간이 만료될 때까지 항목은 CDN에서 제거되지 않습니다. CDN 엔드포인트를 수동으로 제거할 수도 있습니다.

보안

CDN은 CDN에서 제공하는 인증서를 사용하여 HTTPS(SSL)를 통해서 뿐만 아니라 HTTP를 통해서도 콘텐츠를 배달할 수 있습니다. 혼합 콘텐츠에 대한 브라우저 경고를 방지하려면 HTTPS를 사용하여 HTTPS를 통해 로드된 페이지에 표시되는 정적 콘텐츠를 요청해야 할 수 있습니다.

CDN을 사용하여 글꼴 파일 같은 정적 자산을 배달하는 경우 XMLHttpRequest 호출을 사용하여 다른 도메인에서 이러한 리소스를 요청할 때 동일 원본 정책 문제가 발생할 수 있습니다. 웹 서버가 적절한 응답 헤더를 설정하도록 구성되지 않는 한 많은 웹 브라우저에서 CORS(원본 간 리소스 공유)를 방지합니다. 다음 방법 중 하나를 사용하여 CORS를 지원하도록 CDN을 구성할 수 있습니다.

  • 응답에 CORS 헤더를 추가하도록 CDN을 구성합니다. 자세한 내용은 CORS에서 Azure CDN 사용을 참조하세요.

  • 원본이 Azure Blob Storage인 경우 스토리지 엔드포인트에 CORS 규칙을 추가합니다. 자세한 내용은 Azure Storage 서비스에 대한 CORS(원본 간 리소스 공유) 지원을 참조 하세요.

  • CORS 헤더를 설정하도록 애플리케이션을 구성합니다. 예를 들어 ASP.NET Core 설명서에서 CORS(원본 간 요청) 사용을 참조하세요.

CDN 대체

애플리케이션이 CDN의 실패 또는 임시 사용 불가에 어떻게 대처하는지 고려합니다. 클라이언트 애플리케이션은 이전 요청 중에 로컬로 캐시(클라이언트에)된 리소스의 복사본을 사용하거나, CDN을 사용할 수 없는 경우 오류를 감지하고 대신 원본(리소스가 있는 애플리케이션 폴더 또는 Azure Blob 컨테이너)의 리소스를 요청하는 코드를 포함할 수 있습니다.