S3에는 버킷별로 CORS 설정할 수 있네요.

웹폰트를 쓰기 위해선

<!– Sample policy –>
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>http://YOURWEBSITE.COM</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

 

이렇게 설정해요.

 

CORS(Cross-Origin Resource Sharing)

CORS(Cross-origin 리소스 공유)는 한 도메인에서 로드되어 다른 도메인에 있는 리소스와 상호 작용하는 클라이언트 웹 애플리케이션에 대한 방법을 정의합니다. Amazon S3의 CORS 지원을 통해 Amazon S3으로 다양한 기능의 클라이언트 측 웹 애플리케이션을 구축하고, Amazon S3 리소스에 대한 cross-origin 액세스를 선택적으로 허용할 수 있습니다.

이 단원에서는 CORS 개요를 다룹니다. 하위 단원에서는 Amazon S3 콘솔을 사용하여 CORS를 활성화하거나, 프로그래밍 방식으로 Amazon S3 REST API 및 AWS SDK를 사용하는 방법을 설명합니다.

Cross-Origin 리소스 공유(CORS): 사용 사례 시나리오

다음은 CORS 사용에 대한 예제 시나리오입니다.

  • 시나리오 1: Amazon S3 정적 웹 사이트 호스팅에서 설명한 대로 website라는 이름의 Amazon S3 버킷에서 웹 사이트를 호스팅한다고 가정해 보겠습니다. 사용자는 웹 사이트 엔드포인트 http://website.s3-website-us-east-1.amazonaws.com를 로드합니다. 이제 이 버킷에 저장된 웹 페이지의 JavaScript를 사용하여, website.s3.amazonaws.com 버킷에 대한 Amazon S3의 API 엔드포인트를 사용하여 같은 버킷에 대해 GET 및 PUT 요청 인증을 가능하게 하려고 합니다. 일반적으로 브라우저에서 이러한 요청을 허용하지 못하도록 JavaScript를 차단하지만, CORS를 사용하여 website.s3-website-us-east-1.amazonaws.com으로부터의 cross-origin 요청을 활성화하도록 버킷을 구성할 수 있습니다.
  • 시나리오 2: S3 버킷에서 웹 글꼴을 호스팅하려는 경우를 예로 들어 보겠습니다. 브라우저는 웹 글꼴을 불러오기 위해 CORS 검사(preflight check)가 필요하므로 이 웹 글꼴을 호스팅하는 버킷이 이러한 요청을 하는 오리진을 허용하도록 구성합니다.

내 버킷에서 CORS를 구성하려면 어떻게 해야 합니까?

버킷을 구성하여 cross-origin 요청을 허용하려면 CORS 구성, 즉 버킷에 대한 액세스를 허용할 오리진과 각 오리진에 대해 지원할 작업(HTTP 메서드)을 식별하는 규칙과 기타 작업별 정보를 포함하는 XML 문서를 만듭니다.

구성당 최대 100개의 규칙을 추가할 수 있습니다. 이 XML 문서는 cors 하위 리소스로 버킷에 추가합니다 프로그래밍 방식 또는 Amazon S3 콘솔 사용. 자세한 내용은 Cross-Origin 리소스 공유(CORS) 활성화 단원을 참조하십시오.

Amazon S3 웹 사이트 엔드포인트를 사용하여 웹 사이트에 액세스하는 대신, example1.com과 같은 자체 도메인을 사용하여 콘텐츠를 제공할 수 있습니다. 자체 도메인 사용에 대한 자세한 내용은 예: 사용자 지정 도메인으로 정적 웹 사이트 설정 단원을 참조하십시오. 다음 예시 cors 구성에는 CORSRule 요소로 지정된 규칙이 3개 있습니다.

  • 첫 번째 규칙은 https://www.example1.com 오리진에서 cross-origin PUT, POST, DELETE 요청을 허용합니다. 이 규칙은 또한 Access-Control-Request-Headers 헤더를 통해 preflight OPTIONS 요청의 모든 헤더를 허용합니다. Amazon S3는 preflight OPTIONS 요청에 대한 응답으로 요청된 헤더를 반환합니다.
  • 두 번째 규칙은 첫 번째 규칙과 같이 cross-origin 요청을 허용하지만 다른 오리진인 https://www.example2.com에 적용됩니다.
  • 세 번째 규칙은 모든 오리진에서 cross-origin GET 요청을 허용합니다. ‘*’ 와일드카드 문자는 모든 오리진을 나타냅니다.
<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>http://www.example1.com</AllowedOrigin>

   <AllowedMethod>PUT</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>DELETE</AllowedMethod>

   <AllowedHeader>*</AllowedHeader>
 </CORSRule>
 <CORSRule>
   <AllowedOrigin>http://www.example2.com</AllowedOrigin>

   <AllowedMethod>PUT</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>DELETE</AllowedMethod>

   <AllowedHeader>*</AllowedHeader>
 </CORSRule>
 <CORSRule>
   <AllowedOrigin>*</AllowedOrigin>
   <AllowedMethod>GET</AllowedMethod>
 </CORSRule>
