

# 사용자 지정 정책을 사용하여 서명된 쿠키 설정
<a name="private-content-setting-signed-cookie-custom-policy"></a>

사용자 지정 정책을 사용하는 서명된 쿠키를 설정하려면 다음 단계를 수행합니다.<a name="private-content-setting-signed-cookie-custom-policy-procedure"></a>

**사용자 지정 정책을 사용하여 서명된 쿠키를 설정하려면**

1. .NET 또는 Java를 사용하여 서명된 URL을 만드는 중인데 키 페어의 프라이빗 키를 기본 .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-Policy`, `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-Policy=base64 encoded version of the policy statement; 
   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`**  
HTTP 또는 HTTPS 요청에 한해 최종 사용자에게 쿠키를 요구하세요.  
**`CloudFront-Policy`**  
공백이 제거된 JSON 형식의 정책 설명은 base64로 인코딩합니다. 자세한 내용은 [사용자 지정 정책을 사용하는 서명된 쿠키에 대한 서명 생성](#private-content-custom-policy-signature-cookies) 섹션을 참조하세요.  
정책 설명은 서명된 쿠키가 사용자에게 부여하는 액세스를 제어합니다. 여기에는 사용자가 액세스할 수 있는 파일, 만료 날짜 및 시간, URL의 효력이 발생하는 날짜 및 시간(선택 사항), 파일에 액세스할 수 있는 IP 주소 또는 IP 주소 범위(선택 사항)가 포함됩니다.  
**`CloudFront-Signature`**  
JSON 정책 설명을 해시, 서명 및 base64로 인코딩한 버전입니다. 자세한 내용은 [사용자 지정 정책을 사용하는 서명된 쿠키에 대한 서명 생성](#private-content-custom-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`입니다.

## 사용자 지정 정책의 예제 헤더 `Set-Cookie`
<a name="example-set-cookie-headers-custom-policy"></a>

`Set-Cookie` 헤더 쌍의 다음 예를 참조하십시오.

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

**Example 예 1**  
파일 URL에 배포와 연결된 도메인 이름을 사용하는 경우 서명된 쿠키 하나에 `Set-Cookie` 헤더를 사용할 수 있습니다.  

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
```

**Example 예제 2**  
파일의 URL에 대체 도메인 이름(example.org)을 사용하는 경우 서명된 쿠키 하나에 `Set-Cookie` 헤더를 사용할 수 있습니다.  

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=example.org; Path=/; Secure; HttpOnly
```

**Example 예 3**  
파일의 URL에 배포와 연결된 도메인 이름을 사용하는 경우 서명된 요청에 `Set-Cookie` 헤더 쌍을 사용할 수 있습니다.  

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=dd111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
```

**Example 예 4**  
파일 URL에 배포와 연결된 대체 도메인 이름(example.org)을 사용하는 경우 서명된 요청 하나에 `Set-Cookie` 헤더 쌍을 사용할 수 있습니다.  

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=example.org; Path=/; Secure; HttpOnly
```

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

