

# CORS 문제 해결
<a name="cors-troubleshooting"></a>

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

**Topics**
+ [403 Forbidden 오류 - 이 버킷에 대해 CORS가 활성화되지 않음](#cors-not-enabled)
+ [403 Forbidden 오류 - 이 CORS 요청은 허용되지 않음](#cors-not-enabled)
+ [CORS 응답에서 헤더를 찾을 수 없음](#Headers-not-found)
+ [S3 프록시 통합의 CORS 관련 고려 사항](#cors-in-proxy)

## 403 Forbidden 오류: 이 버킷에 대해 CORS가 활성화되지 않음
<a name="cors-not-enabled"></a>

교차 오리진 요청이 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를 구성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html)하는 방법을 알아보세요. CORS에 대한 자세한 내용과 CORS 구성의 예는 [CORS의 요소](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html#cors-example-1)를 참조하세요.

## 403 Forbidden 오류: 이 CORS 요청은 허용되지 않음
<a name="cors-not-enabled"></a>

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

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

따라서 다음과 같은 여러 가지 이유로 이 `403 Forbidden` 오류가 발생할 수 있습니다.
+ 오리진이 허용되지 않습니다.
+ 메서드가 허용되지 않습니다.
+ 요청된 헤더가 허용되지 않습니다.

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

### 오리진이 허용되지 않음
<a name="Origin-not-allowed"></a>

 버킷에 대한 CORS 요청의 `Origin` 헤더는 CORS 구성의 `AllowedOrigins` 요소에 있는 오리진과 일치해야 합니다. `AllowedOrigins` 요소의 와일드카드 문자(`"*"`)는 모든 HTTP 메서드와 일치합니다. `AllowedOrigins` 요소를 업데이트하는 방법에 대한 자세한 내용은 [교차 오리진 리소스 공유(CORS) 구성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html)을 참조하세요.

 예를 들어 `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"
]
```

### 메서드가 허용되지 않음
<a name="Methods-not-allowed"></a>

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

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"
]
```

### 요청된 헤더가 허용되지 않음
<a name="Headers-not-allowed"></a>

 사전 요청의 `Access-Control-Request-Headers` 헤더에 나열된 헤더는 CORS 구성의 `AllowedHeaders` 요소에 있는 헤더와 일치해야 합니다. Amazon S3에 대한 요청에 사용할 수 있는 공통 헤더 목록은 [공통 요청 헤더](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonRequestHeaders.html)를 참조하세요. `AllowedHeaders` 요소를 업데이트하는 방법에 대한 자세한 내용은 [교차 오리진 리소스 공유(CORS) 구성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html)을 참조하세요.

다음 예시에서는 `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 응답에서 헤더를 찾을 수 없음
<a name="Headers-not-found"></a>

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

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

 아래 예시에서 `x-amz-meta-custom-header1` 헤더는 `ExposeHeaders` 요소에 포함되어 있습니다. `x-amz-meta-custom-header2`는 `ExposeHeaders` 요소에 포함되지 않았으며 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 관련 고려 사항
<a name="cors-in-proxy"></a>

오류가 발생하며 이미 S3 버킷의 CORS 구성을 확인했고 교차 오리진 요청이 AWS CloudFront와 같은 프록시로 전송되는 경우 다음 작업을 시도해 봅니다.
+ `OPTIONS` 메서드에서 HTTP 요청을 허용하도록 설정을 구성합니다.
+ `Origin`, `Access-Control-Request-Headers` 및 `Access-Control-Request-Method` 헤더를 전달하도록 프록시를 구성합니다.
+ 캐시 키에 오리진 헤더를 포함하도록 프록시 설정을 구성합니다. 이는 캐시 키에 오리진 헤더를 포함하지 않는 캐싱 프록시가 다른 오리진에 적절한 CORS 헤더를 포함하지 않는 캐싱된 응답을 제공할 수 있기 때문에 중요합니다.

일부 프록시는 CORS 요청에 대한 사전 정의된 기능을 제공합니다. 예를 들어 CloudFront에서 헤더를 포함하는 정책을 구성할 수 있습니다.

 이러한 헤더는 오리진이 Amazon S3 버킷일 때 Cross-Origin Resource Sharing(CORS) 요청을 활성화하는 헤더입니다.

 이 정책에는 다음 설정이 포함되어 있습니다.
+ 오리진 요청에 포함된 헤더:

   `Origin`

   `Access-Control-Request-Headers`

   `Access-Control-Request-Method`
+ 오리진 요청에 포함된 쿠키: 없음
+ 오리진 요청에 포함된 쿼리 문자열: 없음

자세한 내용은 **Amazon CloudFront 개발자 안내서의 [정책을 통한 오리진 요청 제어](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.htm) 또는 [관리형 오리진 요청 정책 사용](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html#managed-origin-request-policy-cors-s3)을 참조하세요.