CORS 문제 해결 - Amazon Simple Storage Service

CORS 문제 해결

다음 주제는 S3와 관련된 몇 가지 일반적인 CORS 문제를 해결하는 데 도움이 될 수 있습니다.

403 Forbidden 오류: 이 버킷에 대해 CORS가 활성화되지 않음

교차 오리진 요청이 Amazon S3로 전송되었지만 CORS가 S3 버킷에 구성되지 않은 경우 다음 403 Forbidden 오류가 발생합니다.

오류: HTTP/1.1 403 Forbidden CORS Response: CORS is not enabled for this bucket.

CORS 구성은 버킷에 액세스할 수 있도록 허용할 오리진, 각 오리진에 대해 지원되는 작업(HTTP 메서드) 및 기타 작업별 정보를 식별하는 규칙이 포함된 문서 또는 정책입니다. Amazon S3 콘솔, AWS SDK 및 REST API를 사용하여 S3에 CORS를 구성하는 방법을 알아보세요. CORS에 대한 자세한 내용과 CORS 구성의 예는 CORS의 요소를 참조하세요.

403 Forbidden 오류: 이 CORS 요청은 허용되지 않음

CORS 구성의 CORS 규칙이 요청의 데이터와 일치하지 않는 경우 다음 403 Forbidden 오류가 발생합니다.

오류: HTTP/1.1 403 Forbidden CORS Response: This CORS request is not allowed.

따라서 다음과 같은 여러 가지 이유로 이 403 Forbidden 오류가 발생할 수 있습니다.

  • 오리진이 허용되지 않습니다.

  • 메서드가 허용되지 않습니다.

  • 요청된 헤더가 허용되지 않습니다.

Amazon S3가 받은 각 요청에 대해 해당 요청의 데이터와 일치하는 CORS 규칙이 CORS 구성에 있어야 합니다.

오리진이 허용되지 않음

버킷에 대한 CORS 요청의 Origin 헤더는 CORS 구성의 AllowedOrigins 요소에 있는 오리진과 일치해야 합니다. AllowedOrigins 요소의 와일드카드 문자("*")는 모든 HTTP 메서드와 일치합니다. AllowedOrigins 요소를 업데이트하는 방법에 대한 자세한 내용은 교차 오리진 리소스 공유(CORS) 구성을 참조하세요.

예를 들어 AllowedOrigins 요소에 http://www.example1.com 도메인만 포함된 경우 http://www.example2.com 도메인에서 보낸 CORS 요청에서 403 Forbidden 오류가 발생합니다.

다음 예시에서는 AllowedOrigins 요소에 http://www.example1.com 도메인이 포함된 CORS 구성의 일부를 보여줍니다.

"AllowedOrigins":[ "http://www.example1.com" ]

http://www.example2.com 도메인에서 보낸 CORS 요청이 성공하려면 해당 http://www.example2.com 도메인이 CORS 구성의 AllowedOrigins 요소에 포함되어야 합니다.

"AllowedOrigins":[ "http://www.example1.com" "http://www.example2.com" ]

메서드가 허용되지 않음

버킷에 대한 CORS 요청의 Access-Control-Request-Method에 지정된 HTTP 메서드는 CORS 구성의 AllowedMethods 요소에 나열된 메서드와 일치해야 합니다. AllowedMethods의 와일드카드 문자("*")는 모든 HTTP 메서드와 일치합니다. AllowedOrigins 요소를 업데이트하는 방법에 대한 자세한 내용은 교차 오리진 리소스 공유(CORS) 구성을 참조하세요.

CORS 구성에서 AllowedMethods 요소에 다음 메서드를 지정할 수 있습니다.

  • GET

  • PUT

  • POST

  • DELETE

  • HEAD

다음 예시에서는 AllowedMethods 요소에 GET 메서드가 포함된 CORS 구성의 일부를 보여줍니다. GET 메서드를 포함한 요청만 성공합니다.

"AllowedMethods":[ "GET" ]

HTTP 메서드(예:PUT)가 CORS 요청에 사용되었거나 버킷에 대한 사전 CORS 요청에 포함되었으나 해당 메서드가 CORS 구성에 없는 경우 요청에서 403 Forbidden 오류가 발생합니다. 이 CORS 요청 또는 CORS 사전 요청을 허용하려면 PUT 메서드를 CORS 구성에 추가해야 합니다.