</CORSConfiguration>

CORS 구성은 다음에서 볼 수 있듯이 선택적인 구성 파라미터도 허용합니다. 이 예제에서 다음 CORS 구성은 http://www.example.com 오리진에서 cross-origin PUT, POST 및 DELETE 요청을 허용합니다.

<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>http://www.example.com</AllowedOrigin>
   <AllowedMethod>PUT</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>DELETE</AllowedMethod>
   <AllowedHeader>*</AllowedHeader>
  <MaxAgeSeconds>3000</MaxAgeSeconds>
  <ExposeHeader>x-amz-server-side-encryption</ExposeHeader>
  <ExposeHeader>x-amz-request-id</ExposeHeader>
  <ExposeHeader>x-amz-id-2</ExposeHeader>
 </CORSRule>
</CORSConfiguration>

이전 구성에서 CORSRule 요소는 다음의 선택적 요소를 포함합니다.

  • MaxAgeSeconds – 브라우저가 지정된 리소스에 대한 Amazon S3 preflight OPTIONS 요청을 캐시하는 최소 시간을 초 단위(이 예에서는 3000)로 지정합니다. 원래 요청이 반복될 경우, 브라우저는 이 응답을 캐시함으로써 Amazon S3에 preflight 요청을 보낼 필요가 없습니다.
  • ExposeHeader – 고객이 자체 애플리케이션(예: JavaScript XMLHttpRequest 객체)에서 액세스할 수 있는 응답 헤더(이 예에서는 x-amz-server-side-encryptionx-amz-request-idx-amz-id-2)를 식별합니다.

AllowedMethod 요소

CORS 구성에서 AllowedMethod 요소에 대한 다음 값을 지정할 수 있습니다.

  • GET
  • PUT
  • POST
  • DELETE
  • HEAD

AllowedOrigin 요소

AllowedOrigin에 교차 도메인 요청을 허용하려는 오리진을 지정합니다(예: http://www.example.com). 오리진 문자열에는 최대 한 개의 * 와일드 문자를 포함할 수 있습니다(예: http://*.example.com). *를 모든 오리진이 교차 오리진 요청을 보낼 수 있는 오리진으로 지정할 수도 있습니다. 또한 https를 지정하여 안전한 오리진만 허용할 수도 있습니다.

AllowedHeader 요소

AllowedHeader 요소는 Access-Control-Request-Headers 헤더를 통해 preflight 요청에 허용되는 헤더를 지정합니다. Access-Control-Request-Headers 헤더의 각 헤더 이름은 규칙의 해당 항목과 일치해야 합니다. Amazon S3는 요청된 응답에서 허용된 헤더만을 보냅니다. Amazon S3에 대한 요청에 사용할 수 있는 헤더의 예는 Amazon Simple Storage Service API Reference 가이드의 일반 요청 헤더를 참조하십시오.

규칙의 각 AllowedHeader 문자열에는 최대 한 개의 * 와일드카드 문자를 포함할 수 있습니다. 예를 들어 <AllowedHeader>x-amz-*</AllowedHeader>는 모든 Amazon별 헤더를 허용합니다.

ExposeHeader 요소

각 ExposeHeader 요소는 응답에서 고객이 해당 애플리케이션(예: JavaScript XMLHttpRequest 객체)으로부터 액세스할 수 있도록 하려는 헤더를 식별합니다. 일반적인 Amazon S3 응답 헤더는 Amazon Simple Storage Service API Reference 가이드의 일반 응답 헤더를 참조하십시오.

MaxAgeSeconds 요소

MaxAgeSeconds 요소는 브라우저가 리소스, HTTP 메서드, 오리진으로 식별되는 preflight 요청에 대한 응답을 캐시할 수 있는 시간(초)을 지정합니다.

Amazon S3는 버킷에 대한 CORS 구성을 평가합니까?

Amazon S3는 브라우저에서 preflight 요청을 받으면 버킷에 대한 CORS 구성을 평가하여, 수신된 브라우저 요청과 일치하는 첫 번째 CORSRule 규칙을 사용하여 cross-origin 요청을 허용합니다. 규칙이 일치하려면 다음 조건이 충족되어야 합니다.

  • 요청의 Origin 헤더가 AllowedOrigin 요소와 일치해야 합니다.
  • 요청 메서드(예: GET 또는 PUT) 또는 Access-Control-Request-Method 헤더(preflight OPTIONS 요청의 경우)가 AllowedMethod 요소 중 하나와 일치해야 합니다.
  • preflight 요청의 Access-Control-Request-Headers 헤더에 나열된 모든 헤더가 AllowedHeader 요소와 일치해야 합니다.

참고

버킷에 대해 CORS를 허용하면 ACL과 정책이 계속 적용됩니다.