

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# HTTPS 엔드포인트에 Amazon SNS 알림 팬아웃
<a name="sns-http-https-endpoint-as-subscriber"></a>

Amazon SNS를 사용하여 하나 이상의 HTTP 또는 HTTPS 엔드포인트에 알림 메시지를 전송할 수 있습니다. 주제에 대한 엔드포인트를 구독할 때 사용자는 주제에 대한 알림을 게시할 수 있으며 Amazon SNS는 HTTP POST 요청을 전송하는 한편 구독된 엔드포인트에 알림 콘텐츠를 전송합니다. 사용자는 엔드포인트 구독 시 Amazon SNS가 엔드포인트에 POST 요청을 전송하기 위해 HTTP를 사용하는지 또는 HTTPS를 사용하는지 여부를 선택합니다. HTTPS를 사용할 경우 Amazon SNS에서 다음에 대한 지원을 이용할 수 있습니다.
+ **서버 이름 표시(SNI)** - 이를 통해 Amazon SNS는 이 기능을 사용하여 여러 도메인을 호스팅하기 위해 여러 인증서가 필요한 서버와 같이 SNI가 필요한 HTTPS 엔드포인트를 지원합니다. SNI에 대한 자세한 정보는 [서버 이름 표시](http://en.wikipedia.org/wiki/Server_Name_Indication)를 참조하세요.
+ **기본 및 다이제스트 액세스 인증** - HTTP POST 요청에 대해 HTTPS URL에 사용자 이름과 암호를 지정할 수 있습니다(예: `https://user:password@domain.com` 또는 `https://user@domain.com`). 사용자 이름과 암호는 HTTPS를 사용할 때 설정되는 SSL 연결을 통해 암호화됩니다. 도메인 이름만 일반 텍스트로 전송됩니다. 기본 및 다이제스트 액세스 인증에 대한 자세한 정보는 [RFC-2617](http://www.rfc-editor.org/info/rfc2617)을 참조하세요.
**중요**  
Amazon SNS는 현재 프라이빗 HTTP(S) 엔드포인트를 지원하지 않습니다.  
HTTPS URL은 API 액세스 권한을 부여한 보안 주체에 대한 Amazon SNS `GetSubscriptionAttributes` API 작업에서만 검색할 수 있습니다.
**참고**  
 클라이언트 서비스는 `HTTP/1.1 401 Unauthorized` 헤더 응답을 지원할 수 있어야 합니다.

요청은 JSON 문서의 알림에 대한 메타데이터와 함께 주제에 게시된 제목 및 메시지를 포함합니다. 요청은 다음의 HTTP POST 요청과 유사합니다. 요청 본문의 HTTP 헤더 및 JSON 형식에 대한 세부 정보는 [HTTP/HTTPS 헤더](http-header.md) 및 [HTTP/HTTPS 알림 JSON 형식](http-notification-json.md)에서 확인하세요.

**참고**  
Amazon SNS는 5XX 오류와 429(요청이 너무 많음) 오류를 모두 재시도 가능한 것으로 간주합니다. 이러한 오류에는 전송 정책이 적용됩니다. 다른 모든 오류는 영구 실패로 간주되며 재시도는 시도되지 않습니다.

```
POST / HTTP/1.1
    x-amz-sns-message-type: Notification
    x-amz-sns-message-id: da41e39f-ea4d-435a-b922-c6aae3915ebe
    x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
    x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55
    Content-Length: 761
    Content-Type: text/plain; charset=UTF-8
    Host: ec2-50-17-44-49.compute-1.amazonaws.com
    Connection: Keep-Alive
    User-Agent: Amazon Simple Notification Service Agent
    
{
  "Type" : "Notification",
  "MessageId" : "da41e39f-ea4d-435a-b922-c6aae3915ebe",
  "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
  "Subject" : "test",
  "Message" : "test message",
  "Timestamp" : "2012-04-25T21:49:25.719Z",
  "SignatureVersion" : "1",
  "Signature" : "EXAMPLElDMXvB8r9R83tGoNn0ecwd5UjllzsvSvbItzfaMpN2nk5HVSw7XnOn/49IkxDKz8YrlH2qJXj2iZB0Zo2O71c4qQk1fMUDi3LGpij7RCW7AW9vYYsSqIKRnFS94ilu7NFhUzLiieYr4BKHpdTmdD6c0esKEYBpabxDSc=",
  "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem",
   "UnsubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55"
}
```

# HTTPS 엔드포인트에서 Amazon SNS 주제 구독
<a name="sns-subscribe-https-s-endpoints-to-topic"></a>

이 주제에서는 HTTP/S 엔드포인트에서 Amazon SNS 주제를 구독하는 방법을 설명합니다.

**Topics**
+ [1단계: Amazon SNS 메시지를 처리하도록 엔드포인트를 준비합니다.](SendMessageToHttp.prepare.md)
+ [2단계: Amazon SNS 주제에 대한 HTTP/HTTPS 엔드포인트 구독](SendMessageToHttp.subscribe.md)
+ [3단계: Amazon SNS 구독 확인](SendMessageToHttp.confirm.md)
+ [4단계: Amazon SNS 구독의 전송 정책 설정(선택 사항)](SendMessageToHttp.retry.md)
+ [5단계: 사용자에게 Amazon SNS 주제를 게시할 권한 부여(선택 사항)](SendMessageToHttp.iam.permissions.md)
+ [6단계: HTTP/HTTPS 엔드포인트에 Amazon SNS 메시지 전송](SendMessageToHttp.publish.md)

# 1단계: Amazon SNS 메시지를 처리하도록 엔드포인트를 준비합니다.
<a name="SendMessageToHttp.prepare"></a>

사용자는 주제에 대한 HTTP 엔드포인트 또는 HTTPS 엔드포인트를 구독하기 전에 HTTP 엔드포인트 또는 HTTPS 엔드포인트가 구독 확인 및 알림 메시지를 전송하기 위해 Amazon SNS가 사용하는 HTTP POST 요청을 처리할 수 있는 능력이 있는지 확인해야 합니다. 일반적으로 이는 Amazon SNS에서 HTTP 요청을 처리하는 웹 애플리케이션의 생성 및 배포(예. endpoint host가 Linux, Apache 및 Tomcat을 실행할 경우 Java servlet)를 의미합니다. HTTP 엔드포인트 구독 시 Amazon SNS는 이를 구독 확인 요청에 전송합니다. 사용자가 구독을 생성할 때 Amazon SNS는 이 요청을 전송하므로 엔드포인트는 이 요청을 수신하고 처리하도록 준비되어야 합니다. Amazon SNS는 구독을 확인할 때까지 엔드포인트에 알림을 보내지 않습니다. 구독을 확인하고 나면 Amazon SNS는 구독하는 주제에 대해 게시 작업이 수행될 때 엔드포인트에 알림을 전송합니다.

**구독 확인 및 알림 메시지 처리를 위한 엔드포인트 설정**

1. 사용자의 코드는 Amazon SNS가 엔드포인트에 전송한 HTTP POST 요청의 HTTP 헤더를 읽어야 합니다. 사용자의 코드는 Amazon SNS가 사용자에게 전송한 메시지 유형을 나타내는 헤더 필드 `x-amz-sns-message-type`을 찾아야 합니다. 헤더를 확인함으로써 사용자는 HTTP 요청의 본문을 분석하지 않고도 메시지 유형을 결정할 수 있습니다. 처리해야 할 두 가지 유형 `SubscriptionConfirmation`와 `Notification`이 있습니다. `UnsubscribeConfirmation` 메시지는 주제에서 구독이 삭제된 때에만 사용됩니다.

   HTTP 헤더에 대한 세부 정보는 [HTTP/HTTPS 헤더](http-header.md)에서 확인하세요. 다음의 HTTP POST 요청은 구독 확인 메시지의 예입니다.

   ```
   POST / HTTP/1.1
       x-amz-sns-message-type: SubscriptionConfirmation
       x-amz-sns-message-id: 165545c9-2a5c-472c-8df2-7ff2be2b3b1b
       x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
       Content-Length: 1336
       Content-Type: text/plain; charset=UTF-8
       Host: example.com
       Connection: Keep-Alive
       User-Agent: Amazon Simple Notification Service Agent
       
   {
     "Type" : "SubscriptionConfirmation",
     "MessageId" : "165545c9-2a5c-472c-8df2-7ff2be2b3b1b",
     "Token" : "2336412f37f...",
     "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
     "Message" : "You have chosen to subscribe to the topic arn:aws:sns:us-west-2:123456789012:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.",
     "SubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:MyTopic&Token=2336412f37...",
     "Timestamp" : "2012-04-26T20:45:04.751Z",
     "SignatureVersion" : "1",
     "Signature" : "EXAMPLEpH+...",
     "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
   }
   ```

1. 사용자의 코드는 HTTP POST 요청 및 content-type text/plain 본문의 JSON 문서를 분석하여 Amazon SNS 메시지를 구성하는 이름-값 쌍을 읽어야 합니다. JSON 분석을 사용해 제어 문자의 escaped 상태를 ASCII 문자 값으로 변환 처리합니다(예. \$1n을 줄바꿈 문자로 변환). [Jackson JSON Processor](https://github.com/FasterXML/jackson) 등의 기존 JSON 구문 분석기를 사용하거나 자체적으로 쓸 수 있습니다. 제목 및 메시지 필드의 텍스트를 유효한 JSON으로 보내려면 Amazon SNS에서 일부 제어 문자를 JSON 문서에 포함될 수 있는 이스케이프된 표현으로 변환해야 합니다. 엔드포인트에 전송된 POST 요청의 본문에 있는 JSON 문서를 수신하면 사용자는 주제에 게시된 원래 제목과 메시지의 정확한 표현을 원하는 경우 이스케이프된 문자를 다시 원본 문자 값으로 변환해야 합니다. 서명은 원본 형식의 메시지 및 제목을 서명할 문자열의 일부로 사용하기 때문에 이는 알림의 서명을 확인하고자 할 경우 아주 중요합니다.

1. 사용자의 코드는 Amazon SNS가 보낸 알림의 신뢰성, 구독 확인 또는 구독 해지 확인 메시지를 확인해야 합니다. 엔드포인트는 Amazon SNS 메시지에 포함된 정보를 사용해 서명을 재생성할 수 있으며 사용자는 Amazon SNS가 메시지로 보낸 서명을 자신의 서명과 비교함으로써 메시지의 콘텐츠를 확인할 수 있습니다. 메시지의 서명 확인에 대한 자세한 정보는 [Amazon SNS 메시지의 서명 확인](sns-verify-signature-of-message.md)에서 확인하세요.

1. 사용자의 코드는 헤더 필드 `x-amz-sns-message-type`가 지정하는 유형에 기초하여 HTTP 요청의 본문에 담긴 JSON 문서를 읽고 메시지를 처리해야 합니다. 다음은 두 가지 주요 메시지 유형 처리 지침입니다.  
**SubscriptionConfirmation**  
`SubscribeURL`의 값을 읽고 해당 URL을 방문합니다. 구독을 확인하고 엔드포인트에서 알림 수신을 시작하려면 `SubscribeURL` URL을 방문해야 합니다(예. URL에 HTTP GET 요청을 전송). `SubscribeURL`를 확인하려면 이전 단계의 HTTP 요청 예제를 확인합니다. `SubscriptionConfirmation` 메시지의 형식에 대한 자세한 정보는 [HTTP/HTTPS 구독 확인 JSON 형식](http-subscription-confirmation-json.md)에서 확인하세요. URL을 방문하면 다음의 XML 문서와 같은 응답을 받게 됩니다. 문서는 `ConfirmSubscriptionResult` 요소 내 엔드포인트에 대한 구독 ARN을 되돌립니다.  

   ```
   <ConfirmSubscriptionResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
      <ConfirmSubscriptionResult>
         <SubscriptionArn>arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55</SubscriptionArn>
      </ConfirmSubscriptionResult>
      <ResponseMetadata>
         <RequestId>075ecce8-8dac-11e1-bf80-f781d96e9307</RequestId>
      </ResponseMetadata>
   </ConfirmSubscriptionResponse>
   ```
사용자는 `SubscribeURL` 방문 외에도 [ConfirmSubscription](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 작업과 함께 `Token`(`SubscriptionConfirmation` 메시지의 해당 값으로 설정된)을 사용해 구독을 확인할 수 있습니다. 주제 소유자 및 구독 소유자만 엔드포인트를 구독 해지할 수 있도록 허용하고자 하는 경우 AWS 서명을 사용해 `ConfirmSubscription` 작업을 호출합니다.  
**알림**  
`Subject` 및 `Message`에 대한 값을 읽어 주제에 게시된 알림 정보를 획득합니다.  
`Notification` 메시지 형식에 대한 세부 정보는 [HTTP/HTTPS 헤더](http-header.md)에서 확인하세요. 다음의 HTTP POST 요청은 endpoint example.com에 전송된 알림 메시지의 예입니다.  

   ```
   POST / HTTP/1.1
       x-amz-sns-message-type: Notification
       x-amz-sns-message-id: 22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324
       x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
       x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:c9135db0-26c4-47ec-8998-413945fb5a96
       Content-Length: 773
       Content-Type: text/plain; charset=UTF-8
       Host: example.com
       Connection: Keep-Alive
       User-Agent: Amazon Simple Notification Service Agent
       
   {
     "Type" : "Notification",
     "MessageId" : "22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324",
     "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
     "Subject" : "My First Message",
     "Message" : "Hello world!",
     "Timestamp" : "2012-05-02T00:54:06.655Z",
     "SignatureVersion" : "1",
     "Signature" : "EXAMPLEw6JRN...",
     "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem",
     "UnsubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:123456789012:MyTopic:c9135db0-26c4-47ec-8998-413945fb5a96"
   }
   ```

1. 엔드포인트가 적절한 상태 코드로 Amazon SNS의 HTTP POST 메시지에 응답하도록 확인해야 합니다. 연결은 약 15초 내에 끊어집니다. 엔드포인트가 연결 시간이 끊기기 전까지 응답하지 않거나 엔드포인트가 상태 코드를 200–4*xx* 범위 외로 되돌릴 경우 Amazon SNS는 메시지 전송이 실패한 것으로 간주합니다.

1. Amazon SNS로부터의 메시지 전송 재시도를 처리할 수 있도록 코드를 확인해야 합니다. Amazon SNS는 엔드포인트에서 성공적인 응답을 수신하지 않을 경우 메시지를 다시 전송하는 시도를 합니다. 이는 구독 확인 메시지를 포함한 모든 메시지에 적용됩니다. 기본 설정에서 메시지의 초기 전송이 실패할 경우 Amazon SNS는 최대 3회 재시도를 실시하며 실패한 시도 사이에 설정된 지연 시간은 20초입니다.
**참고**  
약 15초가 경과하면 메시지 요청 시간이 초과됩니다. 따라서 시간이 초과되어 메시지 전송이 실패하는 경우 Amazon SNS는 이전 전송 시도의 약 35초 후에 재시도를 합니다. 엔드포인트에 대해 다른 전송 정책을 설정할 수 있습니다.

   Amazon SNS는 `x-amz-sns-message-id` 헤더 필드를 사용하여 Amazon SNS 주제에 게시된 각 메시지를 고유하게 식별합니다. 사용자는 수신 메시지와 처리한 메시지의 ID를 비교함으로써 메시지가 재전송을 시도하는지 여부를 판단할 수 있습니다.

1. HTTPS 엔드포인트를 구독할 경우 엔드포인트에 신뢰할 수 있는 인증 기관(CA)의 서버 인증서가 있는지 확인해야 합니다. Amazon SNS는 Amazon SNS가 신뢰하는 CA의 서명이 있는 서버 인증서를 보유한 HTTPS 엔드포인트에만 메시지를 보냅니다.

1. Amazon SNS 메시지를 수신하기 위해 생성한 코드를 배포합니다. 엔드포인트를 구독할 때 엔드포인트는 적어도 구독 확인 메시지를 받을 준비가 되어야 합니다.

# 2단계: Amazon SNS 주제에 대한 HTTP/HTTPS 엔드포인트 구독
<a name="SendMessageToHttp.subscribe"></a>

주제를 통해 메시지를 HTTP 엔드포인트 또는 HTTPS 엔드포인트에 전송하려면 엔드포인트가 Amazon SNS 주제를 구독하게 등록해야 합니다. 사용자는 해당 URL을 사용하여 엔드포인트를 지정합니다. 주제를 구독하려면 Amazon SNS 콘솔, [sns-subscribe](https://docs.aws.amazon.com/cli/latest/reference/sns/subscribe.html) 명령 또는 [구독](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html) API 작업을 사용할 수 있습니다. 시작하기 전에 사용자는 구독하고자 하는 엔드포인트의 URL을 보유하는지 확인해야 하며 단계 1에서 설명한 대로 엔드포인트가 확인 및 알림 메시지를 수신할 수 있도록 준비되어야 합니다.

**Amazon SNS 콘솔을 이용하여 HTTP 엔드포인트 또는 HTTPS 엔드포인트에서 주제 구독**

1. [Amazon SNS 콘솔](https://console.aws.amazon.com/sns/home)에 로그인합니다.

1. 탐색 창에서 **구독**을 선택합니다.

1. **구독 생성(Create subscription)**을 선택합니다.

1. **프로토콜(Protocol)** 드롭다운 목록에서 **HTTP** 또는 **HTTPS**를 선택합니다.

1. **엔드포인트(Endpoint)** 상자에서 주제가 메시지를 전송하려는 엔드포인트의 URL을 붙여 넣은 다음 **구독 생성(Create subscription)**을 선택합니다.

1. 확인 메시지가 표시됩니다. **닫기**를 선택하세요.

   새 구독의 **구독(Subscription ID)**는 PendingConfirmation에 표시됩니다. 구독 확인 시 **구독(Subscription ID)**는 구독 ID(Subscription ID)에 표시됩니다.

# 3단계: Amazon SNS 구독 확인
<a name="SendMessageToHttp.confirm"></a>

 Amazon SNS 구독을 확인하려면 다음 단계에 따라 엔드포인트가 메시지를 성공적으로 수신할 수 있도록 해야 합니다. 이 프로세스에는 수신 확인 메시지를 처리하도록 엔드포인트를 설정하고, 확인 URL을 검색하고, 구독을 확인하는 작업이 포함됩니다. 설정에 따라 구독을 자동으로 또는 수동으로 확인할 수 있습니다.

1. Amazon SNS 주제를 구독하면 Amazon SNS에서는 엔드포인트에 확인 메시지를 전송합니다. 이 메시지에는 구독을 확인할 때 사용해야 하는 `SubscribeURL`이 포함되어 있습니다.

1. Amazon SNS에서 수신되는 메시지를 수신 대기하도록 엔드포인트를 설정해야 합니다. 확인 메시지가 도착하면 메시지에서 **`SubscribeURL`**을 추출합니다.

1. `SubscribeURL`이 있으면 다음 두 가지 방법 중 하나로 구독을 확인할 수 있습니다.
   + **자동 확인** - 엔드포인트는 `SubscribeURL`에 **HTTP GET 요청**을 전송하여 구독을 자동으로 확인할 수 있습니다.

     이 방법은 수동 개입이 필요하지 않습니다.
   + **수동 확인** - 자동 확인이 설정되지 않은 경우 확인 메시지에서 **`SubscribeURL`**을 **복사**하여 브라우저의 주소 표시줄에 **붙여 넣습니다**.

     그러면 구독이 수동으로 확인됩니다.

1. Amazon SNS 콘솔을 사용하여 **구독 상태**를 확인할 수도 있습니다.

   1. [Amazon SNS 콘솔](https://console.aws.amazon.com/sns/home)에 로그인합니다.

   1. 탐색 창에서 **Subscriptions**를 선택합니다.

   1. 목록에서 **구독**을 찾습니다.
      + 확인되면 `SubscriptionArn`이 표시됩니다.
      + 여전히 확인되지 않은 경우 `PendingConfirmation`으로 표시됩니다.

# 4단계: Amazon SNS 구독의 전송 정책 설정(선택 사항)
<a name="SendMessageToHttp.retry"></a>

기본 설정에서 메시지의 초기 전송이 실패할 경우 Amazon SNS는 최대 3회 재시도를 실시하며 실패한 시도 사이에 설정된 지연 시간은 20초입니다. [1단계](SendMessageToHttp.prepare.md)에서 논의되었듯 엔드포인트는 재시도되는 메시지를 처리할 수 있는 코드를 보유해야 합니다. 사용자는 주제 또는 구독에 대한 전송 정책을 설정함으로써 Amazon SNS가 전송 실패 메시지를 재전송하는 빈도 및 간격을 제어할 수 있습니다. `DeliveryPolicy`에서 HTTP/S 알림의 콘텐츠 유형을 지정할 수도 있습니다. 자세한 내용은 [HTTP/S 전송 정책 생성](sns-message-delivery-retries.md#creating-delivery-policy) 단원을 참조하십시오.

# 5단계: 사용자에게 Amazon SNS 주제를 게시할 권한 부여(선택 사항)
<a name="SendMessageToHttp.iam.permissions"></a>

기본 설정에서 주제 소유자는 주제를 게시할 권한을 갖습니다. 다른 사용자 또는 애플리케이션이 주제에 게시할 수 있도록 하려면 AWS Identity and Access Management (IAM)을 사용하여 주제에 대한 게시 권한을 부여해야 합니다. IAM 사용자에게 Amazon SNS 작업에 대한 권한을 부여하는 방법에 대한 자세한 정보는 [Amazon SNS로 자격 증명 기반 정책 사용](sns-using-identity-based-policies.md)에서 확인하세요.

주제에 대한 액세스를 제어하는 다음의 두 가지 방법이 있습니다.
+ IAM 사용자 또는 그룹에 정책을 추가합니다. 사용자에게 주제에 대한 권한을 부여하는 가장 간단한 방법은 그룹을 생성하고 그룹에 적절한 정책을 추가한 후 사용자를 추가하는 것입니다. 그룹에서 사용자를 추가하거나 제거하는 것이 각각의 사용자에 대해 설정한 정책을 추적하는 것보다 훨씬 쉽습니다.
+ 주제에 정책을 추가합니다. 또 다른 AWS 계정에 주제에 대한 권한을 부여하고자 할 경우 사용할 수 있는 유일한 방법은 권한을 부여하고자 하는 AWS 계정 이 주체인 정책을 추가하는 것입니다.

사용자는 대부분의 경우 첫 번째 방법을 사용해야 합니다(그룹에 정책을 적용하여 해당 그룹에 적절한 사용자를 추가 및 제거함으로써 사용자에 대한 권한을 관리). 또 다른 계정의 사용자에게 권한을 부여해야할 경우에는 두 번째 방법을 사용합니다.

IAM 사용자 또는 그룹에 다음의 정책을 추가할 경우 해당 사용자 또는 그룹 구성원에게 MyTopic에 대한 `sns:Publish` 작업을 수행할 권한을 부여할 것입니다.

```
{
  "Statement":[{
    "Sid":"AllowPublishToMyTopic",
    "Effect":"Allow",
    "Action":"sns:Publish",
    "Resource":"arn:aws:sns:us-east-2:123456789012:MyTopic"
  }]
}
```

다음의 정책 예제는 또 다른 계정에 주제에 대한 권한을 부여하는 방법을 나타냅니다.

**참고**  
계정의 리소스에 대한 다른 AWS 계정 액세스 권한을 부여하면 해당 리소스에 대한 관리자 수준 액세스(와일드카드 액세스) 권한이 있는 IAM 사용자에게도 부여됩니다. 다른 계정의 다른 모든 IAM 사용자는 자동으로 사용자 리소스에 대한 액세스가 거부됩니다. 해당의 특정 IAM 사용자에게 리소스에 대한 AWS 계정 액세스 권한을 부여하려면 계정 또는 관리자 수준 액세스 권한이 있는 IAM 사용자가 리소스에 대한 권한을 해당 IAM 사용자에게 위임해야 합니다. 교차 계정 위임에 대한 자세한 정보는 [IAM 사용 가이드](https://docs.aws.amazon.com/IAM/latest/UserGuide/Delegation.html)의 *교차 계정 액세스 권한 사용*을 참조하세요.

계정 123456789012의 주제 MyTopic에 대해 다음의 정책을 추가했을 경우 사용자는 계정 111122223333에 해당 주제에 대한 `sns:Publish` 작업을 수행할 권한을 부여했을 것입니다.

```
{
  "Statement":[{
    "Sid":"Allow-publish-to-topic",
    "Effect":"Allow",
      "Principal":{
        "AWS":"111122223333"
      },
    "Action":"sns:Publish",
    "Resource":"arn:aws:sns:us-east-2:123456789012:MyTopic"
  }]
}
```

# 6단계: HTTP/HTTPS 엔드포인트에 Amazon SNS 메시지 전송
<a name="SendMessageToHttp.publish"></a>

주제를 게시함으로써 주제의 구독에 메시지를 전송할 수 있습니다. 주제에 게시하려면 Amazon SNS 콘솔, `[sns-publish](https://docs.aws.amazon.com/cli/latest/reference/sns/publish.html)` CLI 명령 또는 `[Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)` API 작업을 사용할 수 있습니다.

[1단계](SendMessageToHttp.prepare.md)를 따랐다면 엔드포인트에 배포한 코드는 알림을 처리해야 합니다.

**Amazon SNS 콘솔을 사용하여 주제를 게시하려면**

1. 주제에 게시할 권한이 있는 AWS 계정 또는 IAM 사용자의 자격 증명을 사용하여에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/sns/](https://console.aws.amazon.com/sns/home) Amazon SNS 콘솔을 엽니다.

1. 탐색 창에서 **주제(Topics)**를 선택한 후 주제를 선택합니다.

1. **메시지 게시(Publish message)** 버튼을 선택합니다.

1. **제목(Subject)** 상자에 제목을 입력합니다(예: **Testing publish to my endpoint**).

1. **메시지(Message)** 상자에 텍스트를 입력하고(예: **Hello world\$1**), **메시지 게시(Publish message)**를 선택합니다.

    “메시지가 성공적으로 게시되었습니다”라는 메시지가 나타납니다.

# Amazon SNS 메시지의 서명 확인
<a name="sns-verify-signature-of-message"></a>

Amazon SNS는 메시지 서명을 사용하여 HTTP 엔드포인트로 전송된 메시지의 신뢰성을 확인합니다. 메시지 무결성을 보장하고 스푸핑을 방지하려면 Amazon SNS 메시지를 처리하기 전에 서명을 **확인해야 합니다**.

**Amazon SNS 서명은 언제 확인해야 하나요?**

다음 시나리오에서 Amazon SNS 메시지 서명을 확인해야 합니다.
+ Amazon SNS가 HTTP(S) 엔드포인트에 알림 메시지를 보내는 경우.
+ [https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html) 또는 [https://docs.aws.amazon.com/sns/latest/api/API_Unsubscribe.html](https://docs.aws.amazon.com/sns/latest/api/API_Unsubscribe.html) API 직접 호출 후 Amazon SNS가 엔드포인트에 확인 메시지를 보내는 경우.

**Amazon SNS는 다음 두 가지 서명 버전을 지원합니다.**
+ SignatureVersion1 - 메시지의 SHA1 해시를 사용합니다.
+ SignatureVersion2 - 메시지의 SHA256 해시를 사용합니다. 이는 더 강력한 보안을 제공하며 권장되는 옵션입니다.

**SNS 메시지 서명을 올바르게 확인하려면 다음 모범 사례를 따르세요.**
+ 무단 가로채기 공격을 방지하려면 항상 HTTPS를 사용하여 서명 인증서를 검색합니다.
+ Amazon SNS에서 인증서를 발급했는지 확인합니다.
+ 인증서의 신뢰 체인이 유효한지 확인합니다.
+ 인증서는 SNS 서명 URL에서 가져와야 합니다.
+ 검증 없이 메시지에 제공된 인증서를 신뢰하지 마세요.
+ 스푸핑을 방지하기 위해 예상치 못한 `TopicArn`이 포함된 모든 메시지를 거부합니다.
+ Amazon SNS용 AWS SDKs는 내장된 검증 로직을 제공하므로 구현이 잘못될 위험이 줄어듭니다.

# Amazon SNS 주제의 메시지 서명 버전 구성
<a name="sns-verify-signature-of-message-configure-message-signature"></a>

Amazon SNS 주제에서 메시지 서명 버전을 구성하면 메시지 확인 프로세스의 보안 및 호환성을 향상시킬 수 있습니다.

메시지 서명에 사용되는 해싱 알고리즘을 제어하려면 `SignatureVersion`**1**(SHA1)과 `SignatureVersion`**2**(SHA256) 중에서 선택합니다. 기본적으로 Amazon SNS 주제는 `SignatureVersion`**1**을 사용합니다. [https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html) API 작업을 사용하여 이 설정을 구성할 수 있습니다.

다음 코드 예제를 사용하여 AWS CLI로 주제 속성 `SignatureVersion`을 설정합니다.

```
aws sns set-topic-attributes \
    --topic-arn arn:aws:sns:us-east-2:123456789012:MyTopic \
    --attribute-name SignatureVersion \
    --attribute-value 2
```

# HTTP 쿼리 기반 요청을 사용할 때 Amazon SNS 메시지의 서명 확인
<a name="sns-verify-signature-of-message-verify-message-signature"></a>

HTTP 쿼리 기반 요청을 사용할 때 Amazon SNS 메시지의 서명을 확인하면 메시지의 신뢰성과 무결성이 보장됩니다. 이 프로세스는 메시지가 Amazon SNS에서 시작되었으며 전송 중에 변조되지 않았음을 확인합니다. 메시지를 구문 분석하고, 서명할 올바른 문자열을 구성하고, 신뢰할 수 있는 퍼블릭 키에 대해 서명을 검증하면 스푸핑 및 무단 메시지 변경으로부터 시스템을 보호할 수 있습니다.

1. Amazon SNS가 전송한 HTTP POST 요청 본문의 JSON 문서에서 **이름/값 쌍**을 추출합니다. 이러한 필드는 **서명할 문자열**을 구성하는 데 필요합니다.
   + `Message`
   + `Subject`(있는 경우)
   + `MessageId`
   + `Timestamp`
   + `TopicArn`
   + `Type`

   예제:

   ```
   MESSAGE_FILE="message.json"
   FIELDS=("Message" "MessageId" "Subject" "Timestamp" "TopicArn" "Type")
   ```
**참고**  
필드에 이스케이프된 문자(예: `\n`)가 포함된 경우 정확히 일치하도록 **원래 형식**으로 변환합니다.

1. Amazon SNS 메시지에서 `SigningCertURL` 필드를 찾습니다. 이 인증서에는 메시지 서명을 확인하는 데 필요한 퍼블릭 키가 포함되어 있습니다. 예제:

   ```
   SIGNING_CERT_URL=$(jq -r '.SigningCertURL' "$MESSAGE_FILE")
   ```

1. `SigningCertURL`가 신뢰할 수 있는 AWS 도메인(예: https://sns.us-east-1.amazonaws.com)에서 왔는지 확인합니다. 보안상의 이유로 ** AWS 도메인 외부**URLs을 거부합니다.

1. 제공된 URL에서 **X.509 인증서**를 다운로드합니다. 예제:

   ```
   curl -s "$SIGNING_CERT_URL" -o signing_cert.pem
   ```

1. X.509 인증서로부터 **퍼블릭 키**를 추출합니다. 퍼블릭 키를 사용하면 메시지의 서명을 해독하고 무결성을 확인할 수 있습니다. 예제:

   ```
   openssl x509 -pubkey -noout -in signing_cert.pem > public_key.pem
   ```

1. 다양한 메시지 유형에는 서명할 문자열의 키-값 쌍이 서로 달라야 합니다. **메시지 유형**(Amazon SNS 메시지의 `Type` 필드)을 식별하여 포함할 **키-값 쌍**을 결정합니다.
   + **알림 메시지** - `Message`, `MessageId`, `Subject`(있는 경우), `Timestamp`, `TopicArn` 및 `Type`을 포함합니다.
   + **SubscriptionConfirmation** 또는 **UnsubscribeConfirmation 메시지** - `Message`, `MessageId`, `SubscribeURL`, `Timestamp`, `Token`, `TopicArn` 및 `Type`을 포함합니다.

1. Amazon SNS에서 확인을 위해 엄격하고 고정된 필드 순서를 따르려면 문자열에 서명해야 합니다. **명시적으로 필요한 필드만 포함해야 합니다.** 추가 필드는 추가할 수 없습니다. `Subject`와 같은 선택적 필드는 메시지에 있는 경우에만 포함되어야 하며 필수 필드 순서로 정의된 정확한 위치에 표시되어야 합니다. 예제:

   ```
   KeyNameOne\nValueOne\nKeyNameTwo\nValueTwo
   ```
**중요**  
문자열 끝에 줄바꿈 문자를 추가하면 안 됩니다.

1. **키-값 쌍**을 바이트 정렬 순서로 정렬합니다(키 이름별로 알파벳순).

1. 다음 형식 예제를 사용하여 **서명할 문자열**을 구성합니다.

   ```
   STRING_TO_SIGN=""
   for FIELD in "${FIELDS[@]}"; do
       VALUE=$(jq -r --arg field "$FIELD" '.[$field]' "$MESSAGE_FILE")
       STRING_TO_SIGN+="$FIELD\n$VALUE"
       # Append a newline after each field except the last one
       if [[ "$FIELD" != "Type" ]]; then
           STRING_TO_SIGN+="\n"
       fi
   done
   ```

   **알림 메시지의 예제:**

   ```
   Message
   My Test Message
   MessageId
   4d4dc071-ddbf-465d-bba8-08f81c89da64
   Subject
   My subject
   Timestamp
   2019-01-31T04:37:04.321Z
   TopicArn
   arn:aws:sns:us-east-2:123456789012:s4-MySNSTopic-1G1WEFCOXTC0P
   Type
   Notification
   ```

   **SubscriptionConfirmation 예제:**

   ```
   Message
   Please confirm your subscription
   MessageId
   3d891288-136d-417f-bc05-901c108273ee
   SubscribeURL
   https://sns.us-east-2.amazonaws.com/...
   Timestamp
   2024-01-01T00:00:00.000Z
   Token
   abc123...
   TopicArn
   arn:aws:sns:us-east-2:123456789012:MyTopic
   Type
   SubscriptionConfirmation
   ```

1. 메시지의 `Signature` 필드는 Base64로 인코딩되어 있습니다. **원시 바이너리 형식**을 **파생된 해시**와 비교하려면 **디코딩**해야 합니다. 예제:

   ```
   SIGNATURE=$(jq -r '.Signature' "$MESSAGE_FILE")
   echo "$SIGNATURE" | base64 -d > signature.bin
   ```

1. `SignatureVersion` 필드를 사용하여 해시 알고리즘을 선택합니다.
   + `SignatureVersion`**1**의 경우 **SHA1**(예: `-sha1`)을 사용합니다.
   + `SignatureVersion`**2**의 경우 **SHA256**(예: `-sha256`)을 사용합니다.

1. Amazon SNS 메시지의 신뢰성을 확인하려면 구성된 문자열의 **해시**를 생성하고 **퍼블릭 키**를 사용하여 서명을 확인합니다.

   ```
   openssl dgst -sha256 -verify public_key.pem -signature signature.bin <<< "$STRING_TO_SIGN"
   ```

   서명이 유효한 경우 출력은 `Verified OK`입니다. 그렇지 않으면 출력은 `Verification Failure`입니다.

## 오류 처리가 포함된 스크립트 예제
<a name="sns-verify-signature-of-message-example"></a>

다음 예제 스크립트는 확인 프로세스를 자동화합니다.

```
#!/bin/bash

# Path to the local message file
MESSAGE_FILE="message.json"

# Extract the SigningCertURL and Signature from the message
SIGNING_CERT_URL=$(jq -r '.SigningCertURL' "$MESSAGE_FILE")
SIGNATURE=$(jq -r '.Signature' "$MESSAGE_FILE")

# Fetch the X.509 certificate
curl -s "$SIGNING_CERT_URL" -o signing_cert.pem

# Extract the public key from the certificate
openssl x509 -pubkey -noout -in signing_cert.pem > public_key.pem

# Define the fields to include in the string to sign
FIELDS=("Message" "MessageId" "Subject" "Timestamp" "TopicArn" "Type")

# Initialize the string to sign
STRING_TO_SIGN=""

# Iterate over the fields to construct the string to sign
for FIELD in "${FIELDS[@]}"; do
    VALUE=$(jq -r --arg field "$FIELD" '.[$field]' "$MESSAGE_FILE")
    STRING_TO_SIGN+="$FIELD\n$VALUE"
    # Append a newline after each field except the last one
    if [[ "$FIELD" != "Type" ]]; then
        STRING_TO_SIGN+="\n"
    fi
done

# Verify the signature
echo -e "$STRING_TO_SIGN" | openssl dgst -sha256 -verify public_key.pem -signature <(echo "$SIGNATURE" | base64 -d)
```

# Amazon SNS 메시지 형식 구문 분석
<a name="sns-message-and-json-formats"></a>

Amazon SNS가 HTTP/HTTPS 엔드포인트로 메시지를 전송할 때 HTTP 헤더와 JSON 메시지 본문이 모두 포함됩니다. 이러한 메시지는 메시지 유형, 주제 ARN, 타임스탬프 및 디지털 서명과 같은 메타데이터를 포함하는 구조화된 형식을 따릅니다. Amazon SNS 메시지를 올바르게 구문 분석하면 메시지가 구독 확인, 알림 또는 구독 취소 확인인지 확인하고, 관련 데이터를 추출하고, 서명 검증을 사용하여 신뢰성을 확인할 수 있습니다.

# HTTP/HTTPS 헤더
<a name="http-header"></a>

Amazon SNS가 구독 확인, 알림 또는 구독 해지 확인 메시지를 HTTP/HTTPS 엔드포인트에 전송할 때 Amazon SNS에 특정한 여러 헤더 값과 함께 POST 메시지를 전송합니다. 이러한 작업의 헤더 값을 사용하면 `Type` 값을 읽기 위해 JSON 메시지 본문을 구문 분석할 필요 없이 메시지 유형을 파악할 수 있습니다. 기본적으로 Amazon SNS는 `text/plain; charset=UTF-8`로 설정된 `Content-Type`로 모든 알림을 HTTP/S 엔드포인트로 전송합니다. 텍스트/일반(기본값) 외 `Content-Type`을 선택하려면 [HTTP/S 전송 정책 생성](sns-message-delivery-retries.md#creating-delivery-policy)의 `headerContentType`를 참조하세요.

**`x-amz-sns-message-type`**  
메시지 유형. 가능한 값은 `SubscriptionConfirmation`, `Notification`, `UnsubscribeConfirmation`입니다.

**`x-amz-sns-message-id`**  
범용 고유 식별자(UUID)로 게시되는 각 메시지마다 고유합니다. 재시도 중에 Amazon SNS가 재전송하는 알림의 경우 원본 메시지의 메시지 ID가 사용됩니다.

**`x-amz-sns-topic-arn`**  
이 메시지가 게시된 주제에 대한 Amazon Resource Name(ARN)입니다.

**`x-amz-sns-subscription-arn`**  
이 엔드포인트에 대한 구독의 ARN입니다.

다음의 HTTP POST 헤더는 HTTP 엔드포인트에 대한 `Notification` 메시지 헤더의 예입니다.

```
POST / HTTP/1.1
x-amz-sns-message-type: Notification
x-amz-sns-message-id: 165545c9-2a5c-472c-8df2-7ff2be2b3b1b
x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55
Content-Length: 1336
Content-Type: text/plain; charset=UTF-8
Host: myhost.example.com
Connection: Keep-Alive
User-Agent: Amazon Simple Notification Service Agent
```

# HTTP/HTTPS 구독 확인 JSON 형식
<a name="http-subscription-confirmation-json"></a>

사용자가 HTTP/HTTPS 엔드포인트를 구독한 후에 Amazon SNS는 구독 확인 메시지를 HTTP/HTTPS 엔드포인트에 전송합니다. 이 메시지는 구독을 확인하기 위해 방문해야 하는 `SubscribeURL` 값을 담고 있습니다(또는, `Token` 값을 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html)과 함께 사용할 수 있습니다).

**참고**  
Amazon SNS는 구독이 확인되기 전에는 알림을 이 엔드포인트로 전송하지 않습니다.

구독 확인 메시지는 다음의 이름/값 쌍을 갖는 JSON 문서를 포함하는 메시지 본문으로 된 POST 메시지입니다.

**`Type`**  
메시지 유형. 구독 확인의 경우 유형은 `SubscriptionConfirmation`입니다.

**`MessageId`**  
범용 고유 식별자(UUID)로 게시되는 각 메시지마다 고유합니다. 재시도 중에 Amazon SNS가 재전송하는 메시지의 경우 원본 메시지의 메시지 ID가 사용됩니다.

**`Token`**  
구독 확인을 위해 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 작업에 사용할 수 있는 값입니다. 또는, 간단히 `SubscribeURL`을 방문하면 됩니다.

**`TopicArn`**  
이 메시지가 구독된 주제에 대한 Amazon Resource Name(ARN)입니다.

**`Message`**  
메시지를 설명하는 문자열입니다. 구독 확인의 경우 이 문자열은 다음과 같습니다.  

```
You have chosen to subscribe to the topic arn:aws:sns:us-east-2:123456789012:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.
```

**`SubscribeURL`**  
구독 확인을 위해 방문해야 하는 URL입니다. 또는 `Token`을 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 작업으로 사용하여 구독을 확인하면 됩니다.

**`Timestamp`**  
구독 확인이 전송된 시간(GMT)입니다.

**`SignatureVersion`**  
사용한 Amazon SNS 서명의 버전입니다.  
+ `SignatureVersion`이 **1**인 경우, `Signature`는, `Message`, `MessageId`, `Type`, `Timestamp`, 및 `TopicArn` 값의 Base64로 인코딩된 `SHA1withRSA` 서명입니다.
+ `SignatureVersion`이 **2**인 경우, `Signature`는 `Message`, `MessageId`, `Type`, `Timestamp` 및 `TopicArn` 값의 Base64로 인코딩된 `SHA256withRSA` 서명입니다.

**`Signature`**  
`Message`, `MessageId`, `Type`, `Timestamp`, 및 `TopicArn` 값의 Base64로 인코딩된 `SHA1withRSA` 또는 `SHA256withRSA` 서명입니다.

**`SigningCertURL`**  
메시지에 서명하기 위해 사용된 인증서의 URL입니다.

다음의 HTTP POST 메시지는 HTTP 엔드포인트에 대한 `SubscriptionConfirmation` 메시지의 예입니다.

```
POST / HTTP/1.1
x-amz-sns-message-type: SubscriptionConfirmation
x-amz-sns-message-id: 165545c9-2a5c-472c-8df2-7ff2be2b3b1b
x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
Content-Length: 1336
Content-Type: text/plain; charset=UTF-8
Host: myhost.example.com
Connection: Keep-Alive
User-Agent: Amazon Simple Notification Service Agent

{
  "Type" : "SubscriptionConfirmation",
  "MessageId" : "165545c9-2a5c-472c-8df2-7ff2be2b3b1b",
  "Token" : "2336412f37...",
  "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
  "Message" : "You have chosen to subscribe to the topic arn:aws:sns:us-west-2:123456789012:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.",
  "SubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:MyTopic&Token=2336412f37...",
  "Timestamp" : "2012-04-26T20:45:04.751Z",
  "SignatureVersion" : "1",
  "Signature" : "EXAMPLEpH+DcEwjAPg8O9mY8dReBSwksfg2S7WKQcikcNKWLQjwu6A4VbeS0QHVCkhRS7fUQvi2egU3N858fiTDN6bkkOxYDVrY0Ad8L10Hs3zH81mtnPk5uvvolIC1CXGu43obcgFxeL3khZl8IKvO61GWB6jI9b5+gLPoBc1Q=",
  "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
}
```

# HTTP/HTTPS 알림 JSON 형식
<a name="http-notification-json"></a>

Amazon SNS가 구독된 HTTP 또는 HTTPS 엔드포인트에 알림을 전송할 때 엔드포인트에 전송된 POST 메시지는 다음의 이름/값 쌍으로 된 JSON 문서를 구성하는 메시지 본문을 보유합니다.

**`Type`**  
메시지 유형. 알림의 경우 유형은 `Notification`입니다.

**`MessageId`**  
범용 고유 식별자(UUID)로 게시되는 각 메시지마다 고유합니다. 재시도 중에 Amazon SNS가 재전송하는 알림의 경우 원본 메시지의 메시지 ID가 사용됩니다.

**`TopicArn`**  
이 메시지가 게시된 주제에 대한 Amazon Resource Name(ARN)입니다.

**`Subject`**  
알림이 주제에 게시되었을 때 `Subject` 매개 변수입니다.  
이는 선택 가능한 파라미터입니다. `Subject`이 지정되지 않을 경우에는 이 이름-값 쌍은 본 JSON 문서에 표시되지 않습니다.

**`Message`**  
알림이 주제에 게시되었을 때 지정되는 `Message` 값입니다.

**`Timestamp`**  
알림이 게시된 시간(GMT)입니다.

**`SignatureVersion`**  
사용한 Amazon SNS 서명의 버전입니다.  
+ `SignatureVersion`이 **1**인 경우, `Signature`는 `Message`, `MessageId`, `Subject`(있는 경우), `Type`, `Timestamp`, `TopicArn` 값의 Base64로 인코딩된 `SHA1withRSA` 서명입니다.
+ `SignatureVersion`가 **2**인 경우, `Signature`는 `Message`, `MessageId`, `Subject`(있는 경우), `Type`, `Timestamp`, `TopicArn` 값의 Base64로 인코딩된 `SHA256withRSA` 서명입니다.

**`Signature`**  
`Message`, `MessageId`, `Subject`(있는 경우), `Type`, `Timestamp`, `TopicArn` 값의 Base64로 인코딩된 `SHA1withRSA` 또는 `SHA256withRSA` 서명입니다.

**`SigningCertURL`**  
메시지에 서명하기 위해 사용된 인증서의 URL입니다.

**`UnsubscribeURL`**  
이 주제에서 엔드포인트를 구독 해지하는데 사용하는 URL입니다. 이 URL을 방문하면 Amazon SNS는 엔드포인트를 구독 해지하고 이 엔드포인트로 전송하는 알림을 중지합니다.

다음의 HTTP POST 메시지는 HTTP 엔드포인트에 대한 `Notification` 메시지의 예입니다.

```
POST / HTTP/1.1
x-amz-sns-message-type: Notification
x-amz-sns-message-id: 22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324
x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:c9135db0-26c4-47ec-8998-413945fb5a96
Content-Length: 773
Content-Type: text/plain; charset=UTF-8
Host: myhost.example.com
Connection: Keep-Alive
User-Agent: Amazon Simple Notification Service Agent

{
  "Type" : "Notification",
  "MessageId" : "22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324",
  "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
  "Subject" : "My First Message",
  "Message" : "Hello world!",
  "Timestamp" : "2012-05-02T00:54:06.655Z",
  "SignatureVersion" : "1",
  "Signature" : "EXAMPLEw6JRN...",
  "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem",
  "UnsubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:123456789012:MyTopic:c9135db0-26c4-47ec-8998-413945fb5a96"
  }
```

# HTTP/HTTPS 구독 해지 확인 JSON 형식
<a name="http-unsubscribe-confirmation-json"></a>

주제에서 HTTP/HTTPS 엔드포인트가 구독 해지된 후 Amazon SNS는 엔드포인트에 구독 해지 확인 메시지를 전송합니다.

구독 해지 확인 메시지는 다음의 이름/값 쌍을 갖는 JSON 문서를 포함하는 메시지 본문으로 된 POST 메시지입니다.

**`Type`**  
메시지 유형. 구독 해지 확인의 경우 유형은 `UnsubscribeConfirmation`입니다.

**`MessageId`**  
범용 고유 식별자(UUID)로 게시되는 각 메시지마다 고유합니다. 재시도 중에 Amazon SNS가 재전송하는 메시지의 경우 원본 메시지의 메시지 ID가 사용됩니다.

**`Token`**  
구독 재확인을 위해 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 작업에 사용할 수 있는 값입니다. 또는, 간단히 `SubscribeURL`을 방문하면 됩니다.

**`TopicArn`**  
이 엔드포인트가 구독 해지된 주제에 대한 Amazon Resource Name(ARN)입니다.

**`Message`**  
메시지를 설명하는 문자열입니다. 구독 해지 확인의 경우 이 문자열은 다음과 같습니다.  

```
You have chosen to deactivate subscription arn:aws:sns:us-east-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55.\nTo cancel this operation and restore the subscription, visit the SubscribeURL included in this message.
```

**`SubscribeURL`**  
구독 재확인을 위해 방문해야 하는 URL입니다. 또는, 그 대신 `Token`을 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 작업으로 사용하여 구독을 재확인하면 됩니다.

**`Timestamp`**  
구독 해지 확인이 전송된 시간(GMT)입니다.

**`SignatureVersion`**  
사용한 Amazon SNS 서명의 버전입니다.  
+ `SignatureVersion`이 **1**인 경우, `Signature`는, `Message`, `MessageId`, `Type`, `Timestamp`, 및 `TopicArn` 값의 Base64로 인코딩된 `SHA1withRSA` 서명입니다.
+ `SignatureVersion`이 **2**인 경우, `Signature`는 `Message`, `MessageId`, `Type`, `Timestamp` 및 `TopicArn` 값의 Base64로 인코딩된 `SHA256withRSA` 서명입니다.

**`Signature`**  
`Message`, `MessageId`, `Type`, `Timestamp`, 및 `TopicArn` 값의 Base64로 인코딩된 `SHA1withRSA` 또는 `SHA256withRSA` 서명입니다.

**`SigningCertURL`**  
메시지에 서명하기 위해 사용된 인증서의 URL입니다.

다음의 HTTP POST 메시지는 HTTP 엔드포인트에 대한 `UnsubscribeConfirmation` 메시지의 예입니다.

```
POST / HTTP/1.1
x-amz-sns-message-type: UnsubscribeConfirmation
x-amz-sns-message-id: 47138184-6831-46b8-8f7c-afc488602d7d
x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55
Content-Length: 1399
Content-Type: text/plain; charset=UTF-8
Host: myhost.example.com
Connection: Keep-Alive
User-Agent: Amazon Simple Notification Service Agent

{
  "Type" : "UnsubscribeConfirmation",
  "MessageId" : "47138184-6831-46b8-8f7c-afc488602d7d",
  "Token" : "2336412f37...",
  "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
  "Message" : "You have chosen to deactivate subscription arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55.\nTo cancel this operation and restore the subscription, visit the SubscribeURL included in this message.",
  "SubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:MyTopic&Token=2336412f37fb6...",
  "Timestamp" : "2012-04-26T20:06:41.581Z",
  "SignatureVersion" : "1",
  "Signature" : "EXAMPLEHXgJm...",
  "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
}
```

# SetSubscriptionAttributes 전송 정책 JSON 형식
<a name="set-sub-attributes-delivery-policy-json"></a>

`SetSubscriptionAttributes` 작업에 요청을 전송하고 `DeliveryPolicy`의 값에 대해 `AttributeName` 매개 변수를 설정할 경우, `AttributeValue` 매개 변수의 값은 유효한 JSON 객체이어야 합니다. 예를 들어, 다음의 예는 최대 5회 재시도하도록 전송 정책을 설정합니다.

```
http://sns.us-east-2.amazonaws.com/
?Action=SetSubscriptionAttributes
&SubscriptionArn=arn%3Aaws%3Asns%3Aus-east-2%3A123456789012%3AMy-Topic%3A80289ba6-0fd4-4079-afb4-ce8c8260f0ca
&AttributeName=DeliveryPolicy
&AttributeValue={"healthyRetryPolicy":{"numRetries":5}}
...
```

`AttributeValue` 매개 변수의 값에 다음의 JSON 형식을 사용합니다.

```
{
    "healthyRetryPolicy" : {
        "minDelayTarget" :  int,
        "maxDelayTarget" : int,
        "numRetries" : int,
        "numMaxDelayRetries" : int,
        "backoffFunction" : "linear|arithmetic|geometric|exponential"
    },
    "throttlePolicy" : {
        "maxReceivesPerSecond" : int
    },
    "requestPolicy" : {
        "headerContentType" : "text/plain | application/json | application/xml"
    }
}
```

`SetSubscriptionAttribute` 작업에 대한 자세한 내용을 확인하려면 *Amazon Simple Notification Service API 참조*의 [SetTopicAttributes](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html)로 이동하세요. 지원되는 HTTP 콘텐츠 유형 헤더에 대한 자세한 내용은 [HTTP/S 전송 정책 생성](sns-message-delivery-retries.md#creating-delivery-policy)을 참조하세요.

# SetTopicAttributes 전송 정책 JSON 형식
<a name="set-topic-attributes-delivery-policy-json"></a>

`SetTopicAttributes` 작업에 요청을 전송하고 `DeliveryPolicy`의 값에 대해 `AttributeName` 매개 변수를 설정할 경우, `AttributeValue` 매개 변수의 값은 유효한 JSON 객체이어야 합니다. 예를 들어, 다음의 예는 최대 5회 재시도하도록 전송 정책을 설정합니다.

```
http://sns.us-east-2.amazonaws.com/
?Action=SetTopicAttributes
&TopicArn=arn%3Aaws%3Asns%3Aus-east-2%3A123456789012%3AMy-Topic
&AttributeName=DeliveryPolicy
&AttributeValue={"http":{"defaultHealthyRetryPolicy":{"numRetries":5}}}
...
```

`AttributeValue` 매개 변수의 값에 다음의 JSON 형식을 사용합니다.

```
{
    "http" : {
        "defaultHealthyRetryPolicy" : {
            "minDelayTarget":  int,
            "maxDelayTarget": int,
            "numRetries": int,
            "numMaxDelayRetries": int,
            "backoffFunction": "linear|arithmetic|geometric|exponential"
        },
        "disableSubscriptionOverrides" : Boolean,
        "defaultThrottlePolicy" : {
            "maxReceivesPerSecond" : int
        },
        "defaultRequestPolicy" : {
            "headerContentType" : "text/plain | application/json | application/xml"
        }
    }
}
```

`SetTopicAttribute` 작업에 대한 자세한 내용을 확인하려면 *Amazon Simple Notification Service API 참조*의 [SetTopicAttributes](https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html)로 이동하세요. 지원되는 HTTP 콘텐츠 유형 헤더에 대한 자세한 내용은 [HTTP/S 전송 정책 생성](sns-message-delivery-retries.md#creating-delivery-policy)을 참조하세요.