

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

# Amazon SNS로 모바일 푸시 알림 전송
<a name="sns-mobile-application-as-subscriber"></a>

Amazon SNS를 사용하면 모바일 디바이스의 앱으로 푸시 알림 메시지를 직접 보낼 수 있습니다. 모바일 엔드포인트에 전송된 푸시 알림 메시지는 모바일 앱에서 메시지 알림, 배지 업데이트 또는 사운드 알림으로 나타날 수 있습니다.

![\[Amazon SNS 모바일 푸시 알림 개요\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-mobile-push-notifications.png)


**Topics**
+ [Amazon SNS 사용자 알림 작동 방식](#sns-how-user-notifications-work)
+ [Amazon SNS를 이용한 푸시 알림 설정하기](#sns-user-notifications-process-overview)
+ [Amazon SNS에서 모바일 앱 설정](mobile-push-send.md)
+ [모바일 푸시 알림에 Amazon SNS 사용](mobile-push-notifications.md)
+ [Amazon SNS 모바일 앱 속성](sns-msg-status.md)
+ [모바일 애플리케이션에 대한 Amazon SNS 애플리케이션 이벤트 알림](application-event-notifications.md)
+ [모바일 푸시 API 작업](mobile-push-api.md)
+ [일반적인 Amazon SNS 모바일 푸시 API 오류](mobile-push-api-error.md)
+ [모바일 푸시 알림에 Amazon SNS Time To Live(TTL) 메시지 속성 사용](sns-ttl.md)
+ [Amazon SNS 모바일 애플리케이션 지원 리전](sns-mobile-push-supported-regions.md)
+ [Amazon SNS 모바일 푸시 알림 관리 모범 사례](mobile-push-notifications-best-practices.md)

## Amazon SNS 사용자 알림 작동 방식
<a name="sns-how-user-notifications-work"></a>

푸시 알림 메시지를 모바일 디바이스와 데스크톱 모두로 전송하려면 아래의 지원되는 푸시 알림 서비스 중 하나를 사용합니다.
+ Amazon Device Messaging(ADM)
+ iOS 및 Mac OS X용 Apple 푸시 알림 서비스(APNS)
+ Baidu 클라우드 푸시(Baidu)
+ Firebase Cloud Messaging(FCM)
+ Windows Phone용 Microsoft 푸시 알림 서비스(MPNS)
+ Windows 푸시 알림 서비스(WNS)

APNS 및 FCM과 같은 푸시 알림 서비스는 이러한 서비스를 사용하도록 등록된 해당 모바일 디바이스 및 각 앱과 연결을 유지합니다. 앱과 모바일 디바이스가 등록되면 푸시 알림 서비스는 디바이스 토큰을 반환합니다. Amazon SNS는 디바이스 토큰을 사용하여 직접 푸시 알림 메시지를 보낼 수 있는 모바일 엔드포인트를 생성합니다. Amazon SNS가 다른 푸시 알림 서비스와 통신할 수 있도록 허용하기 위해 Amazon SNS에 푸시 알림 서비스 자격 증명을 제출합니다. 자세한 정보는 [Amazon SNS를 이용한 푸시 알림 설정하기](#sns-user-notifications-process-overview)에서 확인하세요.

 직접 푸시 알림 메시지를 전송하는 것 외에도 주제를 구독하는 모바일 엔드포인트에 Amazon SNS를 사용하여 메시지를 보낼 수도 있습니다. [Amazon SNS란 무엇인가요?](welcome.md)에 설명된 대로 Amazon SQS, HTTP/S, 이메일, SMS 등 다른 엔드포인트 유형에서 주제를 구독하는 것과 동일한 개념입니다. 차이점은 구독 모바일 디바이스가 주제에 전송된 푸시 알림 메시지를 받도록 하기 위해 Amazon SNS가 푸시 알림 서비스를 사용하여 통신한다는 것입니다.

## Amazon SNS를 이용한 푸시 알림 설정하기
<a name="sns-user-notifications-process-overview"></a>

1. 지원하려는 모바일 플랫폼에 대한 [보안 인증 정보 및 디바이스 토큰을 얻습니다](sns-prerequisites-for-mobile-push-notifications.md).

1. 보안 인증 정보를 사용하여 Amazon SNS를 사용하는 플랫폼 애플리케이션 객체(`PlatformApplicationArn`)를 생성합니다. 자세한 내용은 [Amazon SNS 플랫폼 애플리케이션 만들기](mobile-push-send-register.md) 섹션을 참조하세요.

1. 반환된 보안 인증 정보를 사용하여 푸시 알림 서비스로부터 모바일 앱 및 디바이스의 디바이스 토큰을 요청합니다. 받은 토큰은 해당 모바일 앱과 디바이스를 나타냅니다.

1. 디바이스 토큰 및 `PlatformApplicationArn`을 사용하여 Amazon SNS를 사용하는 플랫폼 엔드포인트 객체(`EndpointArn`)를 생성합니다. 자세한 정보는 [모바일 알림용 Amazon SNS 플랫폼 엔드포인트 설정](mobile-platform-endpoint.md)에서 확인하세요.

1. `EndpointArn`을 사용하여 [모바일 디바이스의 앱에 메시지를 게시](mobile-push-send.md)합니다. 자세한 내용은 [Direct Amazon SNS 모바일 디바이스 메시징](mobile-push-notifications.md#mobile-push-send-directmobile) 및 Amazon Simple Notification Service API 참조의 [게시](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html) API를 참조하세요.

# Amazon SNS에서 모바일 앱 설정
<a name="mobile-push-send"></a>

이 주제에서는 [Amazon SNS 사용자 알림에 대한 사전 조건](sns-prerequisites-for-mobile-push-notifications.md) 페이지에 설명된 정보를 사용하여 AWS Management Console에서 모바일 애플리케이션을 설정하는 방법에 대해 설명합니다.

# Amazon SNS 사용자 알림에 대한 사전 조건
<a name="sns-prerequisites-for-mobile-push-notifications"></a>

Amazon SNS 모바일 푸시 알림을 사용하려면 다음과 같이 하세요.
+ 지원되는 푸시 알림 서비스(ADM, APN, Baidu, FCM, MPNS 또는 WNS) 중 하나에 연결하기 위한 자격 증명 집합
+ 모바일 앱 및 디바이스를 위한 디바이스 토큰 또는 등록 ID
+ 모바일 엔드포인트에 알림 메시지를 보내도록 구성된 Amazon SNS
+ 지원되는 푸시 알림 서비스 중 하나를 사용하도록 등록 및 구성된 모바일 앱

애플리케이션을 푸시 알림 서비스에 등록하려면 여러 단계를 수행해야 합니다. Amazon SNS가 모바일 엔드포인트로 직접 푸시 알림 메시지를 보내도록 하려면 푸시 알림 서비스에 몇 가지 정보를 제공해야 합니다. 일반적으로 푸시 알림 서비스에 연결하기 위한 자격 증명, 푸시 알림 서비스로부터 받은 디바이스 토큰 또는 등록 ID(해당 모바일 디바이스 및 모바일 앱의 ID) 및 푸시 알림 서비스에 등록된 모바일 앱이 필요합니다.

자격 증명이 취하는 정확한 형식은 모바일 플랫폼 간에 다르지만, 모든 경우에 플랫폼에 연결하는 동안에는 이 자격 증명을 제출해야 합니다. 모바일 앱마다 자격 증명 집합 하나가 발급되며, 이는 해당 앱의 인스턴스에 메시지를 보내는 데 사용해야 합니다.

구체적인 이름은 사용하는 푸시 알림 서비스에 따라 다릅니다. 예를 들어, APN을 푸시 알림 서비스로 사용할 경우 *디바이스 토큰*이 필요합니다. 또는 FCM을 사용할 때에는 디바이스 토큰에 해당하는 것을 *등록 ID*라고 합니다. *디바이스 토큰* 또는 *등록 ID*는 모바일 디바이스의 운영 체제에서 애플리케이션에 보내는 문자열입니다. 특정 모바일 디바이스에서 실행되는 모바일 앱의 인스턴스를 고유하게 식별하며, 이 앱-디바이스 쌍의 고유한 식별자라고 생각하면 됩니다.

Amazon SNS는 플랫폼 애플리케이션 리소스로 다른 몇 개의 설정과 함께 자격 증명을 저장합니다. 몇 가지 추가 설정이 있는 디바이스 토큰이 *플랫폼 엔드포인트*라는 객체로 표시됩니다. 각 플랫폼 엔드포인트는 한 개의 특정 플랫폼 애플리케이션에 속하며, 모든 플랫폼 엔드포인트는 해당 플랫폼 애플리케이션에 저장된 자격 증명을 사용해 통신할 수 있습니다.

다음 섹션에서는 지원되는 각각의 푸시 알림 서비스에 대한 필수 조건을 설명합니다. 필수 정보를 가져온 후에는 AWS Management Console 또는 Amazon SNS 모바일 푸시 APIs. 자세한 내용은 [Amazon SNS를 이용한 푸시 알림 설정하기](sns-mobile-application-as-subscriber.md#sns-user-notifications-process-overview) 단원을 참조하십시오.

# Amazon SNS 플랫폼 애플리케이션 만들기
<a name="mobile-push-send-register"></a>

Amazon SNS가 모바일 엔드포인트에 알림 메시지를 보내려면 직접 전송인지 주제 구독을 통한 것인지에 관계없이 반드시 플랫폼 애플리케이션을 먼저 생성해야 합니다. 앱이 AWS에 등록되면 앱과 모바일 디바이스의 엔드포인트를 만들어야 합니다. 이 엔드포인트를 사용하면 Amazon SNS가 디바이스에 메시지를 보낼 수 있습니다.

**플랫폼 애플리케이션을 생성하려면**

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

1. 탐색 창에서 **푸시 알림**을 선택합니다.

1. **Platform applications**(플랫폼 애플리케이션) 섹션에서 **Create platform application**(플랫폼 애플리케이션 생성)을 선택합니다.

1. 를 선택합니다..**AWS 리전** 모바일 애플리케이션을 생성할 수 있는 AWS 리전 목록은 [Amazon SNS 모바일 애플리케이션 지원 리전](sns-mobile-push-supported-regions.md)에서 확인하세요.

1. 다음 **애플리케이션 세부 정보**를 입력합니다.
   + **애플리케이션 이름** - 플랫폼 애플리케이션의 **이름**을 제공합니다. 작업 이름은 최대 256자까지 포함할 수 있으며, 대문자와 소문자, 숫자, 하이픈, 밑줄을 포함할 수 있습니다.
   + **푸시 알림 플랫폼** - 앱이 등록된 적절한 **알림 서비스**(예: Apple 푸시 알림 서비스(APN), Firebase Cloud Messaging(FCM))를 선택합니다.

1. 선택한 플랫폼에 따라 특정 자격 증명을 제공해야 합니다.
   + Apple 푸시 알림 서비스(**APN**)의 경우 - **토큰 기반** 인증 또는 **인증서 기반** 인증 중에서 선택합니다.
     + 토큰 기반 인증의 경우 **.p8 파일**(키체인 액세스를 통해 생성됨)을 업로드합니다.
     + 인증서 기반 인증의 경우 **.p12 파일**(키체인 액세스에서도 내보냄)을 업로드합니다.
   + Firebase Cloud Messaging(**FCM**)의 경우 - Firebase 콘솔에서 **서버 키**를 입력합니다.
   + **다른 플랫폼**(예: ADM 또는 GCM)의 경우 - 해당 **API 키** 또는 **자격 증명**을 입력합니다.

1. 필요한 세부 정보를 입력한 후 **플랫폼 애플리케이션 생성**을 선택합니다. 이 작업은 Amazon SNS에 앱을 등록하고 해당 플랫폼 애플리케이션 객체를 생성합니다.

1. 생성 시 Amazon SNS는 [https://docs.aws.amazon.com/sns/latest/api/API_PlatformApplication.html](https://docs.aws.amazon.com/sns/latest/api/API_PlatformApplication.html)(Amazon 리소스 이름)을 생성하고 반환합니다. 이 ARN은 플랫폼 애플리케이션을 고유하게 식별하며 모바일 디바이스용 엔드포인트를 생성할 때 사용됩니다.

# 모바일 알림용 Amazon SNS 플랫폼 엔드포인트 설정
<a name="mobile-platform-endpoint"></a>

앱과 모바일 디바이스가 푸시 알림 서비스(예: APN, Firebase Cloud Messaging)에 등록되면 푸시 알림 서비스는 디바이스 토큰을 반환합니다. Amazon SNS는 이 디바이스 토큰을 사용하여 디바이스의 앱에 직접 푸시 알림 메시지를 보내는 대상 역할을 하는 플랫폼 엔드포인트를 생성합니다. 플랫폼 엔드포인트는 브리지 역할을 하여 Amazon SNS가 해당 모바일 디바이스로 전송하기 위해 푸시 알림 서비스로 보낸 메시지를 라우팅합니다. 자세한 내용은 [Amazon SNS 사용자 알림에 대한 사전 조건](sns-prerequisites-for-mobile-push-notifications.md) 및 [Amazon SNS를 이용한 푸시 알림 설정하기](sns-mobile-application-as-subscriber.md#sns-user-notifications-process-overview) 섹션을 참조하세요.

## 디바이스 토큰 및 플랫폼 엔드포인트 이해
<a name="device-token-platform-endpoint"></a>

디바이스 토큰은 푸시 알림 서비스(예: APN, Firebase Cloud Messaging)에 등록된 모바일 디바이스를 식별합니다. 앱이 푸시 알림 서비스에 등록되면 해당 앱과 디바이스에 고유한 디바이스 토큰이 생성됩니다. Amazon SNS는 이 디바이스 토큰을 사용하여 해당 플랫폼 애플리케이션 내에 플랫폼 엔드포인트를 생성합니다.

플랫폼 엔드포인트를 사용하면 Amazon SNS가 푸시 알림 서비스를 통해 디바이스에 푸시 알림 메시지를 전송하여 앱과 사용자 디바이스 간의 연결을 유지할 수 있습니다.

## 플랫폼 엔드포인트 생성
<a name="mobile-platform-endpoint-create"></a>

Amazon SNS로 앱에 알림을 푸시하려면 먼저 플랫폼 엔드포인트 생성 작업을 호출해 Amazon SNS에 해당 앱의 디바이스 토큰을 등록해야 합니다. 이 작업은 플랫폼 애플리케이션의 Amazon 리소스 이름(ARN)과 디바이스 토큰을 파라미터로 취하고 생성된 플랫폼 엔드포인트의 ARN을 반환합니다.

[https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html) 작업에서는 다음과 같이 합니다.
+ 플랫폼 엔드포인트가 이미 있는 경우 다시 생성하지 않습니다. 기존 플랫폼 엔드포인트의 ARN 호출자로 돌아가세요.
+ 동일한 디바이스 토큰이지만 설정이 다른 플랫폼 엔드포인트가 이미 있는 경우 다시 생성하지 않습니다. 호출자에 예외를 발생시키세요.
+ 플랫폼 엔드포인트가 없으면 생성하세요. 새로 생성한 플랫폼 엔드포인트의 ARN 호출자로 돌아가세요.

앱이 시작할 때마다 바로 플랫폼 엔드포인트 생성 작업을 호출해서는 안 됩니다. 이 방법이 항상 작동하는 엔드포인트를 제공하는 것은 아니기 때문입니다. 이러한 상황은 예를 들면 같은 디바이스에서 앱을 제거했다가 다시 설치하고, 이에 대한 엔드포인트가 이미 있지만 비활성화된 경우에 발생할 수 있습니다. 성공적으로 등록하면 다음과 같은 결과를 얻을 수 있어야 합니다.

1. 이 앱-디바이스 조합에 대해 플랫폼 엔드포인트가 있는지 확인합니다.

1. 플랫폼 엔드포인트의 디바이스 토큰이 유효한 최신 디바이스 토큰인지 확인합니다.

1. 플랫폼 엔드포인트가 활성화되어 있고 사용할 준비가 되어 있는지 확인합니다.

## 의사 코드
<a name="mobile-platform-endpoint-pseudo-code"></a>

다음 의사(pseudo) 코드는 다양한 시작 조건에서 작동하고 활성화된 현재 플랫폼 엔드포인트를 생성하는 데 권장되는 사례를 설명합니다. 이 방법은 앱을 처음 등록하는지 아닌지, 이 앱의 플랫폼 엔드포인트가 이미 있는지, 플랫폼 엔드포인트가 활성화되어 있는지, 올바른 디바이스 토큰이 있는지 여부에 상관없이 효과가 있습니다. 연이어 여러 번 호출해도 중복 플랫폼 엔드포인트가 생성되거나, 이미 최신 상태이고 활성화된 경우에 기존 플랫폼 엔드포인트가 변경되지 않으므로 무관합니다.

```
retrieve the latest device token from the mobile operating system
if (the platform endpoint ARN is not stored)
  # this is a first-time registration
  call create platform endpoint
  store the returned platform endpoint ARN
endif

call get endpoint attributes on the platform endpoint ARN 

if (while getting the attributes a not-found exception is thrown)
  # the platform endpoint was deleted 
  call create platform endpoint with the latest device token
  store the returned platform endpoint ARN
else 
  if (the device token in the endpoint does not match the latest one) or 
      (GetEndpointAttributes shows the endpoint as disabled)
    call set endpoint attributes to set the latest device token and then enable the platform endpoint
  endif
endif
```

이 방법은 앱에서 자체적으로 등록하거나 다시 등록하려 할 때마다 사용할 수 있습니다. Amazon SNS에 디바이스 토큰 변경을 알리는 데에도 사용됩니다. 이 경우 최신 디바이스 토큰 값으로 작업을 호출하면 됩니다. 이 방법에 대해 유의해야 할 몇 가지 사항은 다음과 같습니다.
+ 플랫폼 엔드포인트 생성 작업을 호출할 수도 있는 두 가지 경우가 있습니다. 최초 등록 중에서와 같이 앱에서 자신의 고유한 플랫폼 엔드포인트 ARN을 인식하지 못하는 맨 처음에 호출할 수 있습니다. 또한 애플리케이션에서 해당 엔드포인트 ARN을 인식하지만 삭제된 경우와 같이 초기 `GetEndpointAttributes` 작업 직접 호출이 찾을 수 없음 예외와 함께 실패할 경우에도 직접적으로 호출될 수 있습니다.
+ 방금 플랫폼 엔드포인트를 생성했더라도 플랫폼 엔드포인트의 상태를 확인하기 위해 `GetEndpointAttributes` 작업이 직접적으로 호출됩니다. 이러한 상황은 플랫폼 엔드포인트가 이미 있지만 비활성화되어 있는 경우에 발생합니다. 이 경우 플랫폼 엔드포인트 생성 작업이 성공하지만 플랫폼 엔드포인트가 활성화되지 않기 때문에 성공을 반환하기 전에 플랫폼 엔드포인트의 상태를 다시 한 번 확인해야 합니다.

## AWS SDK 예제
<a name="mobile-platform-endpoint-sdk-examples"></a>

다음 코드는 AWS SDKs에서 제공하는 Amazon SNS 클라이언트를 사용하여 이전 의사 코드를 구현하는 방법을 보여줍니다.

 AWS SDK를 사용하려면 자격 증명으로 구성해야 합니다. [자세한 정보는 *AWS SDK 및 도구 참조 가이드*의 공유 구성 및 자격 증명 파일](https://docs.aws.amazon.com/sdkref/latest/guide/creds-config-files.html)을 참조하세요.

------
#### [ CLI ]

**AWS CLI**  
**플랫폼 애플리케이션 엔드포인트를 생성하려면**  
다음 `create-platform-endpoint` 예제에서는 지정된 토큰을 사용하여 지정된 플랫폼 애플리케이션의 엔드포인트를 생성합니다.  

```
aws sns create-platform-endpoint \
    --platform-application-arn arn:aws:sns:us-west-2:123456789012:app/GCM/MyApplication \
    --token EXAMPLE12345...
```
출력:  

```
{
      "EndpointArn": "arn:aws:sns:us-west-2:1234567890:endpoint/GCM/MyApplication/12345678-abcd-9012-efgh-345678901234"
}
```

------
#### [ Java ]

**SDK for Java 2.x**  
 GitHub에 더 많은 내용이 있습니다. [AWS 코드 예 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples)에서 전체 예를 찾고 설정 및 실행하는 방법을 배워보세요.

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.CreatePlatformEndpointRequest;
import software.amazon.awssdk.services.sns.model.CreatePlatformEndpointResponse;
import software.amazon.awssdk.services.sns.model.SnsException;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 *
 * In addition, create a platform application using the AWS Management Console.
 * See this doc topic:
 *
 * https://docs.aws.amazon.com/sns/latest/dg/mobile-push-send-register.html
 *
 * Without the values created by following the previous link, this code examples
 * does not work.
 */

public class RegistrationExample {
    public static void main(String[] args) {
        final String usage = """

            Usage:     <token> <platformApplicationArn>

            Where:
               token - The device token or registration ID of the mobile device. This is a unique 
               identifier provided by the device platform (e.g., Apple Push Notification Service (APNS) for iOS devices, Firebase Cloud Messaging (FCM) 
               for Android devices) when the mobile app is registered to receive push notifications.

               platformApplicationArn - The ARN value of platform application. You can get this value from the AWS Management Console.\s

            """;

        if (args.length != 2) {
            System.out.println(usage);
            return;
        }

        String token = args[0];
        String platformApplicationArn = args[1];
        SnsClient snsClient = SnsClient.builder()
            .region(Region.US_EAST_1)
            .build();

        createEndpoint(snsClient, token, platformApplicationArn);
    }
    public static void createEndpoint(SnsClient snsClient, String token, String platformApplicationArn) {
        System.out.println("Creating platform endpoint with token " + token);
        try {
            CreatePlatformEndpointRequest endpointRequest = CreatePlatformEndpointRequest.builder()
                .token(token)
                .platformApplicationArn(platformApplicationArn)
                .build();

            CreatePlatformEndpointResponse response = snsClient.createPlatformEndpoint(endpointRequest);
            System.out.println("The ARN of the endpoint is " + response.endpointArn());

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
        }
    }
}
```

------

 자세한 내용은 [모바일 푸시 API 작업](mobile-push-api.md) 섹션을 참조하세요.

## 문제 해결
<a name="mobile-platform-endpoint-problems"></a>

### 오래된 디바이스 토큰으로 플랫폼 엔드포인트 생성 반복 호출
<a name="mobile-platform-endpoint-problems-outdated"></a>

FCM 엔드포인트의 경우 특히 애플리케이션이 발급된 첫 번째 디바이스 토큰을 먼저 저장한 후 애플리케이션을 시작할 때마다 해당 디바이스 토큰으로 플랫폼 엔드포인트 생성을 직접적으로 호출하는 것이 가장 적합하다고 생각할 수 있습니다. 이렇게 하면 앱에서 디바이스 토큰의 상태를 관리하지 않아도 되고 Amazon SNS에서 디바이스 토큰을 최신 값으로 자동 업데이트하기 때문에 올바르게 보일 수도 있습니다. 하지만 이 해결 방법에는 여러 가지 심각한 문제가 있습니다.
+ Amazon SNS는 만료된 디바이스 토큰을 새 디바이스 토큰으로 업데이트하기 위해 FCM의 피드백에 의존합니다. FCM은 일정 기간 동안 이전 디바이스 토큰에 대한 정보를 유지하지만 무기한은 아닙니다. FCM에서 이전 디바이스 토큰과 새 디바이스 토큰 사이의 연결에 대해 잊어버리면 Amazon SNS가 플랫폼 엔드포인트에 저장된 디바이스 토큰을 올바른 값으로 더 이상 업데이트하지 않고, 대신 플랫폼 엔드포인트를 비활성화합니다.
+ 플랫폼 애플리케이션에는 동일한 디바이스 토큰에 해당하는 여러 플랫폼 엔드포인트가 포함되어 있습니다.
+ Amazon SNS는 동일한 디바이스 토큰으로 시작해서 플랫폼 엔드포인트를 몇 개나 생성할 수 있는지에 대한 할당량을 둡니다. 결국 유효하지 않은 파라미터 예외 및 "이 엔드포인트가 이미 다른 토큰으로 등록되었습니다." 오류 메시지와 함께 새 엔드포인트 생성이 실패합니다.

FCM 엔드포인트에 대한 자세한 내용은 [Firebase Cloud Messaging 엔드포인트의 Amazon SNS 관리](sns-fcm-endpoint-management.md) 섹션을 참조하세요.

### 유효하지 않은 디바이스 토큰과 연결된 플랫폼 엔드포인트 다시 활성화
<a name="mobile-platform-endpoint-problems-invalid"></a>

모바일 플랫폼(예: APN 또는 FCM)에서 Amazon SNS에 게시 요청에 사용된 디바이스 토큰이 유효하지 않다고 알리면 Amazon SNS에서 해당 디바이스 토큰과 연결된 플랫폼 엔드포인트를 비활성화합니다. 그리고 나서 Amazon SNS는 해당 디바이스 토큰에 대한 후속 게시를 거부합니다. 플랫폼 엔드포인트를 다시 활성화하고 계속 게시하는 것이 최선이라고 생각할지도 모르겠지만, 대부분의 경우에서 이렇게 하면 아무 효과가 없습니다. 즉, 게시되는 메시지가 전송되지 않고 플랫폼 엔드포인트가 이후에 곧 다시 비활성화됩니다.

플랫폼 엔드포인트와 연결된 디바이스 토큰이 실제로 유효하지 않기 때문입니다. 더 이상 설치된 앱에 해당하지 않기 때문에 여기에 전송해도 실패하는 것입니다. 다음에 게시되면 모바일 플랫폼에서 다시 한 번 Amazon SNS에 디바이스 토큰이 유효하지 않다고 알려 주고, Amazon SNS가 또 다시 플랫폼 엔드포인트를 비활성화합니다.

비활성화된 플랫폼 엔드포인트를 다시 활성화하려면 설정된 엔드포인트 속성 작업 호출과 함께 유효한 디바이스 토큰과 연결한 후에 활성화해야 합니다. 그래야만 해당 플랫폼 엔드포인트에 전송해도 성공할 수 있습니다. 해당 장치 토큰을 업데이트하지 않고 플랫폼 엔드포인트를 다시 활성화해도 효과가 있는 유일한 경우는 해당 엔드포인트와 연결된 장치 토큰이 이전에는 유효하지 않았다가 다시 유효해진 경우입니다. 이러한 상황은 예를 들면 같은 모바일 디바이스에서 앱을 제거했다가 다시 설치하고, 같은 디바이스 토큰을 받을 경우에 발생할 수 있습니다. 위에 소개한 방법은 이와 같이 연결된 디바이스 토큰이 제공되는 가장 최신 디바이스 토큰임을 확인한 후에만 플랫폼 엔드포인트를 다시 활성화하도록 합니다.

# 모바일 알림을 위해 Amazon SNS와 디바이스 토큰 통합
<a name="mobile-push-send-devicetoken"></a>

앱과 모바일 디바이스를 Apple 푸시 알림 서비스(APN) 및 Firebase Cloud Messaging(FCM)과 같은 알림 서비스에 처음 등록할 때 디바이스 토큰 또는 등록 ID가 해당 서비스에서 반환됩니다. 이러한 토큰/ID는 [https://docs.aws.amazon.com/sns/latest/api/API_PlatformApplication.html](https://docs.aws.amazon.com/sns/latest/api/API_PlatformApplication.html) API를 사용하여 앱 및 디바이스에 대한 엔드포인트를 생성하기 위해 Amazon SNS에 추가됩니다. 엔드포인트가 생성되면 Amazon SNS가 올바른 앱/디바이스로 알림을 보내는 데 사용하는 [https://docs.aws.amazon.com/sns/latest/api/API_Endpoint.html](https://docs.aws.amazon.com/sns/latest/api/API_Endpoint.html)이 반환됩니다.

다음 방법을 사용하여 디바이스 토큰 또는 등록 ID를 Amazon SNS에 추가할 수 있습니다.
+ 를 통해 수동으로 단일 토큰 추가 AWS Management Console
+ [https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html) API를 사용하여 여러 토큰을 업로드
+ 향후 디바이스에 토큰 등록

****디바이스 토큰 또는 등록 ID를 수동으로 추가하려면****

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

1. 탐색 창에서 **푸시 알림**을 선택합니다.

1. **플랫폼 애플리케이션** 섹션에서 애플리케이션을 선택한 다음 **편집**을 선택합니다. 플랫폼 애플리케이션을 아직 생성하지 않은 경우 [Amazon SNS 플랫폼 애플리케이션 만들기](mobile-push-send-register.md) 가이드에 따라 지금 생성하세요.

1. **엔드포인트 생성**을 선택합니다.

1. **엔드포인트 토큰** 상자에 사용 중인 알림 서비스(예: FCM 등록 ID)에 따라 **토큰** 또는 **등록 ID**를 입력합니다.

1. (선택 사항) **사용자 데이터** 필드에 추가 데이터를 입력합니다. 이 데이터는 UTF-8로 인코딩되고 2KB 미만이어야 합니다.

1. **엔드포인트 생성**을 선택합니다.

엔드포인트가 만들어졌으므로 모바일 디바이스에 메시지를 직접 전송하거나 Amazon SNS 주제를 구독하는 모바일 디바이스에 메시지를 전송할 수 있습니다.

****`CreatePlatformEndpoint` API를 사용하여 여러 토큰을 업로드하는 방법****

다음 단계에서는에서 제공하는 샘플 Java 앱(`bulkupload` 패키지)을 사용하여 Amazon SNS AWS 에 여러 토큰(디바이스 토큰 또는 등록 IDs)을 업로드하는 방법을 보여줍니다. 이 샘플 앱을 사용하여 기존 토큰 업로드를 시작할 수 있습니다.
**참고**  
다음 단계에서는 Eclipse Java IDE를 사용합니다. 이 단계에서는를 설치했고에 대한 AWS 보안 자격 증명 AWS SDK for Java 이 있다고 가정합니다 AWS 계정. 자세한 내용은 [AWS SDK for Java](https://aws.amazon.com/sdkforjava/) 단원을 참조하십시오. 자격 증명에 대한 자세한 내용은 *IAM 사용 설명서*의 [AWS 보안 자격 증명](https://docs.aws.amazon.com/general/latest/gr/getting-aws-sec-creds.html) 섹션을 참조하세요.

1. [snsmobilepush.zip](samples/snsmobilepush.zip) 파일을 다운로드하여 압축을 풉니다.

1. Eclipse에서 새 **Java 프로젝트**를 생성하고 `SNSSamples` 폴더를 프로젝트로 가져옵니다.

1. [OpenCSV 라이브러리](http://sourceforge.net/projects/opencsv/)를 다운로드하여 빌드 경로에 추가합니다.

1. `BulkUpload.properties` 파일에서 다음을 지정합니다.
   + `ApplicationArn`(플랫폼 애플리케이션 ARN).
   + 토큰이 포함된 CSV 파일의 절대 경로.
   + 성공 및 실패한 토큰에 대한 파일 이름 로깅. 예: `goodTokens.csv` 및 `badTokens.csv`.
   + (선택 사항) 구분 기호, 따옴표 및 사용할 스레드 수에 대한 구성입니다.

   완성된 `BulkUpload.properties`는 다음과 같습니다.

   ```
   applicationarn: arn:aws:sns:us-west-2:111122223333:app/FCM/fcmpushapp
   csvfilename: C:\\mytokendirectory\\mytokens.csv
   goodfilename: C:\\mylogfiles\\goodtokens.csv
   badfilename: C:\\mylogfiles\\badtokens.csv
   delimiterchar: ','
   quotechar: '"'
   numofthreads: 5
   ```

1.  **BatchCreatePlatformEndpointSample.java** 애플리케이션을 실행하여 토큰을 Amazon SNS에 업로드합니다. 성공적으로 업로드된 토큰은 `goodTokens.csv`에 로깅되고 잘못된 형식의 토큰은 `badTokens.csv`에 로깅됩니다.

**향후 앱 설치를 위해 디바이스의 토큰을 등록하는 방법**

이 프로세스에는 두 가지 옵션이 있습니다.

**Amazon Cognito 서비스 사용**  
모바일 앱은 임시 보안 자격 증명을 사용하여 엔드포인트를 생성할 수 있습니다. 임시 자격 증명을 생성하려면 Amazon Cognito를 사용하는 것이 좋습니다. 자세한 정보는 *[Amazon Cognito 개발자 안내서](https://docs.aws.amazon.com/cognito/latest/developerguide/)*를 참조하세요.  
앱 [등록](application-event-notifications.md)을 추적하려면 새 엔드포인트 ARN이 생성될 때 Amazon SNS 이벤트를 사용하여 알림을 받으세요.  
또는 [https://docs.aws.amazon.com/sns/latest/api/API_ListEndpointsByPlatformApplication.html](https://docs.aws.amazon.com/sns/latest/api/API_ListEndpointsByPlatformApplication.html) API를 사용하여 등록된 엔드포인트 목록을 검색할 수 있습니다.

**프록시 서버 사용**  
앱 인프라가 설치 시 디바이스 등록을 이미 지원하는 경우 서버를 프록시로 사용할 수 있습니다. [https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html) API를 통해 Amazon SNS로 디바이스 토큰을 전달합니다.  
Amazon SNS에서 생성한 엔드포인트 ARN이 반환되며 향후 메시지 게시를 위해 서버에서 저장할 수 있습니다.

# Amazon SNS Apple 푸시 알림 인증 방법
<a name="sns-apple-authentication-methods"></a>

앱 개발자임을 식별하는 정보를 제공하여 Amazon SNS가 iOS나 macOS 앱에 푸시 알림을 보낼 수 있는 권한을 부여할 수 있습니다. 인증하려면 [플랫폼 애플리케이션을 생성할 때](https://docs.aws.amazon.com/sns/latest/api/API_SetPlatformApplicationAttributes.html) *키* 또는 *인증서*를 제공하세요. 두 가지 모두 Apple 개발자 계정에서 얻을 수 있습니다.

**토큰 서명 키**  
Amazon SNS가 Apple 푸시 알림 서비스(APNS) 인증 토큰에 서명하는 데 사용하는 프라이빗 서명 키입니다.  
서명 키를 입력하면 Amazon SNS는 사용자가 푸시 알림을 보낼 때마다 토큰을 사용하여 APNS에 인증합니다. 이 서명 키로 APNS 프로덕션 환경 및 샌드박스 환경에 푸시 알림을 보낼 수 있습니다.  
서명 키는 만료되지 않으며 여러 앱에 대해 동일한 서명 키를 사용할 수 있습니다. 자세한 내용은 Apple 웹 사이트의 **개발자 계정 도움말** 섹션의 [인증 토큰을 사용하여 APNS와 커뮤니케이션하기](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_token-based_connection_to_apns)를 참조하세요.

**Certificate**  
푸시 알림을 보낼 때 Amazon SNS가 APNS에 인증하기 위해 사용하는 TLS 인증서입니다. 이 인증서는 Apple 개발자 계정에서 얻을 수 있습니다.  
인증서는 1년 후에 만료됩니다. 만료되는 경우, 새 인증서를 생성하고 이를 Amazon SNS에 제공해야 합니다. 자세한 내용은 Apple 개발자 웹 사이트에서 [APNS에 대한 인증서 기반 연결 설정](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_certificate-based_connection_to_apns)을 참조하세요.

**AWS 관리 콘솔APNs 설정을 관리하려면**

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

1. 탐색 창에서 **푸시 알림**을 선택합니다.

1. **플랫폼 애플리케이션** 섹션에서 편집하려는 APN 설정이 있는 **애플리케이션**을 선택한 다음 **편집**을 선택합니다. 플랫폼 애플리케이션을 아직 생성하지 않은 경우 [Amazon SNS 플랫폼 애플리케이션 만들기](mobile-push-send-register.md) 가이드에 따라 지금 생성하세요.

1. **편집**을 선택하여 플랫폼 애플리케이션의 설정을 수정합니다.

1. **인증 유형** 섹션에서 다음 옵션 중 하나를 선택합니다.
   + **토큰 기반 인증**(최신 APN 통합에 권장됨)
   + **인증서 기반 인증**(이전 메서드)

1. 인증 유형에 따라 **자격 증명**을 구성합니다.
   + **토큰 기반 인증:**
     + Apple Developer 계정에서 다운로드한 인증 토큰 서명 키인 **.p8 파일**을 업로드합니다.
     + Apple 개발자 계정에서 찾은 **서명 키 ID**를 입력합니다. **인증서**, **ID 및 프로필**, **키**로 이동하여 사용하려는 **키**를 선택합니다.
     + Apple 개발자 계정의 **팀 식별자**를 제공합니다. 이는 멤버십 페이지에서 확인할 수 있습니다.
     + 앱에 할당된 **번들 식별자**를 입력합니다. 인증서, ID 및 프로필, 앱 ID에서 찾을 수 있습니다.
   + **인증서 기반 인증의 경우:**
     + TLS 인증서에 대한 **.p12 파일**을 업로드합니다. Apple 개발자 계정에서 인증서를 다운로드한 다음 macOS의 키체인 액세스에서 이 파일을 내보낼 수 있습니다.
     + .p12 인증서에 **암호**를 할당했으면 여기에 입력합니다.

1. 필요한 자격 증명을 입력한 후 **변경 사항 저장**을 선택하여 설정을 업데이트합니다.

# Amazon SNS를 Firebase Cloud Messaging 인증 설정과 통합
<a name="sns-fcm-authentication-methods"></a>

이 주제에서는 API AWS AWS CLI 및와 함께 사용하는 데 필요한 FCM API(HTTP v1) 자격 증명을 Google에서 가져오는 방법을 설명합니다 AWS Management Console.

**중요**  
2024년 3월 26일 - Amazon SNS는 Apple 디바이스 및 웹푸시 대상에 대한 FCM HTTP v1 API를 지원합니다. 애플리케이션 중단을 방지하려면 2024년 6월 1일 또는 그 이전까지 기존 모바일 푸시 애플리케이션을 최신 FCM HTTP v1 API로 마이그레이션하는 것을 권장합니다.  
2024년 1월 18일 - Amazon SNS는 Android 디바이스로 모바일 푸시 알림을 전송하는 FCM HTTP v1 API에 대한 지원을 도입했습니다.  
2023년 6월 20일 - Google은 자체 Firebase Cloud Messaging(FCM) 레거시 HTTP API 지원을 중단했습니다. 이제 Amazon SNS는 FCM HTTP v1 API를 사용하여 모든 디바이스 유형에 전송 기능을 지원합니다. 중단을 방지하려면 2024년 6월 1일 또는 그 이전까지 기존 모바일 푸시 애플리케이션을 최신 FCM HTTP v1 API로 마이그레이션하는 것을 권장합니다.

앱 개발자임을 식별하는 정보를 제공하여 Amazon SNS가 애플리케이션에 푸시 알림을 보낼 수 있는 권한을 부여할 수 있습니다. 인증하려면 [플랫폼 애플리케이션을 만들 때](https://docs.aws.amazon.com/sns/latest/api/API_SetPlatformApplicationAttributes.html) **API 키** 또는 **토큰**을 제공하세요. [Firebase 애플리케이션 콘솔](https://firebase.google.com/?gad=1&gclid=CjwKCAiA0syqBhBxEiwAeNx9N27M7zxHjlS74_gp4mAS4QTMQH5J35sTO29od-yauuq259zzX_I2DRoCrbsQAvD_BwE&gclsrc=aw.ds)에서 다음 정보를 가져올 수 있습니다.

**API 키**  
API 키는 Firebase의 레거시 API를 직접 호출할 때 사용되는 보안 인증 정보입니다. Google은 2024년 6월 20일에 FCM 레거시 API를 삭제할 예정입니다. 현재 API 키를 플랫폼 보안 인증 정보로 사용하고 있다면 **토큰**을 옵션으로 선택하고 Firebase 애플리케이션용 관련 JSON 파일을 업로드하여 플랫폼 보안 인증 정보를 업데이트할 수 있습니다.

**토큰**  
HTTP v1 API를 직접 호출할 경우 수명이 짧은 액세스 토큰이 사용됩니다. 이것은 푸시 알림 전송을 위한 Firebase의 추천 API입니다. 액세스 토큰을 생성하기 위해 Firebase는 개발자에게 프라이빗 키 파일(service.json 파일이라고도 함) 형태의 보안 인증 정보 세트를 제공합니다.

## 사전 조건
<a name="sns-fcm-authentication-prerequisite"></a>

Amazon SNS에서 FCM 설정을 관리하기 시작하려면 먼저 FCM service.json 보안 인증 정보를 받아야 합니다. service.json 보안 인증 정보를 얻으려면 Google Firebase 설명서에서 [레거시 FCM API에서 HTTP v1으로 마이그레이션](https://firebase.google.com/docs/cloud-messaging/migrate-v1) 섹션을 참조하세요.

## CLI를 사용한 FCM 설정 관리
<a name="sns-fcm-authentication-api"></a>

 AWS API를 사용하여 FCM 푸시 알림을 생성할 수 있습니다. AWS 계정의 Amazon SNS 리소스 수와 크기는 제한됩니다. 자세한 내용은 *AWS 일반 참조 가이드*의 [Amazon Simple Notification Service endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/sns.html)를 참조하세요.

**Amazon SNS 주제와 함께 FCM 푸시 알림을 생성하려면(AWS API)**  
**키** 보안 인증을 사용하는 경우, `PlatformCredential`은 `API key`입니다. **토큰** 보안 인증을 사용하는 경우, `PlatformCredential`은 JSON 형식의 프라이빗 키 파일입니다.
+ [https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html)

**기존 Amazon SNS 주제에 대한 FCM 자격 증명 유형을 검색하려면(AWS API)**  
다음 보안 인증 유형 `"AuthenticationMethod": "Token"` 또는 ` "AuthenticationMethod": "Key"`를 검색합니다.
+ [GetPlatformApplicationAttributes](https://docs.aws.amazon.com/sns/latest/api/API_GetPlatformApplicationAttributes.html)

**기존 Amazon SNS 주제에 대한 FCM 속성을 설정하려면(AWS API)**  
FCM 속성을 설정합니다.
+ [SetPlatformApplicationAttributes](https://docs.aws.amazon.com/sns/latest/api/API_SetPlatformApplicationAttributes.html)

## 콘솔을 사용한 FCM 설정 관리
<a name="sns-fcm-authentication-cli"></a>

 AWS Command Line Interface (CLI)를 사용하여 FCM 푸시 알림을 생성할 수 있습니다. AWS 계정의 Amazon SNS 리소스 수와 크기는 제한됩니다. 자세한 내용은 [Amazon Simple Notification Service 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/sns.html)을 참조하세요.

**Amazon SNS 주제와 함께 FCM 푸시 알림 생성(AWS CLI)**  
**키** 보안 인증을 사용하는 경우, `PlatformCredential`은 `API key`입니다. **토큰** 보안 인증을 사용하는 경우, `PlatformCredential`은 JSON 형식의 프라이빗 키 파일입니다. AWS CLI를 사용하는 경우 파일은 문자열 형식이어야 하며 특수 문자는 무시해야 합니다. Amazon SNS는 파일 형식을 올바르게 지정하기 위해 다음 명령을 사용할 것을 권장합니다: `SERVICE_JSON=`jq @json <<< cat service.json``:
+ [create-platform-application](https://docs.aws.amazon.com/cli/latest/reference/sns/create-platform-application.html)

**기존 Amazon SNS 주제에 대한 FCM 보안 인증 유형 검색(AWS CLI)**  
다음 보안 인증 유형 `"AuthenticationMethod": "Token"` 또는 ` "AuthenticationMethod": "Key"`를 검색합니다.
+ [get-platform-application-attributes](https://docs.aws.amazon.com/cli/latest/reference/sns/get-platform-application-attributes.html)

**기존 Amazon SNS 주제에 대한 FCM 속성 설정(AWS CLI)**  
FCM 속성을 설정합니다.
+ [set-platform-application-attributes](https://docs.aws.amazon.com/cli/latest/reference/sns/set-platform-application-attributes.html)

## FCM 설정 관리(콘솔)
<a name="sns-fcm-authentication-console"></a>

다음 단계에 따라 Amazon SNS에서 Firebase Cloud Messaging(FCM) 자격 증명을 입력하고 관리합니다.

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

1. 탐색 창에서 **푸시 알림**을 선택합니다.

1. **플랫폼 애플리케이션** 섹션에서 자격 증명을 편집하려는 **FCM 플랫폼 애플리케이션**을 선택한 다음 **편집**을 선택합니다.

1. **Firebase Cloud Messaging 자격 증명** 섹션에서 다음 옵션 중 하나를 선택합니다.
   + **토큰 기반 인증**(권장 방법) - Firebase 콘솔에서 다운로드한 **프라이빗 키 파일**(JSON)을 업로드합니다. 이 파일에는 FCM 알림을 위한 수명이 짧은 액세스 토큰을 생성하는 데 필요한 자격 증명이 포함되어 있습니다. 이 파일을 가져오는 방법:

     1. [Firebase 애플리케이션 콘솔](https://firebase.google.com/?gad=1&gclid=CjwKCAiA0syqBhBxEiwAeNx9N27M7zxHjlS74_gp4mAS4QTMQH5J35sTO29od-yauuq259zzX_I2DRoCrbsQAvD_BwE&gclsrc=aw.ds)로 이동합니다.

     1. **프로젝트 설정**에서 **클라우드 메시징**을 선택합니다.

     1. **프라이빗 키** JSON 파일(토큰 기반 인증 방법에 사용)을 다운로드합니다.
   + **API 키 인증** - 이전 API 키 인증 방법을 사용하려면 제공된 필드에 **Google API 키를** 입력합니다. 이 파일을 가져오는 방법:

     1. [Firebase 애플리케이션 콘솔](https://firebase.google.com/?gad=1&gclid=CjwKCAiA0syqBhBxEiwAeNx9N27M7zxHjlS74_gp4mAS4QTMQH5J35sTO29od-yauuq259zzX_I2DRoCrbsQAvD_BwE&gclsrc=aw.ds)로 이동합니다.

     1. **프로젝트 설정**에서 **클라우드 메시징**을 선택합니다.

     1. 알림 전송에 사용할 **서버 키**(API 키)를 복사합니다.

1. 변경 작업을 마치면 **변경 사항 저장**을 선택합니다.

**관련 주제**
+ [Amazon SNS에서 Google Firebase Cloud Messaging v1 페이로드 사용](sns-fcm-v1-payloads.md)

# Firebase Cloud Messaging 엔드포인트의 Amazon SNS 관리
<a name="sns-fcm-endpoint-management"></a>

## 디바이스 토큰 관리 및 유지 관리
<a name="sns-managing-device-tokens"></a>

다음 단계에 따라 모바일 애플리케이션의 푸시 알림을 전달할 수 있습니다.

1. 모든 디바이스 토큰, 해당 Amazon SNS 엔드포인트 ARN 및 타임스탬프를 애플리케이션 서버에 저장합니다.

1. 모든 기한 경과 토큰을 제거하고 해당 Amazon SNS 엔드포인트 ARN을 삭제합니다.

앱이 처음 시작되면 디바이스에 대한 디바이스 토큰(등록 토큰이라고도 함)을 받게 됩니다. 이 디바이스 토큰은 디바이스의 운영 체제에 의해 민팅되며 FCM 애플리케이션에 연결됩니다. 이 디바이스 토큰을 받으면 Amazon SNS에 플랫폼 엔드포인트로 등록할 수 있습니다. 디바이스 토큰, Amazon SNS 플랫폼 엔드포인트 ARN 및 타임스탬프를 애플리케이션 서버 또는 다른 영구 스토어에 저장하여 저장하는 것이 좋습니다. 디바이스 토큰을 검색하고 저장하도록 FCM 애플리케이션을 설정하려면 Google *Firebase* 설명서의 [등록 토큰 검색 및 저장](https://firebase.google.com/docs/cloud-messaging/manage-tokens#retrieve-and-store-registration-tokens)을 참조하세요.

최신 토큰을 유지하는 것이 중요합니다. 사용자의 디바이스 토큰은 다음 조건에서 변경될 수 있습니다.

1. 모바일 애플리케이션이 새 디바이스에 복원됩니다.

1. 사용자가 애플리케이션을 제거하거나 업데이트합니다.

1. 사용자가 애플리케이션 데이터를 지웁니다.

디바이스 토큰이 변경되면 해당 Amazon SNS 엔드포인트를 새 토큰으로 업데이트하는 것이 좋습니다. 이렇게 하면 Amazon SNS가 등록된 디바이스와의 통신을 계속할 수 있습니다. 모바일 애플리케이션 내에서 다음 의사 코드를 구현하여 이 작업을 수행할 수 있습니다. 활성화된 플랫폼 엔드포인트를 생성하고 유지 관리하는 권장 방법을 설명합니다. 이 접근 방식은 모바일 애플리케이션이 시작될 때마다 또는 백그라운드에서 예약된 작업으로 실행할 수 있습니다.

### 의사 코드
<a name="sns-device-token-pseudo-code"></a>

다음 FCM 의사 코드를 사용하여 디바이스 토큰을 관리하고 유지 관리합니다.

```
retrieve the latest token from the mobile OS
if (endpoint arn not stored)
    # first time registration
    call CreatePlatformEndpoint
    store returned endpoint arn
endif

call GetEndpointAttributes on the endpoint arn 

if (getting attributes encountered NotFound exception)
    #endpoint was deleted 
    call CreatePlatformEndpoint
    store returned endpoint arn
else 
    if (token in endpoint does not match latest) or 
        (GetEndpointAttributes shows endpoint as disabled)
        call SetEndpointAttributes to set the 
                     latest token and enable the endpoint
    endif
endif
```

토큰 업데이트 요구 사항에 대한 자세한 내용은 Google의 *Firebase* 설명서의 [정규 기준으로 토큰 업데이트](https://firebase.google.com/docs/cloud-messaging/manage-tokens#update-tokens-on-a-regular-basis)를 참조하세요.

## 잘못된 토큰 감지
<a name="sns-detecting-invalid-tokens"></a>

메시지가 잘못된 디바이스 토큰을 사용하여 FCM v1 엔드포인트로 전송되면 Amazon SNS는 다음 예외 중 하나를 수신합니다.
+ `UNREGISTERED`(HTTP 404) - Amazon SNS가 이 예외를 수신하면 `InvalidPlatformToken`의 `FailureType`와 함께 전송 실패 이벤트를 수신하며 *엔드포인트와 연결된 플랫폼 토큰의 `FailureMessage`가 유효하지 않습니다*. 이 예외를 제외하고 전송에 실패하면 Amazon SNS가 플랫폼 엔드포인트를 비활성화합니다.
+ `INVALID_ARGUMENT`(HTTP 400) - Amazon SNS가 이 예외를 수신하면 디바이스 토큰 또는 메시지 페이로드가 유효하지 않음을 의미합니다. 자세한 내용은 Google *Firebase* 설명서의 [ErrorCode](https://firebase.google.com/docs/reference/fcm/rest/v1/ErrorCode)를 참조하세요.

이러한 경우 중 하나에서 `INVALID_ARGUMENT`를 반환할 수 있으므로 Amazon SNS는 `InvalidNotification`의 `FailureType`을 반환하고 *알림 본문의 `FailureMessage`는 유효하지 않습니다*. 이 오류가 발생하면 페이로드가 올바른지 확인합니다. 올바른 경우 디바이스 토큰이 최신 상태인지 확인합니다. 이 예외를 제외하고 전송에 실패해도 Amazon SNS는 플랫폼 엔드포인트를 비활성화하지 않습니다.

`InvalidPlatformToken` 전송 실패 이벤트가 발생하는 또 다른 경우는 등록된 디바이스 토큰이 해당 메시지를 전송하려는 애플리케이션에 속하지 않는 경우입니다. 이 경우 Google은 *SENDER\$1ID\$1MISMATCH* 오류를 반환합니다. 이 예외를 제외하고 전송에 실패하면 Amazon SNS가 플랫폼 엔드포인트를 비활성화합니다.

애플리케이션에 대한 [전송 상태 로깅](topics-attrib.md)을 설정할 때 FCM v1 API에서 수신한 모든 관찰된 오류 코드를 CloudWatch에서 사용할 수 있습니다.

애플리케이션에 대한 전송 이벤트를 수신하려면 [사용 가능한 애플리케이션 이벤트](application-event-notifications.md#application-event-notifications-events) 섹션을 참조하세요.

## 기한 경과 토큰 제거
<a name="sns-removing-stale-tokens"></a>

엔드포인트 디바이스로의 메시지 전송이 실패하기 시작하면 토큰은 오래된 것으로 간주됩니다. Amazon SNS는 이러한 기한 경과 토큰을 플랫폼 애플리케이션의 비활성화된 엔드포인트로 설정합니다. 비활성화된 엔드포인트에 게시하면 Amazon SNS는 `EndpointDisabled`의 `FailureType`을 사용하여 `EventDeliveryFailure` 이벤트를 반환하고 *엔드포인트의 `FailureMessage`는 비활성화됩니다*. 애플리케이션의 전송 이벤트를 수신하려면 [사용 가능한 애플리케이션 이벤트](application-event-notifications.md#application-event-notifications-events) 섹션을 참조하세요.

Amazon SNS에서 이 오류가 발생하면 플랫폼 애플리케이션에서 기한 경과 토큰을 제거하거나 업데이트해야 합니다.

# 모바일 푸시 알림에 Amazon SNS 사용
<a name="mobile-push-notifications"></a>

 이 섹션에서는 모바일 푸시 알림을 보내는 방법을 설명합니다.

## 주제에 게시
<a name="mobile-push-send-topicmobile"></a>

Amazon SNS를 사용하여 주제를 구독하는 모바일 엔드포인트에 메시지를 전송할 수도 있습니다. [Amazon SNS란 무엇인가요?](welcome.md)에 설명된 대로 Amazon SQS, HTTP/S, 이메일, SMS 등 다른 엔드포인트 유형에서 주제를 구독하는 것과 동일한 개념입니다. 차이점은 Amazon SNS가 Apple 푸시 알림 서비스(APNS) 및 Google Firebase Cloud Messaging(FCM)과 같은 알림 서비스를 통해 통신한다는 것입니다. 알림 서비스를 통해 구독된 모바일 엔드포인트는 주제로 전송된 알림을 수신합니다.

## Direct Amazon SNS 모바일 디바이스 메시징
<a name="mobile-push-send-directmobile"></a>

모바일 디바이스에서 애플리케이션을 나타내는 엔드포인트에 Amazon SNS 푸시 알림 메시지를 직접 전송할 수 있습니다.

**직접 메시지를 전송하려면**

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

1. 탐색 창에서 **Push notifications**(푸시 알림)를 선택합니다.

1. **Mobile push notifications**(모바일 푸시 알림) 페이지의 **Platform applications**(플랫폼 애플리케이션) 섹션에서 ***MyApp***과 같은 애플리케이션 이름을 선택합니다.

1. ***MyApp*** 페이지의 **엔드포인트(Endpoints)** 섹션에서 엔드포인트를 선택한 후 **메시지 게시(Publish message)**를 선택합니다.

1. **엔드포인트에 메시지 게시(Publish message to endpoint)** 페이지에서, 모바일 디바이스에서 애플리케이션에 나타나는 메시지를 입력한 후 **메시지 게시(Publish message)**를 선택합니다.

   Amazon SNS는 알림 메시지를 플랫폼 알림 서비스로 전송하고, 해당 메시지가 애플리케이션에 전송되게 합니다.

# 플랫폼별 페이로드를 사용하여 Amazon SNS 알림 게시
<a name="sns-send-custom-platform-specific-payloads-mobile-devices"></a>

 AWS Management Console 또는 Amazon SNS APIs를 사용하여 플랫폼별 페이로드가 포함된 사용자 지정 메시지를 모바일 디바이스로 전송할 수 있습니다. Amazon SNS API 사용에 대한 자세한 내용은 [모바일 푸시 API 작업](mobile-push-api.md) 및 `[snsmobilepush.zip](samples/snsmobilepush.zip)`의 `SNSMobilePush.java` 파일을 참조하세요.

## JSON 형식 메시지 전송 중
<a name="mobile-push-send-json"></a>

플랫폼별 페이로드를 전송할 때 데이터는 JSON 키-값 쌍 문자열 형식이어야 하며, 따옴표가 이스케이프되어 있어야 합니다.

다음 예제는 FCM 플랫폼에 대한 사용자 지정 메시지를 보여줍니다.

```
{
"GCM": "{\"fcmV1Message\": {\"message\": {\"notification\": {\"title\": \"Hello\", \"body\": \"This is a test.\"}, \"data\": {\"dataKey\": \"example\"}}}}"
}
```

## 플랫폼별 메시지 전송 중
<a name="mobile-push-send-platform"></a>

사용자 지정 데이터를 키-값 쌍으로 전송할 수 있을 뿐 아니라, 플랫폼별 키-값 쌍을 전송할 수도 있습니다.

FCM `data` 파라미터에서 사용자 지정 데이터 키-값 쌍 뒤에 FCM 파라미터 `time_to_live` 및 `collapse_key`가 포함되어 있음을 보여줍니다.

```
{
"GCM": "{\"fcmV1Message\": {\"message\": {\"notification\": {\"title\": \"TitleTest\", \"body\": \"Sample message for Android or iOS endpoints.\"}, \"data\":{\"time_to_live\": 3600,\"collapse_key\":\"deals\"}}}}"
}
```

Amazon SNS에서 지원하는 각 푸시 알림 서비스에서 지원되는 키-값 쌍 목록은 다음을 참조하세요.

**중요**  
Amazon SNS는 이제 Android 디바이스로 모바일 푸시 알림을 보내기 위해 Firebase Cloud Messaging(FCM) HTTP v1 API를 지원합니다.  
2024년 3월 26일 - Amazon SNS는 Apple 디바이스 및 Webpush 대상에 대한 FCM HTTP v1 API를 지원합니다. 애플리케이션 중단을 방지하려면 2024년 6월 1일 또는 그 이전에 기존 모바일 푸시 애플리케이션을 최신 FCM HTTP v1 API로 마이그레이션하는 것이 좋습니다.
+ APNS 설명서의 [페이로드 키 참조](https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/PayloadKeyReference.html#/apple_ref/doc/uid/TP40008194-CH17-SW1)
+ FCM 설명서의 [Firebase Cloud Messaging HTTP 프로토콜](https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages)
+ ADM 설명서의 [메시지 보내기](https://developer.amazon.com/sdk/adm/sending-message.html)

## 다중 플랫폼의 애플리케이션으로 메시지 전송 중
<a name="mobile-push-send-multiplatform"></a>

FCM 및 APNS와 같은 다중 플랫폼용 디바이스에 설치된 애플리케이션에 메시지를 전송하려면 먼저 모바일 엔드포인트에서 Amazon SNS의 주제를 구독한 다음 메시지를 주제에 게시해야 합니다.

다음 예제에서는 APNS, FCM 및 ADM에서 구독 중인 모바일 엔드포인트에 전송할 메시지를 보여 줍니다.

```
{ 
  "default": "This is the default message which must be present when publishing a message to a topic. The default message will only be used if a message is not present for 
one of the notification platforms.",     
  "APNS": "{\"aps\":{\"alert\": \"Check out these awesome deals!\",\"url\":\"www.amazon.com\"} }",
  "GCM": "{\"data\":{\"message\":\"Check out these awesome deals!\",\"url\":\"www.amazon.com\"}}",
  "ADM": "{\"data\":{\"message\":\"Check out these awesome deals!\",\"url\":\"www.amazon.com\"}}" 
}
```

## 경보 또는 백그라운드 알림으로서 메시지를 APNS로 전송
<a name="mobile-push-send-message-apns-background-notification"></a>

Amazon SNS는 `alert` 또는 `background` 알림으로 APNS에 메시지를 보낼 수 있습니다(자세한 내용은 APNS 설명서의 [앱에 백그라운드 업데이트 푸시](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/pushing_background_updates_to_your_app) 참조).
+ `alert` APNS 알림은 경보 메시지를 표시하거나 사운드를 재생하거나 애플리케이션 아이콘에 배지를 추가하여 사용자에게 알립니다.
+ `background` APNS 알림은 사용자에게 알리지 않고 알림의 내용을 실행하도록 애플리케이션을 가동하거나 명령합니다.

### 사용자 지정 APNS 헤더 값 지정
<a name="specify-custom-header-value"></a>

Amazon SNS `Publish` API 작업, AWS SDKs 또는를 사용하여 `AWS.SNS.MOBILE.APNS.PUSH_TYPE` [예약된 메시지 속성](sns-message-attributes.md#sns-attrib-mobile-reserved)에 대한 사용자 지정 값을 지정하는 것이 좋습니다 AWS CLI. 다음 CLI 예제는 지정된 주제에 `content-available`을 `1`로 설정하고 `apns-push-type`을 `background`로 설정합니다.

```
aws sns publish \
--endpoint-url https://sns.us-east-1.amazonaws.com \
--target-arn arn:aws:sns:us-east-1:123456789012:endpoint/APNS_PLATFORM/MYAPP/1234a567-bc89-012d-3e45-6fg7h890123i \
--message '{"APNS_PLATFORM":"{\"aps\":{\"content-available\":1}}"}' \
--message-attributes '{ \
  "AWS.SNS.MOBILE.APNS.TOPIC":{"DataType":"String","StringValue":"com.amazon.mobile.messaging.myapp"}, \
  "AWS.SNS.MOBILE.APNS.PUSH_TYPE":{"DataType":"String","StringValue":"background"}, \
  "AWS.SNS.MOBILE.APNS.PRIORITY":{"DataType":"String","StringValue":"5"}}' \
--message-structure json
```

**참고**  
JSON 구조가 유효한지 확인합니다. 마지막 키를 제외한 각 키-값 페어 뒤에 쉼표를 추가합니다.

### 페이로드에서 APNS 푸시 유형 헤더 추론
<a name="inferring-push-type-header-from-payload"></a>

`apns-push-type` APNS 헤더를 설정하지 않으면 Amazon SNS에서 JSON 형식 APNS 페이로드 구성의 `aps` 사전에 있는 `content-available` 키에 따라 헤더를 `alert` 또는 `background`로 설정합니다.

**참고**  
Amazon SNS는 `alert` 또는 `background` 헤더만 유추할 수 있지만 `apns-push-type` 헤더는 다른 값으로 설정할 수 있습니다.
+ 다음의 경우 `apns-push-type`이 `alert`로 설정됩니다.
  + `aps` 사전에 `1`로 설정된 `content-available`과 사용자 상호 작용을 트리거하는 *하나 이상의 키*가 포함되어 있는 경우.
  + `aps` 사전에 `0`으로 설정된 `content-available`이 포함되어 있거나 *또는* `content-available` 키가 없는 경우.
  + `content-available` 키의 값이 정수 또는 부울이 아닌 경우.
+ 다음의 경우 `apns-push-type`이 `background`로 설정됩니다.
  + `aps` 사전에 `1`로 설정된 `content-available`*만* 포함되어 있고 사용자 상호 작용을 트리거하는 *다른 키가 없는* 경우입니다.
**중요**  
Amazon SNS에서 APNS에 대한 원시 구성 객체를 백그라운드 전용 알림으로 전송하는 경우, `1`로 설정된 `content-available`을 `aps` 사전에 포함해야 합니다. 사용자 지정 키를 포함할 수 있지만 `aps` 사전에는 사용자 상호 작용을 트리거하는 키(예: 경보, 배지 또는 사운드)를 포함할 수 없습니다.

다음은 원시 구성 객체의 예입니다.

```
{
  "APNS": "{\"aps\":{\"content-available\":1},\"Foo1\":\"Bar\",\"Foo2\":123}"
}
```

이 예에서 Amazon SNS는 메시지에 대한 `apns-push-type` APNS 헤더를 `background`로 설정합니다. Amazon SNS는 `apn` 사전에 `1`로 설정된 `content-available` 키가 포함되어 있고 사용자 상호 작용을 트리거할 수 있는 다른 키가 포함되어 있지 않음을 감지하면 헤더를 `background`로 설정합니다.

# Amazon SNS에서 Google Firebase Cloud Messaging v1 페이로드 사용
<a name="sns-fcm-v1-payloads"></a>

Amazon SNS는 FCM HTTP v1 API를 사용하여 Android, iOS 및 Webpush 대상으로 알림을 보낼 수 있도록 지원합니다. 이 주제에서는 CLI 또는 Amazon SNS API를 사용하여 모바일 푸시 알림을 게시할 때 페이로드 구조의 예를 제공합니다.

FCM 알림을 보낼 때 페이로드에 다음 메시지 유형을 포함할 수 있습니다.
+ **데이터 메시지** - 데이터 메시지는 클라이언트 앱에서 처리되며 사용자 지정 키-값 페어를 포함합니다. 데이터 메시지를 구성할 때 JSON 객체가 있는 `data` 키를 값으로 포함시킨 다음 사용자 지정 키-값 페어를 입력해야 합니다.
+ **알림 메시지** 또는 **표시 메시지** - 알림 메시지에는 FCM SDK에서 처리하는 미리 정의된 키 세트가 포함되어 있습니다. 이러한 키는 전송하려는 디바이스 유형에 따라 다릅니다. 플랫폼별 알림 키에 대한 자세한 내용은 다음을 참조하세요.
  + [Android 알림 키](https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages)
  + [APNS 알림 키](https://developer.apple.com/documentation/usernotifications/generating-a-remote-notification)
  + [Webpush 알림 키](https://developer.mozilla.org/en-US/docs/Web/API/Notification)

FCM 메시지 유형에 대한 자세한 내용은 Google *Firebase* 설명서의 에서 [메시지 유형](https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages)을 참조하세요.

## FCM v1 페이로드 구조를 사용하여 메시지 전송
<a name="sending-messages-using-v1-payload"></a>

FCM 애플리케이션을 처음 생성하거나 FCM v1 기능을 활용하려는 경우 FCM v1 형식의 페이로드를 전송하도록 선택할 수 있습니다. 이렇게 하려면 최상위 키 `fcmV1Message`를 포함해야 합니다. FCM v1 페이로드 구성에 대한 자세한 내용은 Google *Firebase* 설명서의 [레거시 FCM APIs에서 HTTP v1로 마이그레이션](https://firebase.google.com/docs/cloud-messaging/migrate-v1) 및 [플랫폼 간에 메시지 사용자 지정](https://firebase.google.com/docs/cloud-messaging/concept-options#customizing-a-message-across-platforms)을 참조하세요.

**Amazon SNS페이로드:**

**참고**  
다음 예제에서 사용되는 `GCM` 키 값은 Amazon SNS 를 사용하여 알림을 게시할 때 문자열로 인코딩되어야 합니다.

```
{
  "GCM": "{ 
    \"fcmV1Message\": { 
      \"validate_only\": false,
      \"message\": {
        \"notification\": {
          \"title\": \"string\",
          \"body\": \"string\"
        },
        \"data\": {
          \"dataGen\": \"priority message\"
        },
        \"android\": {
          \"priority\": \"high\",
          \"notification\": {
            \"body_loc_args\": [\"string\"],
            \"title_loc_args\": [\"string\"],
            \"sound\": \"string\",
            \"title_loc_key\": \"string\",
            \"title\": \"string\",
            \"body\": \"string\",
            \"click_action\": \"clicky_clacky\",
            \"body_loc_key\": \"string\"
          },
          \"data\": {
            \"dataAndroid\": \"priority message\"
          },
          \"ttl\": \"10023.32s\"
        },
        \"apns\": {
          \"payload\": {
            \"aps\": {
              \"alert\": {
                \"subtitle\": \"string\",
                \"title-loc-args\": [\"string\"],
                \"title-loc-key\": \"string\",
                \"loc-args\": [\"string\"],
                \"loc-key\": \"string\",
                \"title\": \"string\",
                \"body\": \"string\"
              },
              \"category\": \"Click\",
              \"content-available\": 0,
              \"sound\": \"string\",
              \"badge\": 5
            }
          }
        },
        \"webpush\": {
          \"notification\": {
            \"badge\": \"5\",
            \"title\": \"string\",
            \"body\": \"string\"
          },
          \"data\": {
            \"dataWeb\": \"priority message\"
          }
        }
      }
    }
  }"
}
```

JSON 페이로드를 전송할 때는 요청에 `message-structure` 속성을 포함시키고 `json`으로 설정해야 합니다.

**CLI 예제:**

```
aws sns publish --topic $TOPIC_ARN --message '{"GCM": "{\"fcmV1Message\": {\"message\":{\"notification\":{\"title\":\"string\",\"body\":\"string\"},\"android\":{\"priority\":\"high\",\"notification\":{\"title\":\"string\",\"body\":\"string\"},\"data\":{\"customAndroidDataKey\":\"custom key value\"},\"ttl\":\"0s\"},\"apns\":{\"payload\":{\"aps\":{\"alert\":{\"title\":\"string\", \"body\":\"string\"},\"content-available\":1,\"badge\":5}}},\"webpush\":{\"notification\":{\"badge\":\"URL\",\"body\":\"Test\"},\"data\":{\"customWebpushDataKey\":\"priority message\"}},\"data\":{\"customGeneralDataKey\":\"priority message\"}}}}", "default": "{\"notification\": {\"title\": \"test\"}"}' --region $REGION --message-structure json
```

FCM v1 형식의 페이로드를 보내는 방법에 대한 자세한 내용은 Google의 *Firebase* 설명서에서 다음을 참조하세요.
+ [레거시 FCM APIs에서 HTTP v1로 마이그레이션](https://firebase.google.com/docs/cloud-messaging/migrate-v1)
+ [FCM 메시지 정보](https://firebase.google.com/docs/cloud-messaging/concept-options#customizing_a_message_across_platforms)
+ [REST 리소스: projects.messages](https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages)

## 레거시 페이로드 구조를 사용하여 FCM v1 API로 메시지 전송
<a name="sns-fcm-v1-legacy-payload-structure"></a>

FCM v1로 마이그레이션할 때 레거시 자격 증명에 사용하던 페이로드 구조를 변경할 필요가 없습니다. Amazon SNS는 페이로드를 새 FCM v1 페이로드 구조로 변환하고 Google로 전송합니다.

입력 메시지 페이로드 형식:

```
{
  "GCM": "{\"notification\": {\"title\": \"string\", \"body\": \"string\", \"android_channel_id\": \"string\", \"body_loc_args\": [\"string\"], \"body_loc_key\": \"string\", \"click_action\": \"string\", \"color\": \"string\", \"icon\": \"string\", \"sound\": \"string\", \"tag\": \"string\", \"title_loc_args\": [\"string\"], \"title_loc_key\": \"string\"}, \"data\": {\"message\": \"priority message\"}}"
}
```

Google로 전송된 메시지:

```
{
  "message": {
    "token": "***",
    "notification": {
      "title": "string",
      "body": "string"
    },
    "android": {
      "priority": "high",
      "notification": {
        "body_loc_args": [
          "string"
        ],
        "title_loc_args": [
          "string"
        ],
        "color": "string",
        "sound": "string",
        "icon": "string",
        "tag": "string",
        "title_loc_key": "string",
        "title": "string",
        "body": "string",
        "click_action": "string",
        "channel_id": "string",
        "body_loc_key": "string"
      },
      "data": {
        "message": "priority message"
      }
    },
    "apns": {
      "payload": {
        "aps": {
          "alert": {
            "title-loc-args": [
              "string"
            ],
            "title-loc-key": "string",
            "loc-args": [
              "string"
            ],
            "loc-key": "string",
            "title": "string",
            "body": "string"
          },
          "category": "string",
          "sound": "string"
        }
      }
    },
    "webpush": {
      "notification": {
        "icon": "string",
        "tag": "string",
        "body": "string",
        "title": "string"
      },
      "data": {
        "message": "priority message"
      }
    },
    "data": {
      "message": "priority message"
    }
  }
}
```

**잠재적 위험**
+ 레거시 대 v1 매핑은 Apple Push Notification Service(APNS) `headers` 또는 `fcm_options` 키를 지원하지 않습니다. 이러한 필드를 사용하려면 FCM v1 페이로드를 전송합니다.
+ 경우에 따라 FCM v1에서 메시지 헤더를 사용하여 APNs 디바이스에 자동 알림을 보내야 합니다. 현재 APN 디바이스에 자동 알림을 보내는 경우 레거시 접근 방식에서는 작동하지 않습니다. 대신 예상치 못한 문제를 방지하려면 FCM v1 페이로드를 사용하는 것이 좋습니다. APN 헤더 목록과 헤더의 용도를 찾으려면 *Apple 개발자 안내서*의 [ APNs과의 통신을 참조하세요](https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html).
+ 알림을 보낼 때 `TTL` Amazon SNS 속성을 사용하는 경우 `android` 필드에서만 업데이트됩니다. `TTL` APNS 속성을 설정하려면 FCM v1 페이로드를 사용합니다.
+ `android`, `apns` 및 `webpush` 키는 제공된 모든 관련 키로 매핑되고 채워집니다. 예를 들어 세 플랫폼 모두에서 공유하는 키인 `title`을 제공하는 경우 FCM v1 매핑은 세 플랫폼 모두에 입력한 제목을 채웁니다.
+ 플랫폼 간에 공유되는 일부 키는 다양한 값 유형을 기대합니다. 예를 들어 에 전달된 `badge` 키는 정수 값을 `apns` 예상하는 반면 `webpush`에 전달된 `badge` 키는 문자열 값을 예상합니다. `badge` 키를 제공하는 경우 FCM v1 매핑은 유효한 값을 제공한 키만 채웁니다.

## FCM 전송 실패 이벤트
<a name="sns-fcm-delivery-failure-events"></a>

다음 표는 FCM v1 알림 요청에 대해 Google에서 수신한 오류/상태 코드에 해당하는 Amazon SNS 실패 유형을 제공합니다. 애플리케이션에 대한 [전송 상태 로깅](topics-attrib.md)을 설정할 때 FCM v1 API에서 수신한 모든 관찰된 오류 코드를 CloudWatch에서 사용할 수 있습니다.


| FCM 오류/상태 코드 | Amazon SNS 장애 유형 | 오류 메시지 | 원인 및 완화 | 
| --- | --- | --- | --- | 
|  `UNREGISTERED`  |  `InvalidPlatformToken`  |  엔드포인트와 연결된 플랫폼 토큰이 유효하지 않습니다.  |  엔드포인트에 연결된 디바이스 토큰이 오래되었거나 유효하지 않습니다. Amazon SNS가 엔드포인트를 비활성화했습니다. Amazon SNS 엔드포인트를 최신 디바이스 토큰으로 업데이트합니다.  | 
|  `INVALID_ARGUMENT`  |  `InvalidNotification`  |  알림 본문이 유효하지 않습니다.  |  디바이스 토큰 또는 메시지 페이로드가 유효하지 않을 수 있습니다. 메시지 페이로드가 유효한지 확인합니다. 메시지 페이로드가 유효한 경우 Amazon SNS 엔드포인트를 최신 디바이스 토큰으로 업데이트합니다.  | 
|  `SENDER_ID_MISMATCH`  |  `InvalidPlatformToken`  |  엔드포인트와 연결된 플랫폼 토큰이 유효하지 않습니다.  |  디바이스 토큰과 연결된 플랫폼 애플리케이션에는 디바이스 토큰으로 전송할 권한이 없습니다. Amazon SNS 플랫폼 애플리케이션에서 올바른 FCM 자격 증명을 사용하고 있는지 확인합니다.  | 
|  `UNAVAILABLE`  |  `DependencyUnavailable`  |  종속성을 사용할 수 없습니다.  |  FCM에서 요청을 처리할 수 없습니다. Amazon SNS에서 실행한 모든 재시도가 실패했습니다. 이러한 메시지를 DLQ(Dad-Letter Queue)에 저장하고 나중에 다시 구동할 수 있습니다.  | 
|  `INTERNAL`  |  `UnexpectedFailure`  |  예기치 않은 실패. Amazon에 문의하세요. 실패 문구 [내부 오류].  |  요청을 처리하는 도중 FCM 서버에서 오류가 발생하였습니다. Amazon SNS에서 실행한 모든 재시도가 실패했습니다. 이러한 메시지를 Dead Letter Queue(DLQ)에 저장하고 나중에 다시 구동할 수 있습니다.  | 
|  `THIRD_PARTY_AUTH_ERROR`  |  `InvalidCredentials`  |  플랫폼 애플리케이션 자격 증명이 유효하지 않습니다.  |  iOS 디바이스 또는 Webpush 디바이스를 대상으로 하는 메시지를 전송할 수 없습니다. 개발 및 프로덕션 자격 증명이 유효한지 확인합니다.  | 
|  `QUOTA_EXCEEDED`  |  `Throttled`  |  [gcm]로 제한되는 요청입니다.  |  메시지 속도 할당량, 디바이스 메시지 속도 할당량 또는 주제 메시지 속도 할당량을 초과했습니다. 이 문제를 해결하는 방법에 대한 자세한 내용은 Google *Firebase* 설명서의 에서 [ErrorCode](https://firebase.google.com/docs/reference/fcm/rest/v1/ErrorCode)를 참조하세요.  | 
|  `PERMISSION_DENIED`  |  `InvalidNotification`  |  알림 본문이 유효하지 않습니다.  |  `PERMISSION_DENIED` 예외의 경우 호출자(FCM 애플리케이션)는 페이로드에서 지정된 작업을 실행할 권한이 없습니다. FCM 콘솔로 이동하여 자격 증명에 필요한 API 작업이 활성화되어 있는지 확인합니다.  | 

# Amazon SNS 모바일 앱 속성
<a name="sns-msg-status"></a>

Amazon Simple Notification Service(Amazon SNS)는 푸시 알림 메시지 전송 상태를 로그하기 위한 지원을 제공합니다. 애플리케이션 속성을 구성하면 Amazon SNS에서 모바일 엔드포인트로 전송된 메시지에 대한 로그 항목이 CloudWatch Logs로 전송됩니다. 메시지 전송 상태를 로깅하면 다음과 같이 더욱 확장된 운영 이해를 제공할 수 있습니다.
+ 푸시 알림 메시지가 Amazon SNS로부터 푸시 알림 서비스로 전송되었는지 확인합니다.
+ 푸시 알림 서비스로부터 Amazon SNS로 전송되는 응답을 식별합니다.
+ 메시지 유지 시간(게시 타임스탬프 시간부터 푸시 알림 서비스에 넘겨주기 직전까지의 시간)을 결정합니다.

 메시지 전송 상태에 대한 애플리케이션 속성을 구성하려면 , AWS Management Console AWS 소프트웨어 개발 키트(SDKs) 또는 쿼리 API를 사용할 수 있습니다.

## 를 사용하여 메시지 전송 상태 속성 구성 AWS Management Console
<a name="sns-msg-console"></a>

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

1. 탐색 창에서 **모바일**을 가리킨 다음 **푸시 알림**을 선택합니다.

1. **플랫폼 애플리케이션** 섹션에서 CloudWatch Logs를 수신하려는 엔드포인트가 포함된 애플리케이션을 선택합니다.

1. **Application Actions(애플리케이션 작업)**를 선택한 다음 **Delivery Status(전송 상태)**를 선택합니다.

1. **Delivery Status(전송 상태)** 대화 상자에서 **Create IAM Roles(IAM 역할 생성)**를 선택합니다.

   이제 IAM 콘솔로 리디렉션됩니다.

1. Amazon SNS에 사용자 대신 CloudWatch Logs를 사용할 수 있는 쓰기 액세스 권한을 부여하려면 **허용**을 선택합니다.

1. 이제 **전송 상태** 대화 상자로 돌아가 CloudWatch Logs를 수신하려는 성공적인 메시지의 백분율을 **샘플 성공 백분율(0-100)** 필드에 입력합니다.
**참고**  
메시지 전송 상태를 위해 애플리케이션 속성을 구성하고 나면 메시지의 전송 실패가 CloudWatch Logs를 생성합니다.

1. 마지막으로, **Save Configuration(구성 저장)**을 선택합니다. 이제 CloudWatch Logs가 포함된 메시지 전송 상태를 보고 파싱할 수 있습니다. CloudWatch 사용에 대한 자세한 정보는 [CloudWatch 설명서](https://aws.amazon.com/documentation/cloudwatch)를 참조하세요.

## Amazon SNS 메시지 전송 상태 CloudWatch 로그 예제
<a name="sns-msg-examples"></a>

애플리케이션 엔드포인트를 위해 메시지 전송 상태 속성을 구성하고 나면 CloudWatch Logs가 생성됩니다. JSON 형식의 예제 로그는 다음과 같이 나타납니다.

**성공**

```
{
  "status": "SUCCESS",
  "notification": {
    "timestamp": "2015-01-26 23:07:39.54",
    "messageId": "9655abe4-6ed6-5734-89f7-e6a6a42de02a"
  },
  "delivery": {
    "statusCode": 200,
    "dwellTimeMs": 65,
    "token": "Examplei7fFachkJ1xjlqT64RaBkcGHochmf1VQAr9k-IBJtKjp7fedYPzEwT_Pq3Tu0lroqro1cwWJUvgkcPPYcaXCpPWmG3Bqn-wiqIEzp5zZ7y_jsM0PKPxKhddCzx6paEsyay9Zn3D4wNUJb8m6HXrBf9dqaEw",
    "attempts": 1,
    "providerResponse": "{\"multicast_id\":5138139752481671853,\"success\":1,\"failure\":0,\"canonical_ids\":0,\"results\":[{\"message_id\":\"0:1422313659698010%d6ba8edff9fd7ecd\"}]}",
    "destination": "arn:aws:sns:us-east-2:111122223333:endpoint/FCM/FCMPushApp/c23e42de-3699-3639-84dd-65f84474629d"
  }
}
```

**실패**

```
{
  "status": "FAILURE",
  "notification": {
    "timestamp": "2015-01-26 23:29:35.678",
    "messageId": "c3ad79b0-8996-550a-8bfa-24f05989898f"
  },
  "delivery": {
    "statusCode": 8,
    "dwellTimeMs": 1451,
    "token": "examp1e29z6j5c4df46f80189c4c83fjcgf7f6257e98542d2jt3395kj73",
    "attempts": 1,
    "providerResponse": "NotificationErrorResponse(command=8, status=InvalidToken, id=1, cause=null)",
    "destination": "arn:aws:sns:us-east-2:111122223333:endpoint/APNS_SANDBOX/APNSPushApp/986cb8a1-4f6b-34b1-9a1b-d9e9cb553944"
  }
}
```

푸시 알림 서비스 응답 코드를 확인하려면 [플랫폼 응답 코드](#platform-returncodes)에서 확인하세요.

## AWS SDKs를 사용하여 메시지 전송 상태 속성 구성
<a name="sns-msg-sdk"></a>

[AWS SDK](https://aws.amazon.com/tools/)는 Amazon SNS에서 메시지 전송 상태 속성을 사용하기 위해 여러 언어로 API를 제공합니다.

다음 Java 예제에서는 `SetPlatformApplicationAttributes` API를 이용해 푸시 알림 메시지 전송 상태를 위한 애플리케이션 속성을 구성하는 방법을 보여줍니다. 메시지 전송 상태를 위해 `SuccessFeedbackRoleArn`, `FailureFeedbackRoleArn`, `SuccessFeedbackSampleRate` 속성을 사용할 수 있습니다. `SuccessFeedbackRoleArn` 및 `FailureFeedbackRoleArn` 속성은 사용자 대신 CloudWatch Logs를 사용할 수 있는 쓰기 액세스 권한을 Amazon SNS에 부여하는 데 사용됩니다. `SuccessFeedbackSampleRate` 속성은 성공적으로 전송된 메시지의 샘플 비율(0-100)을 지정할 때 사용됩니다. `FailureFeedbackRoleArn` 속성을 구성하고 나면, 메시지의 전송 실패가 CloudWatch Logs를 생성합니다.

```
SetPlatformApplicationAttributesRequest setPlatformApplicationAttributesRequest = new SetPlatformApplicationAttributesRequest();
Map<String, String> attributes = new HashMap<>();
attributes.put("SuccessFeedbackRoleArn", "arn:aws:iam::111122223333:role/SNS_CWlogs");
attributes.put("FailureFeedbackRoleArn", "arn:aws:iam::111122223333:role/SNS_CWlogs");
attributes.put("SuccessFeedbackSampleRate", "5");
setPlatformApplicationAttributesRequest.withAttributes(attributes);
setPlatformApplicationAttributesRequest.setPlatformApplicationArn("arn:aws:sns:us-west-2:111122223333:app/FCM/FCMPushApp");
sns.setPlatformApplicationAttributes(setPlatformApplicationAttributesRequest);
```

SDK for Java에 대한 자세한 정보는 [AWS SDK for Java시작하기](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html)를 참조하세요.

## 플랫폼 응답 코드
<a name="platform-returncodes"></a>

다음은 푸시 알림 서비스 응답 코드를 위한 링크 목록입니다.


****  

| 푸시 알림 서비스 | 응답 코드 | 
| --- | --- | 
| Amazon Device Messaging(ADM) | ADM 설명서의 [응답 형식](https://developer.amazon.com/docs/adm/send-message.html#response-format)을 참조하세요. | 
| Apple 푸시 알림 서비스(APN) | 로컬 및 원격 알림 프로그래밍 가이드의 [APN과 통신](https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html#/apple_ref/doc/uid/TP40008194-CH11-SW1)에서 APN의 HTTP/2 응답을 참조하세요. | 
| Firebase Cloud Messaging(FCM) | Firebase Cloud Messaging 설명서의 [Downstream Message Error Response Codes](https://firebase.google.com/docs/cloud-messaging/http-server-ref#error-codes)를 참조하세요. | 
| Windows Phone용 Microsoft 푸시 알림 서비스(MPNS) | Windows 8 개발 설명서의 [Push Notification Service Response Codes for Windows Phone 8](https://msdn.microsoft.com/en-us/library/windows/apps/ff941100%28v=vs.105%29.aspx#BKMK_PushNotificationServiceResponseCodes)을 참조하세요. | 
| Windows 푸시 알림 서비스(WNS) | Windows 8 개발 설명서의 [Push Notification Service Request and Response Headers(Windows Runtime Apps)](https://msdn.microsoft.com/en-us/library/windows/apps/hh465435.aspx)에서 "응답 코드"를 참조하세요. | 

# 모바일 애플리케이션에 대한 Amazon SNS 애플리케이션 이벤트 알림
<a name="application-event-notifications"></a>

Amazon SNS는 특정 애플리케이션 이벤트가 발생할 때 알림을 트리거하도록 지원합니다. 그런 다음에 해당 이벤트에 대해 프로그래밍 방식의 작업을 수행할 수 있습니다. 애플리케이션에는 Apple 푸시 알림 서비스(APN), Firebase Cloud Messaging(FCM) 및 Windows 푸시 알림 서비스(WNS)와 같은 푸시 알림 서비스에 대한 지원이 포함되어야 합니다. Amazon SNS 콘솔 AWS CLI또는 AWS SDKs를 사용하여 애플리케이션 이벤트 알림을 설정합니다.

## 사용 가능한 애플리케이션 이벤트
<a name="application-event-notifications-events"></a>

애플리케이션 이벤트 알림은 개별 플랫폼 엔드포인트가 전송 실패뿐 아니라 생성, 삭제 및 업데이트되는 시기도 추적합니다. 다음은 애플리케이션 이벤트의 속성 이름입니다.


| 속성 이름 | 알림 트리거 | 
| --- | --- | 
| EventEndpointCreated | 새 플랫폼 엔드포인트가 애플리케이션에 추가됩니다. | 
| EventEndpointDeleted | 애플리케이션과 연결된 플랫폼 엔드포인트가 삭제됩니다. | 
| EventEndpointUpdated | 애플리케이션과 연결된 플랫폼 엔드포인트의 속성이 변경됩니다. | 
| EventDeliveryFailure | 애플리케이션과 연결된 플랫폼 엔드포인트로 전송할 때 영구 실패가 발생합니다. 플랫폼 애플리케이션 쪽에서 전송 실패를 추적하려면 애플리케이션의 메시지 전송 상태 이벤트를 구독하세요. 자세한 정보는 [메시지 전송 상태를 위한 Amazon SNS 애플리케이션 속성 사용](https://docs.aws.amazon.com/sns/latest/dg/sns-msg-status.html)을 참조하세요.  | 

이러한 이벤트 알림을 받을 수 있는 애플리케이션에 속성을 연결할 수 있습니다.

## 모바일 푸시 알림 전송
<a name="application-event-notifications-howto-set"></a>

애플리케이션 이벤트 알림을 전송하려면 각 유형의 이벤트에 대한 알림을 수신할 주제를 지정합니다. Amazon SNS가 알림을 전송할 때 주제는 프로그래밍 방식의 작업을 수행하는 엔드포인트로 알림을 라우팅할 수 있습니다.

**중요**  
대용량 애플리케이션은 많은 수(예: 수만 개)의 애플리케이션 이벤트 알림을 생성합니다. 이렇게 많은 알림은 이메일 주소, 전화번호 및 모바일 애플리케이션과 같이 인간이 사용하도록 설계된 엔드포인트에 부담이 될 수 있습니다. 애플리케이션 이벤트 알림을 주제에 전송할 때 다음 지침을 고려하세요.  
알림을 수신하는 각 주제에는 HTTP 또는 HTTPS 엔드포인트, Amazon SQS 대기열 또는 AWS Lambda 함수와 같은 프로그래밍 방식의 엔드포인트에 대한 구독만 포함되어야 합니다.
알림을 통해 트리거되는 처리량을 줄이려면 각 주제의 구독을 작은 수(예: 5개 이하)로 제한합니다.

Amazon SNS 콘솔, AWS Command Line Interface (AWS CLI) 또는 AWS SDKs.

### AWS Management Console
<a name="application-event-notifications-howto-set-console"></a>

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

1. 탐색 창에서 **모바일(Mobile)**, **푸시 알림(Push notifications)**을 선택합니다.

1. **모바일 푸시 알림** 페이지의 **플랫폼 애플리케이션** 섹션에서 애플리케이션을 선택한 후 **편집**을 선택합니다.

1. **Event notifications(이벤트 알림)** 섹션을 확장합니다.

1. **작업**, **이벤트 구성**을 선택합니다.

1. 다음 이벤트에 사용할 주제의 ARN을 입력합니다.
   + 엔드포인트 생성 완료
   + 엔드포인트 삭제 완료
   + 엔드포인트 업데이트 완료
   + 전송 실패

1. **변경 사항 저장**을 선택합니다.

### AWS CLI
<a name="awscli"></a>

[set-platform-application-attributes](https://docs.aws.amazon.com/cli/latest/reference/sns/set-platform-application-attributes.html) 명령을 실행합니다.

다음 예는 4가지 애플리케이션 이벤트 모두에 대해 동일한 Amazon SNS 주제를 설정합니다.

```
aws sns set-platform-application-attributes
--platform-application-arn arn:aws:sns:us-east-1:12345EXAMPLE:app/FCM/MyFCMPlatformApplication
--attributes EventEndpointCreated="arn:aws:sns:us-east-1:12345EXAMPLE:MyFCMPlatformApplicationEvents",
EventEndpointDeleted="arn:aws:sns:us-east-1:12345EXAMPLE:MyFCMPlatformApplicationEvents",
EventEndpointUpdated="arn:aws:sns:us-east-1:12345EXAMPLE:MyFCMPlatformApplicationEvents",
EventDeliveryFailure="arn:aws:sns:us-east-1:12345EXAMPLE:MyFCMPlatformApplicationEvents"
```

### AWS SDKs
<a name="application-event-notifications-sdk"></a>

 AWS SDK를 사용하여 Amazon SNS API로 `SetPlatformApplicationAttributes` 요청을 제출하여 애플리케이션 이벤트 알림을 설정합니다.

시작하기 도움말 및 이전 버전에 대한 정보를 포함하여 AWS SDK 개발자 안내서 및 코드 예제의 전체 목록은 섹션을 참조하세요[AWS SDK에서 Amazon SNS 사용](sdk-general-information-section.md).

# 모바일 푸시 API 작업
<a name="mobile-push-api"></a>

Amazon SNS 모바일 푸시 API를 사용하려면 먼저 Apple 푸시 알림 서비스(APN) 및 Firebase Cloud Messaging(FCM)과 같은 푸시 알림 서비스의 사전 조건을 충족해야 합니다. 필수 조건에 대한 자세한 정보는 [Amazon SNS 사용자 알림에 대한 사전 조건](sns-prerequisites-for-mobile-push-notifications.md)에서 확인하세요.

 API를 사용하여 모바일 앱 및 디바이스에 푸시 알림 메시지를 보내려면 먼저 `CreatePlatformApplication` 작업을 사용해야 합니다. 이 작업은 `PlatformApplicationArn` 속성을 반환합니다. 그런 다음 `PlatformApplicationArn`에서 `CreatePlatformEndpoint` 속성을 사용하며, 그 결과 `EndpointArn` 속성을 반환합니다. 이제 `EndpointArn` 속성을 `Publish` 작업과 함께 사용하면서 모바일 앱과 디바이스에 알림 메시지를 보낼 수 있습니다. 또는 `EndpointArn` 속성을 `Subscribe` 작업과 함께 사용하여 주제를 구독할 수 있습니다. 자세한 정보는 [Amazon SNS를 이용한 푸시 알림 설정하기](sns-mobile-application-as-subscriber.md#sns-user-notifications-process-overview)에서 확인하세요.

Amazon SNS 모바일 푸시 API는 다음과 같습니다.

`[CreatePlatformApplication](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html)`  
디바이스 및 모바일 앱이 등록될 수 있는 지원되는 푸시 알림 서비스(예: APN 및 FCM) 중 하나를 위해 플랫폼 애플리케이션 객체를 생성합니다. `PlatformApplicationArn` 속성을 반환합니다. 이 속성은 `CreatePlatformEndpoint` 작업에서 사용합니다.

`[CreatePlatformEndpoint](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html)`  
지원되는 푸시 알림 서비스 중 하나에 디바이스 및 모바일 앱을 위한 엔드포인트를 생성합니다. `CreatePlatformEndpoint`에서는 `PlatformApplicationArn` 작업에서 반환한 `CreatePlatformApplication` 속성을 사용합니다. 그런 다음 `EndpointArn`를 사용하여 반환된 `CreatePlatformEndpoint` 속성을 `Publish` 작업과 함께 사용하면서 모바일 앱과 디바이스에 알림 메시지를 보냅니다.

`[CreateTopic](https://docs.aws.amazon.com/sns/latest/api/API_CreateTopic.html)`  
메시지를 게시할 수 있는 주제를 생성합니다.

`[DeleteEndpoint](https://docs.aws.amazon.com/sns/latest/api/API_DeleteEndpoint.html)`  
지원되는 푸시 알림 서비스 중 하나에서 디바이스 및 모바일 앱을 위한 엔드포인트를 삭제합니다.

`[DeletePlatformApplication](https://docs.aws.amazon.com/sns/latest/api/API_DeletePlatformApplication.html)`  
플랫폼 애플리케이션 객체를 삭제합니다.

`[DeleteTopic](https://docs.aws.amazon.com/sns/latest/api/API_DeleteTopic.html)`  
주제 및 해당 주제의 모든 구독을 삭제합니다.

`[GetEndpointAttributes](https://docs.aws.amazon.com/sns/latest/api/API_GetEndpointAttributes.html)`  
디바이스 및 모바일 앱을 위한 엔드포인트 속성을 검색합니다.

`[GetPlatformApplicationAttributes](https://docs.aws.amazon.com/sns/latest/api/API_GetPlatformApplicationAttributes.html)`  
플랫폼 애플리케이션 객체의 속성을 검색합니다.

`[ListEndpointsByPlatformApplication](https://docs.aws.amazon.com/sns/latest/api/API_ListEndpointsByPlatformApplication.html)`  
지원되는 푸시 알림 서비스의 디바이스 및 모바일 앱을 위한 엔드포인트 및 엔드포인트 속성을 나열합니다.

`[ListPlatformApplications](https://docs.aws.amazon.com/sns/latest/api/API_ListPlatformApplications.html)`  
지원되는 푸시 알림 서비스에 대해 플랫폼 애플리케이션 객체를 나열합니다.

`[Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)`  
주제를 구독하는 모든 엔드포인트에 알림 메시지를 전송합니다.

`[SetEndpointAttributes](https://docs.aws.amazon.com/sns/latest/api/API_SetEndpointAttributes.html)`  
디바이스 및 모바일 앱을 위한 엔드포인트의 속성을 설정합니다.

`[SetPlatformApplicationAttributes](https://docs.aws.amazon.com/sns/latest/api/API_SetPlatformApplicationAttributes.html)`  
플랫폼 애플리케이션 객체의 속성을 설정합니다.

`[Subscribe](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html)`  
엔드포인트에 확인 메시지를 전송하여 엔드포인트에서 구독할 수 있도록 준비합니다. 구독을 실제로 생성하려면 엔드포인트 오너가 확인 메시지에서 토큰을 사용하여 ConfirmSubscription 작업을 호출해야 합니다.

`[Unsubscribe](https://docs.aws.amazon.com/sns/latest/api/API_Unsubscribe.html)`  
구독을 삭제합니다.

# 일반적인 Amazon SNS 모바일 푸시 API 오류
<a name="mobile-push-api-error"></a>

다음 표에는 모바일 푸시에 대해 Amazon SNS API에서 반환하는 오류가 나와 있습니다. 모바일 푸시용 Amazon SNS API에 대한 자세한 정보는 [모바일 푸시 API 작업](mobile-push-api.md)에서 확인하세요.


| 오류 | 설명 | HTTPS 상태 코드 | API 작업 | 
| --- | --- | --- | --- | 
| Application Name is null string | 필수 애플리케이션 이름이 null로 설정되었습니다. | 400 | `CreatePlatformApplication` | 
| Platform Name is null string | 필수 플랫폼 이름이 null로 설정되었습니다. | 400 | `CreatePlatformApplication` | 
| Platform Name is invalid | 플랫폼 이름으로 잘못된 값 또는 범위를 벗어나는 값이 제공되었습니다. | 400 | `CreatePlatformApplication` | 
| APNs — Principal is not a valid certificate | APN 보안 주체, 즉 "SSL 인증서"에 대해 잘못된 인증서가 제공되었습니다. 자세한 정보는 Amazon Simple Notification Service API 참조의 [CreatePlatformApplication](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html)을 참조하세요. | 400 | `CreatePlatformApplication` | 
| APNs — Principal is a valid cert but not in a .pem format | APN 보안 주체, 즉 "SSL 인증서"에 대해 유효하지만 .pem 형식이 아닌 인증서가 제공되었습니다. | 400 | `CreatePlatformApplication` | 
| APNs — Principal is an expired certificate | APN 보안 주체, 즉 "SSL 인증서"에 대해 만료된 인증서가 제공되었습니다. | 400 | `CreatePlatformApplication` | 
| APNs — Principal is not an Apple issued certificate | APN 보안 주체, 즉 "SSL 인증서"에 대해 Apple에서 발행하지 않은 인증서가 제공되었습니다. | 400 | `CreatePlatformApplication` | 
| APNs — Principal is not provided | APN 보안 주체, 즉 "SSL 인증서"가 제공되지 않았습니다. | 400 | `CreatePlatformApplication` | 
| APNs — Credential is not provided | APN 자격 증명, 즉 "개인 키"가 제공되지 않았습니다. 자세한 정보는 Amazon Simple Notification Service API 참조의 [CreatePlatformApplication](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html)을 참조하세요. | 400 | `CreatePlatformApplication` | 
| APNs — Credential are not in a valid .pem format | APN 자격 증명, 즉 "개인 키"가 유효한 .pem 형식이 아닙니다. | 400 | `CreatePlatformApplication` | 
| FCM — serverAPIKey is not provided | FCM 자격 증명, 즉 “API 키”가 제공되지 않았습니다. 자세한 정보는 Amazon Simple Notification Service API 참조의 [CreatePlatformApplication](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html)을 참조하세요. | 400 | `CreatePlatformApplication` | 
| FCM — serverAPIKey is empty | FCM 자격 증명, 즉 “API 키”가 비어 있습니다. | 400 | `CreatePlatformApplication` | 
| FCM — serverAPIKey is a null string | FCM 자격 증명, 즉 “API 키”가 null입니다. | 400 | `CreatePlatformApplication` | 
| FCM — serverAPIKey is invalid | FCM 자격 증명, 즉 “API 키”가 잘못되었습니다. | 400 | `CreatePlatformApplication` | 
| ADM — clientsecret is not provided | 필수 클라이언트 비밀번호가 제공되지 않았습니다. | 400 | `CreatePlatformApplication` | 
| ADM — clientsecret is a null string | 클라이언트 비밀번호에 대한 필수 문자열이 null입니다. | 400 | `CreatePlatformApplication` | 
| ADM — client\$1secret is empty string | 클라이언트 비밀번호에 대한 필수 문자열이 비어 있습니다. | 400 | `CreatePlatformApplication` | 
| ADM — client\$1secret is not valid | 클라이언트 비밀번호에 대한 필수 문자열이 유효하지 않습니다. | 400 | `CreatePlatformApplication` | 
| ADM — client\$1id is empty string | 클라이언트 ID에 대한 필수 문자열이 비어 있습니다. | 400 | `CreatePlatformApplication` | 
| ADM — clientId is not provided | 클라이언트 ID에 대한 필수 문자열이 제공되지 않았습니다. | 400 | `CreatePlatformApplication` | 
| ADM — clientid is a null string | 클라이언트 ID에 대한 필수 문자열이 null입니다. | 400 | `CreatePlatformApplication` | 
| ADM — client\$1id is not valid | 클라이언트 ID에 대한 필수 문자열이 유효하지 않습니다. | 400 | `CreatePlatformApplication` | 
| EventEndpointCreated has invalid ARN format | EventEndpointCreated에 유효하지 않은 ARN 형식이 있습니다. | 400 | `CreatePlatformApplication` | 
| EventEndpointDeleted has invalid ARN format | EventEndpointDeleted에 유효하지 않은 ARN 형식이 있습니다. | 400 | `CreatePlatformApplication` | 
| EventEndpointUpdated has invalid ARN format | EventEndpointUpdated에 유효하지 않은 ARN 형식이 있습니다. | 400 | `CreatePlatformApplication` | 
| EventDeliveryAttemptFailure has invalid ARN format | EventDeliveryAttemptFailure에 유효하지 않은 ARN 형식이 있습니다. | 400 | `CreatePlatformApplication` | 
| EventDeliveryFailure has invalid ARN format | EventDeliveryFailure에 유효하지 않은 ARN 형식이 있습니다. | 400 | `CreatePlatformApplication` | 
| EventEndpointCreated is not an existing Topic | EventEndpointCreated가 기존 주제가 아닙니다. | 400 | `CreatePlatformApplication` | 
| EventEndpointDeleted is not an existing Topic | EventEndpointDeleted가 기존 주제가 아닙니다. | 400 | `CreatePlatformApplication` | 
| EventEndpointUpdated is not an existing Topic | EventEndpointUpdated가 기존 주제가 아닙니다. | 400 | `CreatePlatformApplication` | 
| EventDeliveryAttemptFailure is not an existing Topic | EventDeliveryAttemptFailure가 기존 주제가 아닙니다. | 400 | `CreatePlatformApplication` | 
| EventDeliveryFailure is not an existing Topic | EventDeliveryFailure가 기존 주제가 아닙니다. | 400 | `CreatePlatformApplication` | 
| Platform ARN is invalid | 플랫폼 ARN이 유효하지 않습니다. | 400 | `SetPlatformAttributes` | 
| Platform ARN is valid but does not belong to the user | 플랫폼 ARN이 유효하지만 해당 사용자에게 속한 것이 아닙니다. | 400 | `SetPlatformAttributes` | 
| APNs — Principal is not a valid certificate | APN 보안 주체, 즉 "SSL 인증서"에 대해 잘못된 인증서가 제공되었습니다. 자세한 정보는 Amazon Simple Notification Service API 참조의 [CreatePlatformApplication](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html)을 참조하세요. | 400 | `SetPlatformAttributes` | 
| APNs — Principal is a valid cert but not in a .pem format | APN 보안 주체, 즉 "SSL 인증서"에 대해 유효하지만 .pem 형식이 아닌 인증서가 제공되었습니다. | 400 | `SetPlatformAttributes` | 
| APNs — Principal is an expired certificate | APN 보안 주체, 즉 "SSL 인증서"에 대해 만료된 인증서가 제공되었습니다. | 400 | `SetPlatformAttributes` | 
| APNs — Principal is not an Apple issued certificate | APN 보안 주체, 즉 "SSL 인증서"에 대해 Apple에서 발행하지 않은 인증서가 제공되었습니다. | 400 | `SetPlatformAttributes` | 
| APNs — Principal is not provided | APN 보안 주체, 즉 "SSL 인증서"가 제공되지 않았습니다. | 400 | `SetPlatformAttributes` | 
| APNs — Credential is not provided | APN 자격 증명, 즉 "개인 키"가 제공되지 않았습니다. 자세한 정보는 Amazon Simple Notification Service API 참조의 [CreatePlatformApplication](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html)을 참조하세요. | 400 | `SetPlatformAttributes` | 
| APNs — Credential are not in a valid .pem format | APN 자격 증명, 즉 "개인 키"가 유효한 .pem 형식이 아닙니다. | 400 | `SetPlatformAttributes` | 
| FCM — serverAPIKey is not provided | FCM 자격 증명, 즉 “API 키”가 제공되지 않았습니다. 자세한 정보는 Amazon Simple Notification Service API 참조의 [CreatePlatformApplication](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html)을 참조하세요. | 400 | `SetPlatformAttributes` | 
| FCM — serverAPIKey is a null string | FCM 자격 증명, 즉 “API 키”가 null입니다. | 400 | `SetPlatformAttributes` | 
| ADM — clientId is not provided | 클라이언트 ID에 대한 필수 문자열이 제공되지 않았습니다. | 400 | `SetPlatformAttributes` | 
| ADM — clientid is a null string | 클라이언트 ID에 대한 필수 문자열이 null입니다. | 400 | `SetPlatformAttributes` | 
| ADM — clientsecret is not provided | 필수 클라이언트 비밀번호가 제공되지 않았습니다. | 400 | `SetPlatformAttributes` | 
| ADM — clientsecret is a null string | 클라이언트 비밀번호에 대한 필수 문자열이 null입니다. | 400 | `SetPlatformAttributes` | 
| EventEndpointUpdated has invalid ARN format | EventEndpointUpdated에 유효하지 않은 ARN 형식이 있습니다. | 400 | `SetPlatformAttributes` | 
| EventEndpointDeleted has invalid ARN format | EventEndpointDeleted에 유효하지 않은 ARN 형식이 있습니다. | 400 | `SetPlatformAttributes` | 
| EventEndpointUpdated has invalid ARN format | EventEndpointUpdated에 유효하지 않은 ARN 형식이 있습니다. | 400 | `SetPlatformAttributes` | 
| EventDeliveryAttemptFailure has invalid ARN format | EventDeliveryAttemptFailure에 유효하지 않은 ARN 형식이 있습니다. | 400 | `SetPlatformAttributes` | 
| EventDeliveryFailure has invalid ARN format | EventDeliveryFailure에 유효하지 않은 ARN 형식이 있습니다. | 400 | `SetPlatformAttributes` | 
| EventEndpointCreated is not an existing Topic | EventEndpointCreated가 기존 주제가 아닙니다. | 400 | `SetPlatformAttributes` | 
| EventEndpointDeleted is not an existing Topic | EventEndpointDeleted가 기존 주제가 아닙니다. | 400 | `SetPlatformAttributes` | 
| EventEndpointUpdated is not an existing Topic | EventEndpointUpdated가 기존 주제가 아닙니다. | 400 | `SetPlatformAttributes` | 
| EventDeliveryAttemptFailure is not an existing Topic | EventDeliveryAttemptFailure가 기존 주제가 아닙니다. | 400 | `SetPlatformAttributes` | 
| EventDeliveryFailure is not an existing Topic | EventDeliveryFailure가 기존 주제가 아닙니다. | 400 | `SetPlatformAttributes` | 
| Platform ARN is invalid | 플랫폼 ARN이 유효하지 않습니다. | 400 | `GetPlatformApplicationAttributes` | 
| Platform ARN is valid but does not belong to the user | 플랫폼 ARN이 유효하지만 해당 사용자에게 속한 것이 아닙니다. | 403 | `GetPlatformApplicationAttributes` | 
| Token specified is invalid | 지정된 토큰이 유효하지 않습니다. | 400 | `ListPlatformApplications` | 
| Platform ARN is invalid | 플랫폼 ARN이 유효하지 않습니다. | 400 | `ListEndpointsByPlatformApplication` | 
| Platform ARN is valid but does not belong to the user | 플랫폼 ARN이 유효하지만 해당 사용자에게 속한 것이 아닙니다. | 404 | `ListEndpointsByPlatformApplication` | 
| Token specified is invalid | 지정된 토큰이 유효하지 않습니다. | 400 | `ListEndpointsByPlatformApplication` | 
| Platform ARN is invalid | 플랫폼 ARN이 유효하지 않습니다. | 400 | `DeletePlatformApplication` | 
| Platform ARN is valid but does not belong to the user | 플랫폼 ARN이 유효하지만 해당 사용자에게 속한 것이 아닙니다. | 403 | `DeletePlatformApplication` | 
| Platform ARN is invalid | 플랫폼 ARN이 유효하지 않습니다. | 400 | `CreatePlatformEndpoint` | 
| Platform ARN is valid but does not belong to the user | 플랫폼 ARN이 유효하지만 해당 사용자에게 속한 것이 아닙니다. | 404 | `CreatePlatformEndpoint` | 
| Token is not specified | 토큰이 지정되지 않았습니다. | 400 | `CreatePlatformEndpoint` | 
| Token is not of correct length | 토큰이 올바른 길이가 아닙니다. | 400 | `CreatePlatformEndpoint` | 
| Customer User data is too large | 고객 사용자 데이터는 UTF-8 인코딩 형식에서 2048바이트를 넘을 수 없습니다. | 400 | `CreatePlatformEndpoint` | 
| Endpoint ARN is invalid | 엔드포인트 ARN이 유효하지 않습니다. | 400 | `DeleteEndpoint` | 
| Endpoint ARN is valid but does not belong to the user | 엔드포인트 ARN이 유효하지만 해당 사용자에게 속한 것이 아닙니다. | 403 | `DeleteEndpoint` | 
| Endpoint ARN is invalid | 엔드포인트 ARN이 유효하지 않습니다. | 400 | `SetEndpointAttributes` | 
| Endpoint ARN is valid but does not belong to the user | 엔드포인트 ARN이 유효하지만 해당 사용자에게 속한 것이 아닙니다. | 403 | `SetEndpointAttributes` | 
| Token is not specified | 토큰이 지정되지 않았습니다. | 400 | `SetEndpointAttributes` | 
| Token is not of correct length | 토큰이 올바른 길이가 아닙니다. | 400 | `SetEndpointAttributes` | 
| Customer User data is too large | 고객 사용자 데이터는 UTF-8 인코딩 형식에서 2048바이트를 넘을 수 없습니다. | 400 | `SetEndpointAttributes` | 
| Endpoint ARN is invalid | 엔드포인트 ARN이 유효하지 않습니다. | 400 | `GetEndpointAttributes` | 
| Endpoint ARN is valid but does not belong to the user | 엔드포인트 ARN이 유효하지만 해당 사용자에게 속한 것이 아닙니다. | 403 | `GetEndpointAttributes` | 
| Target ARN is invalid | 대상 ARN이 유효하지 않습니다. | 400 | `Publish` | 
| Target ARN is valid but does not belong to the user | 대상 ARN이 유효하지만 해당 사용자에게 속한 것이 아닙니다. | 403 | `Publish` | 
| Message format is invalid | 메시지 형식이 잘못되었습니다. | 400 | `Publish` | 
| Message size is larger than supported by protocol/end-service | 메시지 크기가 protocol/end-service에서 지원하는 크기보다 큽니다. | 400 | `Publish` | 

# 모바일 푸시 알림에 Amazon SNS Time To Live(TTL) 메시지 속성 사용
<a name="sns-ttl"></a>

Amazon Simple Notification Service(Amazon SNS)는 모바일 푸시 알림 메시지에 대한 *유지 시간(TTL)* 메시지 속성 설정을 지원합니다. 이 기능은 Android에 전송 시 Amazon Device Messaging(ADM) 및 Firebase Cloud Messaging(FCM)과 같이 이를 지원하는 모바일 푸시 알림 서비스에 대해 Amazon SNS 메시지 본문 내에서 TTL을 설정하는 기존 기능에 추가된 것입니다.

TTL 메시지 속성은 메시지에 대한 만료 메타 데이터를 지정하는 데 사용됩니다. 이를 통해 Apple 푸시 알림 서비스(APN) 또는 FCM과 같은 푸시 알림 서비스가 메시지를 엔드포인트에 전달해야 하는 시간을 지정할 수 있습니다. 모바일 디바이스가 꺼져 있는 등의 이유로 인해 지정한 TTL 내에 메시지를 전송할 수 없으면 메시지가 삭제되고 더 이상 전송 시도가 이루어지지 않습니다. 메시지 속성 내에서 TTL을 지정하려면 AWS Management Console AWS 소프트웨어 개발 키트(SDKs) 또는 쿼리 API를 사용할 수 있습니다.

## 푸시 알림 서비스에 대한 TTL 메시지 속성
<a name="sns-ttl-msg-attrib"></a>

다음은 AWS SDKs 


****  

| 푸시 알림 서비스 | TTL 메시지 속성 | 
| --- | --- | 
| Amazon Device Messaging(ADM) | AWS.SNS.MOBILE.ADM.TTL | 
| Apple 푸시 알림 서비스(APN) | AWS.SNS.MOBILE.APNS.TTL | 
| Apple 푸시 알림 서비스 샌드박스(APNS\$1SANDBOX) | AWS.SNS.MOBILE.APNS\$1SANDBOX.TTL | 
| Baidu 클라우드 푸시(Baidu) | AWS.SNS.MOBILE.BAIDU.TTL | 
| Firebase Cloud Messaging(Android로 전송 시 FCM) | AWS.SNS.MOBILE.FCM.TTL | 
| Windows 푸시 알림 서비스(WNS) | AWS.SNS.MOBILE.WNS.TTL | 

각 푸시 알림 서비스는 TTL을 다르게 처리합니다. Amazon SNS는 모든 푸시 알림 서비스에 대한 TTL의 추상 보기를 제공하므로 TTL을 더 쉽게 지정할 수 있습니다. AWS Management Console 를 사용하여 TTL(초)을 지정하는 경우 TTL 값을 한 번만 입력하면 Amazon SNS가 메시지를 게시할 때 선택한 각 푸시 알림 서비스에 대한 TTL을 계산합니다.

 TTL은 게시 시간과 상관관계가 있습니다. 푸시 알림 메시지를 특정 푸시 알림 서비스에 넘겨주기 전에 Amazon SNS는 푸시 알림에 대한 유지 시간(게시 타임스탬프 시간부터 푸시 알림 서비스에 넘겨주기 직전까지의 시간)을 계산하여 남은 TTL을 특정 푸시 알림 서비스에 전달합니다. TTL이 유지 시간보다 짧을 경우 Amazon SNS는 게시를 시도하지 않습니다.

푸시 알림 메시지에 대해 TTL을 지정하는 경우 `0`의 값이 Android에 전송 시 APN 및 FCM과 같이 푸시 알림 서비스에 대해 특정 의미를 갖지 않는 한 TTL 값은 양의 정수여야 합니다. TTL 값이 `0`으로 설정된 경우 해당 푸시 알림 서비스에서 `0`이 특별한 의미가 없으면 Amazon SNS는 메시지를 삭제합니다. APN을 사용할 때 `0`으로 설정된 TTL 파라미터에 대한 자세한 정보는 [이진 공급자 API](https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/BinaryProviderAPI.html) 설명서의 *표 A-3 원격 알림에 대한 항목 식별자*를 참조하세요.

## TTL 정의를 위한 우선 순위
<a name="sns-ttl-precedence"></a>

Amazon SNS가 푸시 알림 메시지의 TTL을 정의하기 위해 사용하는 우선순위는 다음 순서를 기반으로 하며, 여기서 번호가 낮을수록 우선순위가 높은 것입니다.

1. 메시지 속성 TTL

1. 메시지 본문 TTL

1. 푸시 알림 서비스 기본 TTL(서비스별로 다름)

1. Amazon SNS 기본 TTL(4주)

동일한 메시지에 대해 다른 TTL 값을 설정하면(메시지 속성과 메시지 본문에 대해 서로 다른 값) Amazon SNS가 메시지 본문의 TTL을 수정하여 메시지 속성에 지정된 TTL에 맞춥니다.

## 를 사용하여 TTL 지정 AWS Management Console
<a name="sns-ttl-console"></a>

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

1. 탐색 창에서 **모바일(Mobile)**, **푸시 알림(Push notifications)**을 선택합니다.

1. **Mobile push notifications(모바일 푸시 알림)** 페이지의 **플랫폼 애플리케이션** 섹션에서 애플리케이션을 선택합니다.

1. ***내 애플리케이션*** 페이지의 **엔드포인트** 섹션에서 애플리케이션 엔드포인트를 선택한 후 **메시지 게시**를 선택합니다.

1. **메시지 세부 정보** 섹션에서 TTL을 입력합니다. 푸시 알림 서비스가 엔드포인트에 메시지를 전송할 시간(초)입니다.

1. **메시지 게시**를 선택합니다.

# Amazon SNS 모바일 애플리케이션 지원 리전
<a name="sns-mobile-push-supported-regions"></a>

현재 다음 리전에서 모바일 애플리케이션을 생성할 수 있습니다.
+ 미국 동부(오하이오)
+ 미국 동부(버지니아 북부)
+ 미국 서부(캘리포니아 북부)
+ 미국 서부(오리건)
+ 아프리카(케이프타운)
+ 아시아 태평양(홍콩)
+ 아시아 태평양(자카르타)
+ 아시아 태평양(뭄바이)
+ 아시아 태평양(오사카)
+ 아시아 태평양(서울)
+ 아시아 태평양(싱가포르)
+ 아시아 태평양(시드니)
+ 아시아 태평양(도쿄)
+ 캐나다(중부)
+ 유럽(프랑크푸르트)
+ 유럽(아일랜드)
+ 유럽(런던)
+ 유럽(밀라노)
+ 유럽(스페인)
+ 유럽(파리)
+ 유럽(스톡홀름)
+ Middle East (Bahrain)
+ 중동(UAE)
+ 남아메리카(상파울루)
+ AWS GovCloud(미국 서부)

# Amazon SNS 모바일 푸시 알림 관리 모범 사례
<a name="mobile-push-notifications-best-practices"></a>

이 섹션에서는 고객 참여를 개선하는 데 도움이 되는 모범 사례에 대해 설명합니다.

## 엔드포인트 관리
<a name="channels-sms-best-practices-endpoint-management"></a>

디바이스에서 사용자의 작업(예: 앱이 디바이스에 다시 설치됨)으로 인해 디바이스 토큰이 변경되거나 특정 iOS 버전에서 실행되는 디바이스에 영향을 미치는 [인증서 업데이트](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_certificate-based_connection_to_apns)로 인해 전송 문제가 발생할 수 있습니다. 앱이 시작될 때마다 APN에 [등록](https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/HandlingRemoteNotifications.html#:~:text=Registering%20to%20Receive%20Remote%20Notifications)하는 것이 Apple에서 권장하는 모범 사례입니다.

사용자가 앱을 열 때마다 디바이스 토큰이 변경되지 않으므로 멱등 [https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html) API를 사용할 수 있습니다. 그러나 이렇게 하면 토큰 자체가 유효하지 않거나 엔드포인트가 유효하지만 사용 중지된 경우(예: 프로덕션 환경과 샌드박스 환경의 불일치) 동일한 디바이스에 대해 중복이 발생할 수 있습니다.

[의사(Pseudo) 코드](mobile-platform-endpoint.md#mobile-platform-endpoint-pseudo-code)에 있는 것과 같은 디바이스 토큰 관리 메커니즘을 사용할 수 있습니다.

FCM v1 디바이스 토큰 관리 및 유지에 대한 자세한 내용은 [Firebase Cloud Messaging 엔드포인트의 Amazon SNS 관리](sns-fcm-endpoint-management.md) 섹션을 참조하세요.

## 전송 상태 로깅
<a name="channels-sms-best-practices-delivery-logging"></a>

푸시 알림 전송 상태를 모니터링하려면 Amazon SNS 플랫폼 애플리케이션에 대한 전송 상태 로깅을 사용 설정하는 것이 좋습니다. 로그에는 푸시 플랫폼 서비스에서 반환된 공급자 [응답 코드](sns-msg-status.md#platform-returncodes)가 포함되어 있으므로 전송 실패 문제를 해결하는 데 도움이 됩니다. 전송 상태 로깅 사용 설정에 대한 자세한 내용은 [푸시 알림에 대한 Amazon SNS 주제 전송 로그에 액세스하려면 어떻게 해야 합니까?](https://aws.amazon.com/premiumsupport/knowledge-center/troubleshoot-failed-sns-deliveries/)를 참조하세요.

## 이벤트 알림
<a name="channels-sms-best-practices-event-notifications"></a>

이벤트 기반 방식으로 엔드포인트를 관리하기 위해 [이벤트 알림](application-event-notifications.md#application-event-notifications-sdk) 기능을 사용할 수 있습니다. 이렇게 하면 구성된 Amazon SNS 주제가 엔드포인트 생성, 삭제, 업데이트 및 전송 실패와 같은 플랫폼 애플리케이션 이벤트에 대해 Lambda 함수와 같은 구독자에게 이벤트를 팬아웃할 수 있습니다.