

# 미리 준비된 정책을 사용하여 서명된 쿠키 설정
<a name="private-content-setting-signed-cookie-canned-policy"></a>

미리 준비된 정책을 사용하여 서명된 쿠키를 설정하려면 다음 단계를 완료하세요. 서명을 만들려면 [미리 준비된 정책을 사용하는 서명된 쿠키에 대한 서명 생성](#private-content-canned-policy-signature-cookies) 단원을 참조하세요.<a name="private-content-setting-signed-cookie-canned-policy-procedure"></a>

**미리 준비된 정책을 사용하여 서명된 쿠키를 설정하려면**

1. .NET 또는 Java를 사용하여 서명된 쿠키를 생성하는 중인데 키 페어의 프라이빗 키를 기본 .pem 형식에서 .NET 또는 Java와 상환되는 형식으로 다시 포맷하지 않았다면 지금 포맷하세요. 자세한 내용은 [프라이빗 키 재포맷(.NET 및 Java만 해당)](private-content-trusted-signers.md#private-content-reformatting-private-key) 섹션을 참조하세요.

1. 승인된 최종 사용자에게 3개의 `Set-Cookie` 헤더를 보내도록 애플리케이션을 프로그래밍합니다(해시 알고리즘을 지정하려는 경우 4개). 각 `Set-Cookie` 헤더는 이름-값 페어를 하나만 포함할 수 있고 CloudFront 서명된 쿠키에는 이름-값 페어 3개가 필요하기 때문에 `Set-Cookie` 헤더가 3개 있어야 합니다. 이름-값 페어는 `CloudFront-Expires`, `CloudFront-Signature`, `CloudFront-Key-Pair-Id`입니다. 선택적으로 네 번째 이름-값 페어인 `CloudFront-Hash-Algorithm`을 포함하여 서명에 사용되는 해시 알고리즘을 지정할 수 있습니다. 액세스가 제한되는 파일에 대해 사용자가 첫 번째 요청을 하려면 최종 사용자에게 값이 있어야 합니다.
**참고**  
일반적으로 `Expires` 및 `Max-Age` 속성을 제외하는 것이 좋습니다. 이러한 속성을 제외하면 사용자가 브라우저를 닫을 때 쿠키가 삭제되므로 권한 없는 사람이 콘텐츠에 액세스할 가능성이 줄어듭니다. 자세한 내용은 [서명된 쿠키 악용 방지](private-content-signed-cookies.md#private-content-signed-cookie-misuse) 단원을 참조하세요.

   **쿠키 속성의 이름은 대소문자를 구분합니다**.

   줄바꿈은 속성의 가독성을 높이기 위해서만 사용됩니다.

   ```
   Set-Cookie: 
   CloudFront-Expires=date and time in Unix time format (in seconds) and Coordinated Universal Time (UTC); 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Signature=hashed and signed version of the policy statement; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Key-Pair-Id=public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Hash-Algorithm=SHA1 or SHA256; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   ```  
**(선택 사항) `Domain`**  
요청된 파일의 도메인 이름입니다. `Domain` 속성을 지정하지 않는 경우, 기본값은 URL의 도메인 이름이고 이는 하위 도메인이 아닌 지정된 도메인 이름에만 적용됩니다. `Domain` 속성을 지정하는 경우, 하위 도메인에도 적용됩니다. 도메인 이름 앞의 점(예: `Domain=.example.com`)은 선택 사항입니다. 또한 `Domain` 속성을 지정하는 경우, URL의 도메인 이름과 `Domain` 속성의 값이 일치해야 합니다.  
CloudFront가 배포에 할당하는 도메인 이름을 d111111abcdef8.cloudfront.net과 같이 지정할 수 있으나, \$1.cloudfront.net을 도메인 이름으로 지정할 수는 없습니다.  
URL에 example.com과 같은 대체 도메인 이름을 사용하려면 `Domain` 속성 지정 여부와 상관없이 대체 도메인 이름을 배포에 추가해야 합니다. 자세한 내용은 [대체 도메인 이름(CNAME)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) 주제에서 [모든 배포 설정 참조](distribution-web-values-specify.md) 단원을 참조하세요.  
**(선택 사항) `Path`**  
요청된 파일의 경로입니다. `Path` 속성을 지정하지 않는 경우, 기본값은 URL의 경로입니다.  
**`Secure`**  
요청을 보내기 전 최종 사용자에게 쿠키의 암호화를 요청하세요. 쿠키 속성이 MITM(중간자 공격)을 당하지 않도록 HTTPS 연결을 통해 `Set-Cookie` 헤더를 보내는 것이 좋습니다.  
**`HttpOnly`**  
브라우저(지원되는 경우)가 쿠키 값과 상호 작용하는 방식을 정의합니다. `HttpOnly`를 사용하면 JavaScript에서 쿠키 값에 액세스할 수 없습니다. 이 예방 조치는 크로스 사이트 스크립팅(XSS) 공격을 완화하는 데 도움이 될 수 있습니다. 자세한 내용은 [HTTP 쿠키 사용](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies)을 참조하세요.  
**`CloudFront-Expires`**  
Unix 시간 형식(초) 및 협정 세계시(UTC) 기준의 URL 만료 날짜 및 시간을 지정합니다. 예를 들면 2026년 1월 1일 오전 10시(UTC)를 Unix 시간 형식의 1767290400으로 변환합니다.  
에포크 시간을 사용하려면 `9223372036854775807`(금요일, 2262년 4월 11일 23:47:16.854 UTC) 이전 날짜에 대한 64비트 정수를 지정합니다.  
UTC에 대한 자세한 내용은 *RFC 3339, 인터넷의 날짜 및 시간: 타임스탬프*, [https://tools.ietf.org/html/rfc3339](https://tools.ietf.org/html/rfc3339)를 참조하세요.  
**`CloudFront-Signature`**  
JSON 정책 설명의 해시, 서명 및 base64 인코딩 버전입니다. 자세한 내용은 [미리 준비된 정책을 사용하는 서명된 쿠키에 대한 서명 생성](#private-content-canned-policy-signature-cookies) 단원을 참조하세요.  
**`CloudFront-Key-Pair-Id`**  
CloudFront 퍼블릭 키의 ID입니다(예: `K2JCJMDEHXQW5F`). CloudFront는 서명된 URL을 확인할 때 사용할 퍼블릭 키를 퍼블릭 키 ID로 판단합니다. CloudFront는 서명의 정보를 정책 설명의 정보와 비교하고 URL이 변조되지 않았음을 확인합니다.  
이 퍼블릭 키는 배포에서 신뢰할 수 있는 서명자인 키 그룹에 속해야 합니다. 자세한 내용은 [서명된 URL 및 서명된 쿠키를 생성할 수 있는 서명자 지정](private-content-trusted-signers.md) 섹션을 참조하세요.  
**`CloudFront-Hash-Algorithm`**  
(선택 사항) 서명을 생성하는 데 사용된 해시 알고리즘입니다. 지원되는 값은 `SHA1` 및 `SHA256`입니다. 이 쿠키를 포함하지 않으면 CloudFront의 기본값은 `SHA1`입니다.

다음 예제는 배포와 연결된 도메인 이름을 파일의 URL에 사용할 때 서명된 쿠키 한 개의 `Set-Cookie` 헤더를 보여줍니다.

```
Set-Cookie: CloudFront-Expires=1426500000; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=yXrSIgyQoeE4FBI4eMKF6ho~CA8_; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
```

다음 예제는 파일에 대한 URL의 example.org 대체 도메인 이름을 사용할 때 하나의 서명된 쿠키에 대한 예제 `Set-Cookie` 헤더를 보여줍니다.

```
Set-Cookie: CloudFront-Expires=1426500000; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=yXrSIgyQoeE4FBI4eMKF6ho~CA8_; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=example.org; Path=/images/*; Secure; HttpOnly
```

URL에 example.com과 같은 대체 도메인 이름을 사용하려면 `Domain` 속성 지정 여부와 상관없이 대체 도메인 이름을 배포에 추가해야 합니다. 자세한 내용은 [대체 도메인 이름(CNAME)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) 주제에서 [모든 배포 설정 참조](distribution-web-values-specify.md) 단원을 참조하세요.

## 미리 준비된 정책을 사용하는 서명된 쿠키에 대한 서명 생성
<a name="private-content-canned-policy-signature-cookies"></a>

미리 준비된 정책을 사용하는 서명된 쿠키의 서명을 만들려면 다음 절차를 완료하세요.

**Topics**
+ [미리 준비된 정책을 사용하는 서명된 쿠키에 대한 정책 설명 생성](#private-content-canned-policy-statement-cookies)
+ [정책 설명에 서명하여 미리 준비된 정책을 사용하는 서명된 쿠키에 대한 서명 생성](#private-content-canned-policy-cookies-signing-policy-statement)

### 미리 준비된 정책을 사용하는 서명된 쿠키에 대한 정책 설명 생성
<a name="private-content-canned-policy-statement-cookies"></a>

미리 준비된 정책을 사용하는 서명된 쿠키를 설정할 때 `CloudFront-Signature` 속성은 정책 설명의 해시 및 서명된 버전입니다. 미리 준비된 정책을 사용하는 서명된 쿠키의 경우, 사용자 지정 정책을 사용하는 서명된 쿠키와 마찬가지로 `Set-Cookie` 헤더에 정책 설명을 포함하지 않습니다. 정책 설명을 만들려면 다음 단계를 수행합니다.<a name="private-content-canned-policy-statement-cookies-procedure"></a>

**미리 준비된 정책을 사용하는 서명된 쿠키에 대한 정책 설명을 만들려면**

1. 다음 JSON 형식과 UTF-8 문자 인코딩을 사용하여 정책 설명을 구성합니다. 지정된 모든 문장 부호 및 기타 리터럴 값을 정확히 포함해야 합니다. `Resource` 및 `DateLessThan` 파라미터에 대한 내용은 [서명된 쿠키에서 미리 준비된 정책을 위한 정책 설명에서 지정한 값](#private-content-canned-policy-statement-cookies-values)를 참조하세요.

   ```
   {
       "Statement": [
           {
               "Resource": "base URL or stream name",
               "Condition": {
                   "DateLessThan": {
                       "AWS:EpochTime": ending date and time in Unix time format and UTC
                   }
               }
           }
       ]
   }
   ```

1. 정책 설명에서 모든 공백(탭과 줄바꿈 문자 포함)을 제거합니다. 애플리케이션 코드의 문자열에 이스케이프 문자를 포함해야 할 수도 있습니다.

#### 서명된 쿠키에서 미리 준비된 정책을 위한 정책 설명에서 지정한 값
<a name="private-content-canned-policy-statement-cookies-values"></a>

미리 준비된 정책에 대한 정책 설명을 만들 때 다음 값을 지정합니다.

**리소스**  
쿼리 문자열을 포함하는 기본 URL(있는 경우)은 다음과 같습니다.  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
`Resource`에 대해 값을 하나만 지정할 수 있습니다.  
다음을 참조하세요.  
+ **프로토콜(Protocol)** – 값은 `http://` 또는 `https://`로 시작해야 합니다.
+ **쿼리 문자열 파라미터(Query string parameters)** – 쿼리 문자열 파라미터가 없는 경우, 물음표를 생략합니다.
+ **대체 도메인 이름(Alternate domain names)** – URL에 대체 도메인 이름(CNAME)을 지정하는 경우, 웹 페이지 또는 애플리케이션의 파일을 참조할 때 대체 도메인 이름을 지정해야 합니다. 파일에 대한 Amazon S3 URL을 지정하지 마시기 바랍니다.

**DateLessThan**  
Unix 시간 형식(초) 및 협정 세계시(UTC) 기준의 URL 만료 날짜 및 시간. 값을 인용 부호로 묶지 마세요.  
예를 들면 2015년 3월 16일 오전 10시(UTC)를 Unix 시간 형식인 1426500000으로 변환합니다.  
이 값은 `CloudFront-Expires` 헤더의 `Set-Cookie` 속성 값과 일치해야 합니다. 값을 인용 부호로 묶지 마세요.  
자세한 내용은 [CloudFront가 서명된 쿠키의 만료 날짜 및 시간을 확인하는 시기](private-content-signed-cookies.md#private-content-check-expiration-cookie) 단원을 참조하세요.

#### 미리 준비된 정책에 대한 정책 설명 예제
<a name="private-content-canned-policy-cookies-sample-policy-statement"></a>

서명된 쿠키에 다음 예제의 정책 설명을 사용할 경우, 사용자는 UTC 기준 2015년 3월 16일 오전 10시까지 `https://d111111abcdef8.cloudfront.net/horizon.jpg` 파일에 액세스할 수 있습니다.

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/horizon.jpg?size=large&license=yes",
            "Condition": {
                "DateLessThan": {
                    "AWS:EpochTime": 1426500000
                }
            }
        }
    ]
}
```

### 정책 설명에 서명하여 미리 준비된 정책을 사용하는 서명된 쿠키에 대한 서명 생성
<a name="private-content-canned-policy-cookies-signing-policy-statement"></a>

`CloudFront-Signature` 헤더의 `Set-Cookie` 속성의 값을 만들려면 [미리 준비된 정책을 사용하는 서명된 쿠키에 대한 정책 설명을 만들려면](#private-content-canned-policy-statement-cookies-procedure)에서 만든 정책 설명을 해시하고 서명합니다.

다음 주제를 참조하여 정책 설명을 해시, 서명 및 인코딩하는 방법에 대한 추가적인 내용과 예제를 확인하세요.
+ [base64 인코딩 및 암호화를 위한 Linux 명령 및 OpenSSL](private-content-linux-openssl.md)
+ [서명 URL에 대한 서명을 만드는 코드 예제](PrivateCFSignatureCodeAndExamples.md)

**참고**  
연결된 예제에서는 기본적으로 SHA-1을 사용합니다. 대신 SHA-256을 사용하려면 OpenSSL 명령에서 `sha1`을 `sha256`으로 바꾸고 값이 `SHA256`인 `CloudFront-Hash-Algorithm` 쿠키를 포함합니다.<a name="private-content-canned-policy-cookie-creating-signature-procedure"></a>

**미리 준비된 정책을 사용하는 서명된 쿠키에 대한 서명을 만들려면**

1. SHA-1 또는 SHA-256 해시 함수 및 RSA를 사용하여 [미리 준비된 정책을 사용하는 서명된 쿠키에 대한 정책 설명을 만들려면](#private-content-canned-policy-statement-cookies-procedure) 절차에서 만든 정책 문을 해시하고 서명합니다. 공백이 삭제된 버전의 정책 설명을 사용합니다.

   SHA-256을 사용하는 경우 값이 `SHA256`인 `CloudFront-Hash-Algorithm` 쿠키를 포함해야 합니다.

   해시 함수에 필요한 프라이빗 키의 경우 배포에 대해 신뢰할 수 있는 활성 키 그룹에 퍼블릭 키가 있는 프라이빗 키를 사용합니다.
**참고**  
정책 설명을 해시 및 서명하는 방법은 프로그래밍 언어와 플랫폼에 따라 달라집니다. 샘플 코드에 대한 내용은 [서명 URL에 대한 서명을 만드는 코드 예제](PrivateCFSignatureCodeAndExamples.md)를 참조하세요.

1. 해시 및 서명된 문자열에서 공백(탭과 줄바꿈 문자 포함)을 제거합니다.

1. MIME base64 인코딩 기준으로 문자열을 base64로 인코딩합니다. 자세한 내용은 *RFC 2045, MIME(Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies*의 [Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8)을 참조하세요.

1. URL 쿼리 문자열에서 사용할 수 없는 문자를 유효한 문자로 교체합니다. 아래 표에 사용할 수 없는 문자와 유효한 문자가 나열되어 있습니다.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-canned-policy.html)

1. 결과로 얻은 값을 `Set-Cookie` 이름-값 페어의 `CloudFront-Signature` 헤더에 포함하세요. 그런 다음, [미리 준비된 정책을 사용하여 서명된 쿠키를 설정하려면](#private-content-setting-signed-cookie-canned-policy-procedure) 절차로 돌아가서 `Set-Cookie`에 대한 `CloudFront-Key-Pair-Id` 헤더를 추가합니다.