

# 사용자 지정 정책을 사용하여 서명된 URL 생성
<a name="private-content-creating-signed-url-custom-policy"></a>

사용자 지정 정책을 사용하여 서명된 URL을 만들려면 다음 절차를 완료합니다.<a name="private-content-creating-signed-url-custom-policy-procedure"></a>

**사용자 지정 정책을 사용하여 서명된 URL을 만들려면**

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

1. 다음 값을 연결합니다. 이 예제의 서명된 URL의 형식을 사용할 수 있습니다.

   

   ```
   {{https://d111111abcdef8.cloudfront.net/image.jpg}}?{{color=red&size=medium&}}Policy={{eyANCiAgICEXAMPLEW1lbnQiOiBbeyANCiAgICAgICJSZXNvdXJjZSI6Imh0dHA6Ly9kemJlc3FtN3VuMW0wLmNsb3VkZnJvbnQubmV0L2RlbW8ucGhwIiwgDQogICAgICAiQ29uZGl0aW9uIjp7IA0KICAgICAgICAgIklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIyMDcuMTcxLjE4MC4xMDEvMzIifSwNCiAgICAgICAgICJEYXRlR3JlYXRlclRoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTI5Njg2MDE3Nn0sDQogICAgICAgICAiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjEyOTY4NjAyMjZ9DQogICAgICB9IA0KICAgfV0gDQp9DQo}}&Signature={{nitfHRCrtziwO2HwPfWw~yYDhUF5EwRunQA-j19DzZrvDh6hQ73lDx~-ar3UocvvRQVw6EkC~GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmatEXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6}}&Key-Pair-Id={{K2JCJMDEHXQW5F}}&Hash-Algorithm={{SHA256}}
   ```

   모든 빈 공백(탭과 줄바꿈 문자 포함)을 제거합니다. 애플리케이션 코드의 문자열에 이스케이프 문자를 포함해야 할 수도 있습니다. 모든 값에는 일종의 `String`이 있습니다.  
**1. {{파일의 기본 URL}}**  
기본 URL이란 서명된 URL을 사용하지 않고 파일에 액세스할 때 사용할 CloudFront URL을 말합니다. 자체 쿼리 문자열 파라미터가 있는 경우 여기에 포함됩니다. 이전 예제에서 기본 URL은 `https://d111111abcdef8.cloudfront.net/image.jpg`입니다. 웹 배포의 URL 형식에 대한 자세한 내용은 [CloudFront에서 파일에 대한 URL 형식 사용자 지정](LinkFormat.md)을 참조하세요.  
다음 예는 배포에 대해 지정하는 값을 보여줍니다.  
   + 다음 CloudFront URL은 배포의 이미지 파일을 위한 것입니다(CloudFront 도메인 이름 사용). `image.jpg`는 `images` 디렉터리에 있습니다. URL에 있는 파일의 경로는 HTTP 서버 또는 Amazon S3 버킷의 파일 경로와 일치해야 합니다.

     `https://d111111abcdef8.cloudfront.net/images/image.jpg`
   + 다음 CloudFront URL은 쿼리 문자열을 포함합니다.

     `https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large`
   + 다음 CloudFront URL은 배포의 이미지 파일을 위한 것입니다. 둘 다 대체 도메인 이름을 사용하며 두 번째는 쿼리 문자열을 포함합니다.

     `https://www.example.com/images/image.jpg`

     `https://www.example.com/images/image.jpg?color=red`
   + 다음 CloudFront URL은 대체 도메인 이름과 HTTPS 프로토콜을 사용하는 배포의 이미지 파일을 위한 것입니다.

     `https://www.example.com/images/image.jpg`  