사용자 지정 정책에 대한 정책 설명을 만들려면 다음 단계를 수행합니다. 다양한 방법으로 파일에 대한 액세스를 제어하는 몇 가지 예제 정책 설명에 대한 내용은 [사용자 지정 정책을 사용하는 서명된 쿠키에 대한 예제 정책 설명](#private-content-custom-policy-statement-signed-cookies-examples) 단원을 참조하세요.<a name="private-content-custom-policy-statement-cookies-procedure"></a>

**사용자 지정 정책을 사용하는 서명된 쿠키에 대한 정책 설명을 만들려면**

1. 다음 JSON 형식을 사용하여 정책 설명을 구성하세요.

   ```
   {
       "Statement": [
           {
               "Resource": "URL of the file",
               "Condition": {
                   "DateLessThan": {
                       "AWS:EpochTime":required ending date and time in Unix time format and UTC
                   },
                   "DateGreaterThan": {
                       "AWS:EpochTime":optional beginning date and time in Unix time format and UTC
                   },
                   "IpAddress": {
                       "AWS:SourceIp": "optional IP address"
                   }
               }
           }
       ]
   }
   ```

   다음을 참조하세요.
   + 단 한 개의 명령문만 포함시킬 수 있습니다.
   + UTF-8 문자 인코딩을 사용하세요.
   + 지정된 대로 정확하게 모든 문장 부호 및 파라미터 이름을 포함하세요. 파라미터 이름의 약어는 허용되지 않습니다.
   + `Condition` 섹션의 파라미터 순서는 중요하지 않습니다.
   + `Resource`, `DateLessThan`, `DateGreaterThan`, `IpAddress`에 대한 값 관련 내용은 [서명된 쿠키에서 사용자 지정 정책을 위한 정책 설명에서 지정한 값](#private-content-custom-policy-statement-cookies-values)을 참조하세요.

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-custom-policy.html)

1. `Set-Cookie` 뒤 `CloudFront-Policy=` 헤더의 결과 값을 포함하세요.

1. 정책 설명을 해시, 서명 및 base64로 인코딩하여 `Set-Cookie`의 `CloudFront-Signature` 헤더에 대한 서명을 만드세요. 자세한 내용은 [사용자 지정 정책을 사용하는 서명된 쿠키에 대한 서명 생성](#private-content-custom-policy-signature-cookies) 단원을 참조하세요.

### 서명된 쿠키에서 사용자 지정 정책을 위한 정책 설명에서 지정한 값
<a name="private-content-custom-policy-statement-cookies-values"></a>

사용자 지정 정책에 대한 정책 설명을 생성할 때 다음 값을 지정합니다.

**리소스**  
쿼리 문자열을 포함하는 기본 URL(있는 경우):  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
`Resource` 파라미터를 생략하는 경우, 사용자는 서명된 URL을 만들 때 사용하는 키 페어에 연결된 배포 관련 모든 파일에 액세스할 수 있습니다.
`Resource`에 대해 값을 하나만 지정할 수 있습니다.  
다음을 참조하세요.  
+ **프로토콜(Protocol)** – 값은 `http://` 또는 `https://`로 시작해야 합니다.
+ **쿼리 문자열 파라미터(Query string parameters)** – 쿼리 문자열 파라미터가 없는 경우, 물음표를 생략합니다.
+ **와일드카드(Wildcards)** – 0개 이상의 문자(\$1)에 해당하거나 문자열 내 정확히 1문자(?)에 해당하는 와일드카드를 문자열 내 모든 곳에 사용할 수 있습니다. 예를 들어 값은

  `https://d111111abcdef8.cloudfront.net/*game_download.zip*`

  다음 파일을 포함합니다.
  + `https://d111111abcdef8.cloudfront.net/game_download.zip`
  + `https://d111111abcdef8.cloudfront.net/example_game_download.zip?license=yes`
  + `https://d111111abcdef8.cloudfront.net/test_game_download.zip?license=temp`
+ **대체 도메인 이름** – URL에 대체 도메인 이름(CNAME)을 지정하는 경우, 웹 페이지 또는 애플리케이션의 파일을 참조할 때 대체 도메인 이름을 지정해야 합니다. 파일에 대한 Amazon S3 URL을 지정하지 마시기 바랍니다.

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

**DateGreaterThan(선택 사항)**  
Unix 시간 형식(초)과 협정 세계시(UTC)의 URL에 대한 선택적 시작 날짜 및 시간. 사용자는 지정된 날짜 및 시간 이전에 파일에 액세스할 수 없습니다. 값을 인용 부호로 묶지 마세요.

**IpAddress(선택 사항)**  
클라이언트의 IP 주소는 GET 요청을 합니다. 다음을 참조하세요.  
+ 파일에 액세스하는 IP 주소를 허용하려면 `IpAddress` 파라미터를 생략합니다.
+ 하나의 IP 주소 또는 하나의 IP 주소 범위를 지정할 수 있습니다. 예를 들면, 클라이언트의 IP 주소가 두 개의 다른 범위 중 하나에 있는 경우, 정책을 설정하여 액세스를 허용할 수 없습니다.
+ 단일 IP 주소에서 액세스를 허용하기 위해 다음을 지정합니다.

  `"`*IPv4 IP 주소*`/32"`
+ IP 주소 범위는 스탠다드 IPv4 CIDR 형식(예: `192.0.2.0/24`)을 지정해야 합니다. 자세한 내용은 *RFC 4632, Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan*, [https://tools.ietf.org/html/rfc4632](https://tools.ietf.org/html/rfc4632)를 참조하세요.
**중요**  
IPv6 형식의 IP 주소(예: 2001:0db8:85a3::8a2e:0370:7334)는 지원되지 않습니다.

  `IpAddress`를 포함하는 사용자 지정 정책을 사용할 경우 배포에 대해 IPv6를 사용하도록 설정하지 마세요. IP 주소로 일부 콘텐츠에 대한 액세스를 제한하고, 다른 콘텐츠에 대해서는 IPv6 요청을 지원하려면 두 가지 배포를 만들면 됩니다. 자세한 내용은 [IPv6 활성화(뷰어 요청)](DownloadDistValuesGeneral.md#DownloadDistValuesEnableIPv6) 주제에서 [모든 배포 설정 참조](distribution-web-values-specify.md) 단원을 참조하세요.

## 사용자 지정 정책을 사용하는 서명된 쿠키에 대한 예제 정책 설명
<a name="private-content-custom-policy-statement-signed-cookies-examples"></a>

다음 예제 정책 설명은 특정 파일, 디렉터리의 모든 파일 또는 키 페어 ID에 연결된 모든 파일의 액세스 제어 방법을 보여줍니다. 예제는 또한 개별 IP 주소 또는 IP 주소 범위에서 액세스를 제어하는 방법과 지정된 날짜 및 시간 이후 사용자의 서명된 쿠키 사용 방지 방법을 보여줍니다.

이러한 예제를 복사하여 붙여 넣는 경우, 공백(탭과 줄바꿈 문자 포함)을 제거하고 값을 자체 값과 교체한 후 닫는 괄호(\$1)뒤에 줄바꿈 문자를 포함합니다.

자세한 내용은 [서명된 쿠키에서 사용자 지정 정책을 위한 정책 설명에서 지정한 값](#private-content-custom-policy-statement-cookies-values) 섹션을 참조하세요.

**Topics**
+ [예제 정책 설명: IP 주소 범위에서 하나의 파일에 액세스](#private-content-custom-policy-statement-signed-cookies-example-one-object)
+ [예제 정책 설명: IP 주소 범위에서 디렉터리의 모든 파일에 액세스](#private-content-custom-policy-statement-signed-cookies-example-all-objects)
+ [예제 정책 설명: 하나의 IP 주소에서 키 페어 ID에 연결된 모든 파일에 액세스](#private-content-custom-policy-statement-signed-cookies-example-one-ip)

### 예제 정책 설명: IP 주소 범위에서 하나의 파일에 액세스
<a name="private-content-custom-policy-statement-signed-cookies-example-one-object"></a>

다음 서명된 쿠키의 예제 사용자 지정 정책은 UTC 기준 2023년 1월 1일 오전 10시까지 `https://d111111abcdef8.cloudfront.net/game_download.zip` 범위의 IP 주소에서 `192.0.2.0/24` 파일에 액세스할 수 있는 사용자를 지정합니다.

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/game_download.zip",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1767290400
                }
            }
        }
    ]
}
```

### 예제 정책 설명: IP 주소 범위에서 디렉터리의 모든 파일에 액세스
<a name="private-content-custom-policy-statement-signed-cookies-example-all-objects"></a>

다음 예제 사용자 지정 정책은 `training` 파라미터의 \$1 와일드카드 문자에 표시된 바와 같이 `Resource` 디렉터리의 파일에 대한 서명된 쿠키를 만들 수 있도록 허용합니다. 사용자는 UTC 기준 2013년 1월 1일 오전 10시까지 `192.0.2.0/24` 범위의 IP 주소에서 파일에 액세스할 수 있습니다.

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/training/*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1767290400
                }
            }
        }
    ]
}
```

이 정책을 사용하는 서명된 쿠키는 각자 특정 파일을 식별하는 다음과 같은 기본 URL을 포함합니다.

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

### 예제 정책 설명: 하나의 IP 주소에서 키 페어 ID에 연결된 모든 파일에 액세스
<a name="private-content-custom-policy-statement-signed-cookies-example-one-ip"></a>

다음 샘플 사용자 지정 정책은 `Resource` 파라미터의 \$1 와일드카드 문자 표시된 바와 같이 배포와 연결된 파일에 대한 서명된 쿠키를 설정할 수 있도록 허용합니다. 사용자는 IP 주소 `192.0.2.10/32`를 사용해야 합니다. CIDR 표기법의 `192.0.2.10/32` 값은 단일 IP 주소 `192.0.2.10`을(를) 가리킵니다. 파일은 UTC 기준 2013년 1월 1일 오전 10시에서 2013년 1월 2일 오전 10시까지만 사용할 수 있습니다.

```
{
    "Statement": [
        {
            "Resource": "https://*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.10/32"
                },
                "DateGreaterThan": {
                    "AWS:EpochTime": 1767290400
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1767376800
                }
            }
        }
    ]
}
```

이 정책을 사용하는 서명된 쿠키는 각각 특정 CloudFront 배포의 특정 파일을 식별하는 다음과 같은 기본 URL을 포함합니다.

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

또한 서명된 쿠키는 키 페어 ID를 포함하고 이는 기본 URL에서 지정한 배포(d111111abcdef8.cloudfront.net)의 신뢰할 수 있는 키 그룹과 연결되어야 합니다.

## 사용자 지정 정책을 사용하는 서명된 쿠키에 대한 서명 생성
<a name="private-content-custom-policy-signature-cookies"></a>

서명된 쿠키에 대한 서명은 정책 설명의 해시, 서명 및 base64로 인코딩된 버전의 사용자 지정 정책을 사용합니다.

다음을 참조하여 정책 설명을 해시, 서명 및 인코딩하는 방법에 대한 추가적인 내용과 예제를 확인하세요.
+ [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-custom-policy-signature-cookies-procedure"></a>

**사용자 지정 정책으로 서명된 쿠키에 대한 서명을 만들려면**

1. SHA-1 또는 SHA-256 해시 함수 및 RSA를 사용하여 [사용자 지정 정책을 사용하는 서명된 URL에 대한 정책 설명을 만들려면](private-content-creating-signed-url-custom-policy.md#private-content-custom-policy-creating-policy-procedure) 절차에서 만든 JSON 정책 문을 해시하고 서명합니다. 더 이상 공백을 포함하지 않지만 base64로 인코딩되지 않은 정책 설명 버전을 사용합니다.

   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-custom-policy.html)

1. `Set-Cookie` 이름-값 페어에 대한 `CloudFront-Signature=` 헤더의 결과 값을 포함하고 [사용자 지정 정책을 사용하여 서명된 쿠키를 설정하려면](#private-content-setting-signed-cookie-custom-policy-procedure)으로 돌아가서 `Set-Cookie`에 대한 `CloudFront-Key-Pair-Id` 헤더를 추가하세요.