"AllowedMethods":[ "GET" "PUT" ]

요청된 헤더가 허용되지 않음

사전 요청의 Access-Control-Request-Headers 헤더에 나열된 헤더는 CORS 구성의 AllowedHeaders 요소에 있는 헤더와 일치해야 합니다. Amazon S3에 대한 요청에 사용할 수 있는 공통 헤더 목록은 공통 요청 헤더를 참조하세요. AllowedHeaders 요소를 업데이트하는 방법에 대한 자세한 내용은 교차 오리진 리소스 공유(CORS) 구성을 참조하세요.

다음 예시에서는 AllowedHeaders 요소에 Authorization 헤더가 포함된 CORS 구성의 일부를 보여줍니다. Authorization 헤더에 대한 요청만 성공합니다.

"AllowedHeaders": [ "Authorization" ]

헤더(예: Content-MD5)가 CORS 요청에 포함되었지만 해당 헤더가 CORS 구성에 없는 경우 요청에서 403 Forbidden 오류가 발생합니다. 이 CORS 요청을 허용하려면 Content-MD5 헤더를 CORS 구성에 추가해야 합니다. CORS 요청의 Authorization 헤더와 Content-MD5 헤더를 모두 버킷으로 전달하려면 두 헤더가 모두 CORS 구성의 AllowedHeaders 요소에 포함되어 있는지 확인합니다.

"AllowedHeaders": [ "Authorization" "Content-MD5" ]

CORS 응답에서 헤더를 찾을 수 없음

CORS 구성의 ExposeHeaders 요소는 CORS 요청에 대한 응답으로 브라우저에서 실행되는 스크립트와 애플리케이션이 액세스할 수 있도록 설정할 응답 헤더를 식별합니다.

S3 버킷에 저장된 객체에 응답 데이터와 함께 사용자 정의 메타데이터(예:x-amz-meta-custom-header)가 있는 경우 이 사용자 지정 헤더에는 클라이언트측 JavaScript 코드에서 액세스할 추가 메타데이터 또는 정보가 포함될 수 있습니다. 하지만 기본적으로 브라우저는 보안상의 이유로 사용자 지정 헤더에 대한 액세스를 차단합니다. 클라이언트측 JavaScript가 사용자 지정 헤더에 액세스할 수 있도록 하려면 CORS 구성에 해당 헤더를 포함해야 합니다.

아래 예시에서 x-amz-meta-custom-header1 헤더는 ExposeHeaders 요소에 포함되어 있습니다. x-amz-meta-custom-header2ExposeHeaders 요소에 포함되지 않았으며 CORS 구성에서 누락되었습니다. 응답에서는 ExposeHeaders 요소에 포함된 값만 반환됩니다. 요청에서 Access-Control-Expose-Headers 헤더에 x-amz-meta-custom-header2 헤더가 포함된 경우에도 응답은 여전히 200 OK를 반환합니다. 하지만 허용된 헤더(예: x-amz-meta-custom-header)만 반환되어 응답에 표시됩니다.

"ExposeHeaders": [ "x-amz-meta-custom-header1" ]

모든 헤더가 응답에 표시되도록 하려면 아래와 같이 허용된 모든 헤더를 CORS 구성의 ExposeHeaders 요소에 추가합니다.

"ExposeHeaders": [ "x-amz-meta-custom-header1", "x-amz-meta-custom-header2" ]

S3 프록시 통합의 CORS 관련 고려 사항

오류가 발생하며 이미 S3 버킷의 CORS 구성을 확인했고 교차 오리진 요청이 AWS CloudFront와 같은 프록시로 전송되는 경우 다음 작업을 시도해 봅니다.

  • OPTIONS 메서드에서 HTTP 요청을 허용하도록 설정을 구성합니다.

  • Origin, Access-Control-Request-HeadersAccess-Control-Request-Method 헤더를 전달하도록 프록시를 구성합니다.

일부 프록시는 CORS 요청에 대한 사전 정의된 기능을 제공합니다. 예를 들어 CloudFront에서 오리진이 S3 버킷일 때 CORS 요청을 활성화하는 헤더가 포함된 정책을 구성할 수 있습니다. 자세한 내용은 Amazon CloudFront 개발자 안내서의 정책을 통한 오리진 요청 제어 또는 관리형 오리진 요청 정책 사용을 참조하세요.