**2. `?` **  
`?`는 기본 URL 뒤에 쿼리 문자열 파라미터가 있음을 나타냅니다. 쿼리 파라미터를 지정하지 않은 경우에도 `?`를 포함합니다.  
순서에 관계없이 다음 쿼리 파라미터를 지정할 수 있습니다.  
**3. {{자체 쿼리 문자열 파라미터(있는 경우}}`&`**  
(선택 사항) 자체 쿼리 문자열 파라미터를 입력할 수 있습니다. 이렇게 하려면 `color=red&size=medium`처럼 각 문자열 파라미터 간에 앰퍼샌드(&)를 추가합니다. 쿼리 문자열 파라미터는 URL 내에서 원하는 순서로 지정할 수 있습니다.  
쿼리 문자열 파라미터의 이름은 `Policy`, `Signature`, `Key-Pair-Id` 또는 `Hash-Algorithm`으로 지정할 수 없습니다.
자체 파라미터를 추가하는 경우, 마지막 파라미터를 포함하여 각 파라미터 뒤에 `&`를 추가합니다.  
**4. `Policy=`{{정책 설명의 base64 인코딩 버전}}**  
공백이 제거된 JSON 형식의 정책 설명은 base64로 인코딩합니다. 자세한 내용은 [사용자 지정 정책을 사용하는 서명된 URL에 대한 정책 설명 생성](#private-content-custom-policy-statement) 섹션을 참조하세요.  
정책 설명은 서명된 URL이 사용자에게 부여하는 액세스를 제어합니다. 여기에는 파일의 URL, 만료 날짜 및 시간, URL의 효력이 발생하는 날짜 및 시간(선택 사항), 파일에 액세스할 수 있는 IP 주소 또는 IP 주소 범위(선택 사항)가 포함됩니다.  
**5. `&Signature=`{{정책 설명의 해시 및 서명된 버전}}**  
JSON 정책 설명을 해시, 서명 및 base64로 인코딩한 버전입니다. 자세한 내용은 [사용자 지정 정책을 사용하는 서명된 URL에 대한 서명 생성](#private-content-custom-policy-creating-signature) 섹션을 참조하세요.  
**6. `&Key-Pair-Id=`{{서명을 생성하는 데 사용 중인 해당 프라이빗 키가 있는 CloudFront 퍼블릭 키의 퍼블릭 키 ID}}**  
CloudFront 퍼블릭 키의 ID입니다(예: `K2JCJMDEHXQW5F`). CloudFront는 서명된 URL을 확인할 때 사용할 퍼블릭 키를 퍼블릭 키 ID로 판단합니다. CloudFront는 서명의 정보를 정책 설명의 정보와 비교하고 URL이 변조되지 않았음을 확인합니다.  
이 퍼블릭 키는 배포에서 신뢰할 수 있는 서명자인 키 그룹에 속해야 합니다. 자세한 내용은 [서명된 URL 및 서명된 쿠키를 생성할 수 있는 서명자 지정](private-content-trusted-signers.md) 섹션을 참조하세요.  
**7. `&Hash-Algorithm=`{{SHA1 또는 SHA256}}**  
(선택 사항) 서명을 생성하는 데 사용된 해시 알고리즘입니다. 지원되는 값은 `SHA1` 및 `SHA256`입니다. 이 파라미터를 지정하지 않으면 CloudFront는 `SHA1`을 기본값으로 사용합니다.

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

다음 단계를 완료하여 사용자 지정 정책을 사용하는 서명된 URL에 대한 정책 명령문을 만듭니다.

다양한 방법으로 파일에 대한 액세스를 제어하는 예시 정책 명령문에 대한 내용은 [사용자 지정 정책을 사용하는 서명된 URL에 대한 예제 정책 설명](#private-content-custom-policy-statement-examples) 섹션을 참조하세요.<a name="private-content-custom-policy-creating-policy-procedure"></a>

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

1. 다음 JSON 형식을 사용하여 정책 설명을 구성하세요. 다음 보다 작음(`<`) 및 다음보다 큼(`>`) 기호 및 해당 기호 내의 설명을 사용자 지정 값으로 바꿉니다. 자세한 내용은 [사용자 지정 정책을 사용하는 서명된 URL에 대한 정책 설명에서 지정한 값](#private-content-custom-policy-statement-values) 섹션을 참조하세요.

   ```
   {
       "Statement": [
           {
               "Resource": "<Optional but recommended: 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`에 대한 값 관련 내용은 [사용자 지정 정책을 사용하는 서명된 URL에 대한 정책 설명에서 지정한 값](#private-content-custom-policy-statement-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-creating-signed-url-custom-policy.html)

1. 서명된 URL의 `Policy=` 뒤에 결과 값을 추가하세요.

1. 정책 설명을 해시, 서명 및 base64로 인코딩하여 서명된 URL에 대한 서명을 만드세요. 자세한 내용은 [사용자 지정 정책을 사용하는 서명된 URL에 대한 서명 생성](#private-content-custom-policy-creating-signature) 섹션을 참조하세요.

### 사용자 지정 정책을 사용하는 서명된 URL에 대한 정책 설명에서 지정한 값
<a name="private-content-custom-policy-statement-values"></a>

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

**리소스**  
있는 경우 쿼리 문자열은 포함하지만 CloudFront `Policy`, `Signature`, `Key-Pair-Id` 및 `Hash-Algorithm` 파라미터는 제외한 기본 URL입니다. 예제:  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg\?size=large&license=yes`  
`Resource`에 대해 값을 하나만 지정할 수 있습니다.  
정책에서 `Resource` 파라미터를 생략할 수 있지만 생략하는 경우 서명된 URL을 가진 사람은 누구나 서명된 URL을 만드는 데 사용한 키 페어와 연결된 어떠한 배포에서든 모든 파일에 액세스할 수 있다는 뜻이 됩니다.****
유의할 사항:  
+ **프로토콜(Protocol)** – 값은 `http://`, `https://` 또는 `*://`로 시작해야 합니다.
+ **쿼리 문자열 파라미터** - URL에 쿼리 문자열 파라미터가 있는 경우 백슬래시 문자(`\`)를 사용하지 않고 쿼리 문자열을 시작하는 물음표 문자(`?`)를 이스케이프 처리합니다. 예제:

  `https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`
+ **와일드카드 문자** - 정책의 URL에 와일드카드 문자를 사용할 수 있습니다. 다음 와일드카드 문자가 지원됩니다.
  + 별표(`*`). 0개 이상의 문자와 매칭됩니다.
  + 물음표(`?`). 정확히 한 문자와 매칭됩니다.

  CloudFront가 정책의 URL을 HTTP 요청의 URL과 매칭하면 정책의 URL은 네 개의 섹션, 즉 프로토콜, 도메인, 경로, 쿼리 문자열로 구분됩니다.

  `[protocol]://[domain]/[path]\?[query string]`

  정책의 URL에 와일드카드 문자를 사용하는 경우 와일드카드 매칭은 와일드카드가 포함된 섹션의 경계 내에서만 적용됩니다. 예를 들어, 다음 정책에서 이 URL을 고려해 보세요.

  `https://www.example.com/hello*world`

  이 예시에서 별표 와일드카드(`*`)는 경로 섹션 내에만 적용되므로 URL `https://www.example.com/helloworld` 및 `https://www.example.com/hello-world`와는 매칭되지만 URL `https://www.example.net/hello?world`와는 매칭되지 않습니다.

  와일드카드 매칭을 위한 섹션 경계에는 다음과 같은 예외가 적용됩니다.
  + 경로 섹션의 후행 별표는 쿼리 문자열 섹션의 별표를 의미합니다. 예를 들어, `http://example.com/hello*`은 `http://example.com/hello*\?*`과 같습니다.
  + 도메인 섹션의 후행 별표는 경로와 쿼리 문자열 섹션의 별표를 의미합니다. 예를 들어, `http://example.com*`은 `http://example.com*/*\?*`과 같습니다.
  + 정책의 URL은 프로토콜 섹션을 생략하고 도메인 섹션에서 별표로 시작할 수 있습니다. 이 경우 프로토콜 섹션은 암시적으로 별표로 설정됩니다. 예를 들어, 정책의 `*example.com` URL은 `*://*example.com/`에 해당합니다.
  + 별표(`"Resource": "*"`)는 그 자체로 모든 URL과 매칭됩니다.

  예를 들어, 정책의 `https://d111111abcdef8.cloudfront.net/*game_download.zip*` 값은 다음 URL 모두와 매칭됩니다.
  + `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)을 지정하는 경우, 웹 페이지 또는 애플리케이션에서 HTTP 요청이 대체 도메인 이름을 사용해야 합니다. 정책의 파일에 Amazon S3 URL을 지정하지 마시기 바랍니다.

**DateLessThan**  
Unix 시간 형식(초) 및 협정 세계시(UTC) 기준의 URL 만료 날짜 및 시간. 정책에서 값을 인용 부호로 묶지 마세요. UTC에 대한 자세한 내용은 [인터넷의 날짜 및 시간: 타임스탬프](https://tools.ietf.org/html/rfc3339)를 참조하세요.  
예를 들면 2023년 1월 31일 오전 10시(UTC)를 Unix 시간 형식의 1675159200으로 변환합니다.  
`Condition` 섹션에서 유일한 필수 파라미터입니다. CloudFront는 이 값을 통해 프라이빗 콘텐츠에 대한 영구적인 액세스를 방지합니다.  
자세한 내용은 [CloudFront가 서명된 URL에서 만료 날짜 및 시간을 확인하는 시기](private-content-signed-urls.md#private-content-check-expiration) 섹션을 참조하세요.

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

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

  `"`{{IPv4 IP 주소}}`/32"`
+ IP 주소 범위는 스탠다드 IPv4 CIDR 형식(예: `192.0.2.0/24`)을 지정해야 합니다. 자세한 내용은 [Classless Inter-domain Routing(CIDR): 인터넷 주소 할당 및 집계 계획](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) 단원을 참조하세요.

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

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

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

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

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

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

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

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

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

다음 예시 사용자 지정 정책은 `Resource` 파라미터의 와일드카드 문자(`*`)로 표시된 바와 같이 `training` 디렉터리의 파일에 대한 서명된 URL을 만들 수 있도록 허용합니다. 사용자는 UTC 기준 2023년 1월 31일 오전 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": 1675159200
                }
            }
        }
    ]
}
```

이 정책과 함께 사용하는 서명된 URL에는 다음과 같이 특정 파일을 식별하는 URL이 있습니다.

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

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

다음 예시 사용자 지정 정책은 `Resource` 파라미터의 와일드카드 문자(`*`)로 표시된 대로 배포와 연결된 파일에 대한 서명된 URL을 만들 수 있도록 허용합니다. 서명된 URL은 `http://` 프로토콜이 아닌 `https://` 프로토콜을 사용해야 합니다. 사용자는 IP 주소 `192.0.2.10/32`를 사용해야 합니다. CIDR 표기법의 `192.0.2.10/32` 값은 단일 IP 주소 `192.0.2.10`을 가리킵니다. 파일은 UTC 기준 2023년 1월 31일 오전 10시에서 2023년 2월 2일 오전 10시까지만 사용할 수 있습니다.

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

이 정책과 사용하는 서명된 URL에는 다음과 같이 특정 CloudFront 배포의 특정 파일을 식별하는 URL이 있습니다.

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

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

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

서명된 URL에 대한 서명은 정책 설명의 해시, 서명 및 base64로 인코딩된 버전의 사용자 지정 정책을 사용합니다. 사용자 지정 정책에 대한 서명을 만들려면 다음 단계를 수행합니다.

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

**참고**  
연결된 예제에서는 기본적으로 SHA-1을 사용합니다. 대신 SHA-256을 사용하려면 OpenSSL 명령에서 `sha1`을 `sha256`으로 바꾸고 서명된 URL에 `Hash-Algorithm=SHA256` 쿼리 파라미터를 포함합니다.<a name="private-content-custom-policy-creating-signature-download-procedure"></a>

**옵션 1: 사용자 지정 정책을 사용하여 서명을 만들려면**

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

   SHA-256을 사용하는 경우 서명된 URL에 `&Hash-Algorithm=SHA256`을 포함해야 합니다.

   해시 함수에 필요한 프라이빗 키의 경우 배포에 대해 신뢰할 수 있는 활성 키 그룹에 퍼블릭 키가 있는 프라이빗 키를 사용합니다.
**참고**  
정책 설명을 해시 및 서명하는 방법은 프로그래밍 언어와 플랫폼에 따라 달라집니다. 샘플 코드에 대한 내용은 [서명 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-creating-signed-url-custom-policy.html)

1. 서명된 URL의 `&Signature=` 뒤에 결과 값을 추가하고 [사용자 지정 정책을 사용하여 서명된 URL을 만들려면](#private-content-creating-signed-url-custom-policy-procedure)로 돌아가서 서명된 URL 부분을 마저 연결합니다.