> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 구독

> OneSignal에서 모바일 푸시, 웹 푸시, 이메일 및 SMS 전반의 구독을 관리하세요. 속성, 상태, 업데이트 및 마이그레이션 방법을 다룹니다.

## 개요

**구독**은 사용자가 메시지를 받을 수 있는 특정 채널(예: 이메일 주소, 전화번호 또는 기기)을 나타냅니다. OneSignal은 네 가지 유형의 구독을 지원합니다:

| 구독 유형    | 수신 가능 항목                  |
| -------- | ------------------------- |
| **이메일**  | 이메일 메시지                   |
| **SMS**  | SMS, MMS, RCS 메시지         |
| **웹 푸시** | 웹 푸시 알림                   |
| **모바일**  | 모바일 푸시 알림, 인앱 메시지, 라이브 활동 |

각 사용자는 여러 구독을 가질 수 있습니다. [외부 ID](./users#external-id)를 사용하여 모든 구독에서 사용자를 식별하세요.

<Frame caption="OneSignal 대시보드 Audience > Subscriptions 페이지. 외부 ID를 통해 단일 사용자와 연결된 여러 구독을 보여줍니다.">
  <img src="https://mintcdn.com/onesignal/ciRrThfP6xMpI7GY/images/dashboard/subscription-types.png?fit=max&auto=format&n=ciRrThfP6xMpI7GY&q=85&s=7b88e08aaeb18e979c4e52949359ae36" alt="Subscriptions page showing Email, SMS, Web Push, and Mobile subscriptions linked by External ID" width="3424" height="920" data-path="images/dashboard/subscription-types.png" />
</Frame>

위 이미지에서 "userA"는 5개의 구독을 가지고 있습니다:

1. **모바일** (iOS) iOS 앱 설치 후 생성됨. `OneSignal.login`을 호출하여 외부 ID를 설정하고 구독을 사용자에게 연결하세요.
2. **SMS** iOS 앱 내에서 전화번호가 제공된 후 생성됨. 자세한 내용은 아래 [SMS 구독](#sms-subscriptions)을 참조하세요.
3. **웹 푸시** 웹사이트에서 푸시를 구독한 후 생성됨. 푸시 알림을 받을 수 있습니다.
4. **이메일** 이메일 주소가 제공된 후 생성됨. 이메일 메시지 전송용입니다.
5. **모바일** (Android) Android 앱 설치 후 생성됨. 푸시 알림, 인앱 메시지 및 라이브 활동을 받을 수 있습니다.

<Note>
  사용자는 최대 20개의 구독을 가질 수 있습니다. 21번째가 추가되면 OneSignal은 가장 오래된 구독(마지막 세션 기준)에서 외부 ID를 제거하고 새 OneSignal ID를 할당하여 비활성 구독에 대해 새 익명 사용자를 효과적으로 생성합니다.

  그러나 OneSignal은 최소 3개의 이메일 및 3개의 SMS 구독(해당되는 경우)이 유지되도록 보장합니다.

  자세한 내용은 [사용자](./users)를 참조하세요.
</Note>

<Frame>
  <iframe width="560" height="315" src="https://www.youtube.com/embed/yZM6zn7nLDw?si=oT7ncbhX0sNtmKML" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen />
</Frame>

***

## 구독 속성

각 구독에는 다음 속성이 있습니다:

|        속성        | 설명                                                                                                                                                                                          |
| :--------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|      **채널**      | 구독 유형: `Email`, `SMS` 또는 `Push`. 푸시는 모바일(iOS, Android 등) 또는 웹일 수 있습니다. 모바일 푸시 구독만 인앱 메시지를 지원합니다.                                                                                            |
|     **구독 상태**    | 구독이 메시지를 받을 수 있는지 여부를 나타냅니다. 자세한 내용은 [구독 상태](#subscription-statuses)를 참조하세요.                                                                                                                |
|    **마지막 세션**    | OneSignal SDK가 추적한 마지막 세션의 타임스탬프입니다. 이메일/SMS의 경우 가장 최근 푸시 구독을 기반으로 합니다.                                                                                                                     |
|     **사용 기간**    | OneSignal SDK가 추적한 앱 또는 사이트에서 구독이 활성 상태였던 총 시간(초)입니다. 세션이 60초를 초과할 때만 추적됩니다.                                                                                                                |
|      **세션**      | 앱/사이트가 열린 횟수입니다. 포커스를 벗어난 후 30초 이상 지나면 새 세션이 시작됩니다.                                                                                                                                         |
|    **첫 번째 세션**   | 사용자에 대한 첫 번째 구독이 생성된 타임스탬프입니다.                                                                                                                                                              |
|     **IP 주소**    | OneSignal SDK를 사용할 때의 네트워크 위치입니다. EU에서는 수집되지 않습니다. [개인 데이터 처리](./handling-personal-data)를 참조하세요.                                                                                            |
|     **구독 ID**    | 특정 구독을 나타내는 UUID입니다. 구독을 식별하는 데 사용됩니다.                                                                                                                                                      |
| **OneSignal ID** | 사용자를 나타내는 UUID입니다. [사용자](./users)를 참조하세요.                                                                                                                                                   |
|     **외부 ID**    | 사용자 지정 사용자 ID입니다. 여러 구독을 동일한 사용자에게 연결하는 데 도움이 됩니다.                                                                                                                                          |
|      **기기**      | 구독이 생성된 기기 모델입니다. 예를 들어 웹 푸시 브라우저의 `armv81`은 Android 기기입니다.                                                                                                                                 |
|      **이메일**     | 이메일 구독에만 설정됩니다.                                                                                                                                                                             |
|     **전화번호**     | SMS 구독에만 설정됩니다. [E.164 형식](https://en.wikipedia.org/wiki/E.164)이어야 합니다.                                                                                                                     |
|     **앱 버전**     | SDK에서: Android `versionCode`, iOS `CFBundleShortVersionString`.                                                                                                                             |
|    **SDK 버전**    | 사용된 OneSignal SDK의 버전입니다. [GitHub > SDKs (select your SDK) > Releases](https://github.com/OneSignal/sdks)를 참조하세요.                                                                           |
|    **시간대 ID**    | 마지막 상호 작용 시 기기에서 가져옵니다.                                                                                                                                                                     |
|      **국가**      | IP 주소에서 파생됩니다.                                                                                                                                                                              |
|     **위치 점**     | 위치 추적이 활성화된 경우 위도/경도입니다. [위치 트리거 알림](./location-triggered-event)을 참조하세요.                                                                                                                    |
|     **언어 코드**    | 구독 생성 시 기기에서 가져옵니다. [다국어 메시징](./multi-language-messaging)을 참조하세요.                                                                                                                           |
|      **태그**      | 사용자 지정 키-값 메타데이터입니다. [태그](./add-user-data-tags)를 참조하세요.                                                                                                                                     |
|     **푸시 토큰**    | 푸시 전달에 사용되는 플랫폼 토큰(예: APNS 또는 FCM)입니다. 푸시 구독에만 해당됩니다.<br />- **iOS 푸시 APNS 토큰 형식**: 64자, 16진수 문자만 (0-9,a-f).<br />- **Android 푸시 FCM 토큰 형식**: 일반적으로 163자, 영숫자 문자, 하이픈, 콜론 및 밑줄을 포함할 수 있습니다. |
|      **루팅됨**     | Android 기기가 루팅(탈옥)되었는지 여부를 나타냅니다.                                                                                                                                                           |

### 구독 상태

일반적으로 구독은 메시지를 받을 수 있거나(**구독됨**) 메시지를 받을 수 없습니다(**구독 취소됨**). 세부 사항은 채널마다 다릅니다:

| 상태           | 모바일                                                                                                                         | 웹 푸시                                                                                    | 이메일                                                                                                                                              | SMS                                                                     |
| ------------ | --------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------- |
| **구독됨**      | 사용자가 푸시 권한을 허용했습니다. [iOS 임시 푸시](./ios-provisional-push-notifications)를 사용하면 모든 iOS 구독이 구독됨 상태로 시작됩니다.                       | 사용자가 브라우저 권한 프롬프트에서 "허용"을 클릭했습니다.                                                       | 이메일 주소가 유효하고 사용자가 동의했습니다.                                                                                                                        | 전화번호가 유효하고 사용자가 동의했습니다.                                                 |
| **구독 취소됨**   | 푸시를 받을 수 없지만 **인앱 메시지는 받을 수 있습니다**. [제거, 구독 취소 및 잘못된 토큰 처리](#handling-uninstalls-unsubscribes--invalid-push-tokens)를 참조하세요. | 푸시를 받을 수 없습니다. [구독 취소 및 잘못된 토큰 처리](#handling-unsubscribes--invalid-push-tokens)를 참조하세요. | 사용자가 [구독 취소 링크](./unsubscribe-links-email-subscriptions)를 통해 옵트아웃했습니다. 트랜잭션 이메일의 경우 [재정의](./email-messaging#send-to-unsubscribed-users)할 수 있습니다. | 사용자가 "STOP" 또는 기타 [옵트아웃 키워드](./sms-consent-keyword-management)로 답장했습니다. |
| **구독한 적 없음** | 사용자가 프롬프트를 받은 적이 없거나 권한을 허용한 적이 없습니다.                                                                                       | 사용자가 프롬프트를 받은 적이 없거나 프롬프트를 차단했습니다.                                                      | 해당 없음                                                                                                                                            | 해당 없음                                                                   |

<Info>
  API에서 `invalid_identifier: true`는 구독 취소를 의미합니다. 자세한 내용은 `notification_types`를 확인하세요.
</Info>

***

### `notification_types`

실패 이유를 포함하여 구독이 메시지를 받을 수 있는 능력을 나타냅니다. 프론트엔드 SDK를 통해 자동으로 업데이트되거나 API를 통해 수동으로 업데이트됩니다. [사용자 보기 API](/reference/view-user) 또는 [CSV 내보내기](/reference/csv-export)를 통해 볼 수 있습니다.

<Accordion title="알림 유형 정의." icon="circle-chevron-down">
  `1` 또는 양수 = 구독됨.

  * 구독이 이 채널에서 메시지를 받을 수 있습니다.
  * 사용자를 대신하여 메시지를 활성화하는 경우 `enabled` 속성과 함께 사용할 수 있습니다. 푸시 구독의 경우 푸시 알림을 받으려면 여전히 유효한 `token`이 설정되어야 합니다. 자세한 내용은 SDK 설정 문서를 참조하세요.

  `0`, `-99` = 구독한 적 없음.

  * 구독이 아직 채널을 구독하지 않았습니다.

  `-2` = 구독 취소됨.

  * 구독이 이 채널에서 메시지를 받을 수 없습니다.
  * 사용자를 대신하여 메시지를 끄는 경우 `enabled` 속성을 `false`로 설정하여 사용할 수 있습니다. 메시지 권한을 끌 때 권장되는 값입니다.
  * 사용자가 구독을 취소하면 자동으로 설정됩니다.

  `-3`, `-5` = Android `Support Library Error`.

  앱의 [Android Support Library](https://developers.google.com/android/)를 추가하거나 업데이트하세요.

  `-4`, `-8`, `-11`, `-12` = Android `Google Play Services Library Error`.

  * logcat을 확인하세요. [디버그 로그 가져오기](./capturing-a-debug-log)를 참조하세요.
  * 앱에서 [Google Play Services Library](https://developers.google.com/android/)를 업그레이드하고 Google Play Services 오류에 대한 앱의 logcat을 확인하세요. [디버그 로그 가져오기](./capturing-a-debug-log)를 참조하세요.

  `-6` = Android `Invalid Google Project Number`.

  * FCMv1 Sender ID가 이 `token`이 속한 원본과 일치하지 않습니다. 앱의 logcat을 확인하세요. [디버그 로그 가져오기](./capturing-a-debug-log)를 참조하세요.

  `-7`, `-9` = Android `Outdated Google Play Services App`

  * 기기에서 Google Play Services 앱을 업데이트하거나 활성화하세요.

  `-10` = 구독되지 않음.

  * 푸시 구독이 앱을 제거했거나 기기 설정에서 구독을 취소했습니다.
  * 웹 푸시가 알림을 차단했거나 모든 데이터와 워커를 지웠습니다.

  `-13` = iOS `missing_push_capability`.

  * 모든 단계가 구현되었는지 확인하려면 SDK 설정 문서를 검토하세요. [채널 설정](./channel-setup)을 참조하세요.

  `-14`, `-16`, `-17` = iOS `APNS Errors`.

  * 기기가 APNS에 연결하는 데 문제가 있습니다. [iOS 문제 해결](./mobile-troubleshooting) 가이드 및 [디버그 로그 가져오기](./capturing-a-debug-log)를 확인하세요.

  `-15` = iOS `Simulator Error`.

  * iOS Simulator에는 iOS 16.4 이상이 필요합니다. 다른 시뮬레이터 또는 기기를 사용하세요.

  `-18` = 프롬프트 표시 안 됨.

  * 구독이 구독하라는 프롬프트를 받은 적이 없습니다. 이는 필수 권한 프롬프트만 추적하며 인앱 메시지는 포함하지 않습니다.

  `-19` = 프롬프트 표시되었지만 응답 없음.

  * 구독이 프롬프트를 받았지만 응답을 제공하지 않았습니다.

  `-20`, `-21` = temp\_web\_record. 웹, `pushSubscriptionchange` 권한 취소됨

  `-22` = 대시보드를 통해 수동으로 구독 취소됨.

  * 권한이 취소되었습니다.

  `-23`, `-24` = 웹 `Service Worker Error`.

  * [웹 SDK 문제 해결](./troubleshooting-web-push)을 참조하세요.

  `-31` = REST API를 통해 비활성화됨.

  `-98` = SMS 구독이 이중 옵트인을 기다리는 중입니다.
</Accordion>

***

## 모바일 구독

모바일 구독은 iOS, Android, Huawei 또는 Amazon 기기를 나타내며 다음을 지원합니다:

* 푸시 알림
* 인앱 메시지
* 라이브 활동

사용자가 OneSignal SDK로 앱을 설치하고 열 때 자동으로 생성됩니다.

<Note>
  각 모바일 구독은 생성된 기기 및 푸시 토큰에 연결됩니다. 앱이 제거되고 동일한 기기에 다시 설치되면 새 구독이 생성됩니다.

  사용자가 앱을 열 때마다 [`OneSignal.login`](./mobile-sdk-reference#login-external-id)을 호출하여 [외부 ID](./users#external-id)가 설정되고 구독이 사용자에게 연결되도록 하세요.
</Note>

### 모바일 구독 업데이트

[OneSignal 모바일 SDK](./mobile-sdk-reference)를 사용하여 모바일 구독 속성을 업데이트하세요.

* [푸시 권한 프롬프트](./prompt-for-push-permissions) 및 [권한/구독 변경 관찰](./mobile-sdk-reference#addobserver-push-subscription-changes)
* [사용자 로그인](./mobile-sdk-reference#login-external-id)하여 외부 ID 및 별칭 설정
* [태그](./add-user-data-tags) 추가
* [언어](./multi-language-messaging) 설정

[CSV 가져오기](./import) 기능을 통해 태그, 언어 및 기타 일부 속성을 업데이트할 수 있습니다.

모바일 구독은 [사용자](/reference/create-user) 및 [구독](/reference/create-subscription) API를 통해서도 생성 및 업데이트할 수 있지만 대부분의 사용 사례에는 모바일 SDK가 권장됩니다.

### 제거, 구독 취소 및 잘못된 푸시 토큰 처리

다음의 경우 모바일 구독은 푸시 알림 수신을 중지합니다:

* 앱을 제거
* 기기 설정에서 푸시를 비활성화하고 앱을 다시 열지 않음
* [푸시 토큰 만료](./fcm-expired-token-faq)

이러한 경우 푸시 알림을 보낼 때 구독 상태가 **구독 취소됨**으로 설정됩니다. 자세한 내용은 아래 [푸시 구독 상태는 언제 업데이트되나요?](#when-do-push-subscription-statuses-update)를 참조하세요.

* 사용자가 동일한 기기 또는 새 기기에 앱을 다시 설치하면 새 구독이 생성되며 메시지를 받으려면 다시 구독해야 합니다.
* 사용자가 기기 설정에서 푸시를 다시 활성화하면 앱을 열 때 구독 상태가 **구독됨**으로 설정되고 푸시 토큰이 업데이트됩니다.
* 푸시 토큰이 만료되면 사용자가 동일한 기기에서 앱을 열 때 구독 상태 및 새 푸시 토큰이 업데이트됩니다.

다음을 통해 변경 사항을 추적하세요:

* [이벤트 스트림](./event-streams) - 푸시 전송 시 구독 취소 감지
* [푸시 보고서](./push-notification-message-reports) - 푸시 전송 시 구독 취소 감지
* SDK의 [구독 변경 리스너](./mobile-sdk-reference#addobserver-push-subscription-changes) 사용 - 사용자가 기기 설정에서 푸시를 비활성화한 후 앱을 열 때 구독 취소 감지

***

## 웹 푸시 구독

웹 푸시 구독은 특정 기기, 브라우저 및 브라우저 프로필에 연결됩니다. Chrome 데스크톱에서 구독한 사용자는 해당 모바일 기기에서도 웹사이트를 구독하지 않는 한 Chrome 모바일에서 푸시를 받을 수 없으며, 이는 별도의 웹 푸시 구독을 생성합니다.

다음 시나리오에서 새 웹 푸시 구독이 생성됩니다:

* 사용자가 브라우저의 시스템 수준 [네이티브 권한 프롬프트](./permission-requests)에서 "허용"을 클릭하여 웹사이트를 구독합니다. 이렇게 하면 고유한 푸시 토큰 및 구독 ID가 생성됩니다.
* 사용자가 브라우저 데이터(기록, 캐시, 쿠키, 로컬 스토리지)를 지우고 사이트를 다시 방문합니다. 이렇게 하면 새 고유 구독 ID가 생성됩니다.

<Note>
  웹 푸시 구독 ID는 절대 변경되지 않습니다. 그러나 사용자가 브라우저 데이터를 지우고 사이트로 돌아오거나 다른 브라우저/브라우저 프로필에서 구독하는 경우 새 구독 ID가 생성됩니다.

  사용자가 사이트를 열 때마다 또는 [구독 변경 리스너](./web-sdk-reference#addeventlistener-push-subscription-changes) 내에서 [`OneSignal.login`](./web-sdk-reference#login-external-id)을 호출하여 [외부 ID](./users#external-id)가 설정되고 구독이 사용자에게 연결되도록 하세요.
</Note>

### 웹 푸시 구독 업데이트

[OneSignal 웹 SDK](./web-sdk-reference)를 사용하여 웹 푸시 구독 속성을 업데이트하세요.

* [푸시 권한 프롬프트](./permission-requests) 및 [권한/구독 변경 관찰](./web-sdk-reference#addeventlistener-push-subscription-changes)
* [사용자 로그인](./web-sdk-reference#login-external-id)하여 외부 ID 및 별칭 설정
* [태그](./add-user-data-tags) 추가
* [언어](./multi-language-messaging) 설정

[CSV 가져오기](./import) 기능을 통해 태그, 언어 및 기타 일부 속성을 업데이트할 수 있습니다.

웹 푸시 구독은 REST API를 통해 생성할 수 없습니다. [사용자](/reference/update-user) 및 [구독](/reference/update-subscription) API로 업데이트할 수 있지만 대부분의 사용 사례에는 웹 SDK가 권장됩니다.

### 구독 취소 및 잘못된 푸시 토큰 처리

다음의 경우 웹 푸시 구독은 푸시 알림 수신을 중지합니다:

* 브라우저 데이터(기록, 캐시, 쿠키, 로컬 스토리지)를 지움
* 브라우저 시스템 설정에서 푸시를 비활성화
* [푸시 토큰 만료](./fcm-expired-token-faq)

이러한 경우 푸시 알림을 보낼 때 구독 상태가 **구독 취소됨**으로 설정됩니다. 자세한 내용은 아래 [푸시 구독 상태는 언제 업데이트되나요?](#when-do-push-subscription-statuses-update)를 참조하세요.

* 사용자가 브라우저 데이터를 지운 후 사이트로 돌아오면 새 구독이 생성되며 [자동 재구독이 활성화](./web-push-setup#auto-resubscribe)된 경우 자동으로 다시 구독되어 메시지를 받습니다.
* 사용자가 브라우저 설정에서 푸시를 다시 활성화하면 사이트로 돌아올 때 구독 상태가 **구독됨**으로 설정됩니다.
* 푸시 토큰이 만료되면 사용자가 사이트로 돌아올 때 구독 상태 및 새 푸시 토큰이 업데이트됩니다.

<Warning>
  Chromium은 2025년 10월에 [블로그 게시물](https://blog.chromium.org/2025/10/automatic-notification-permission.html?m=1)을 게시하여 사이트 참여도가 낮은 사용자에게 대량의 알림을 보내는 경우 **자동으로 푸시 권한을 취소**하는 변경 사항에 대해 설명했습니다. 사용자가 [낮은 참여 점수](https://www.chromium.org/developers/design-documents/site-engagement/)를 갖는 것으로 간주되는 임계값은 약 30일의 비활성 기간인 것으로 보입니다. 취소되면 최종 사용자는 Chrome에서 직접 알림을 받아야 합니다.
</Warning>

다음을 통해 변경 사항을 추적하세요:

* [이벤트 스트림](./event-streams) - 푸시 전송 시 구독 취소 감지
* [푸시 보고서](./push-notification-message-reports) - 푸시 전송 시 구독 취소 감지
* SDK의 [구독 변경 리스너](./web-sdk-reference#addeventlistener-push-subscription-changes) 사용 - 사용자가 푸시를 비활성화한 후 사이트로 돌아올 때 구독 취소 감지

***

## 이메일 구독

이메일 구독은 이메일 주소를 기반으로 하며 이메일 전달에만 사용됩니다. 이는 [태그](./add-user-data-tags) 설정과는 다릅니다.

다음을 통해 이메일 구독을 생성하세요:

1. SDK `addEmail` 메서드 또는 [이메일 프롬프트](./permission-requests) - `OneSignal.login`을 호출하여 외부 ID를 설정하고 구독을 사용자에게 연결한 후 이러한 메서드를 사용하세요.
2. [사용자 생성 API](/reference/create-user) 또는 [이메일 생성 API](/reference/email)
3. 대시보드 [CSV 가져오기](./import) 또는 수동으로 이메일 주소 추가

<Note>
  이메일은 앱마다 고유합니다. 동일한 이메일을 삭제하고 다시 추가하면 새 구독 ID가 생성됩니다.

  이메일 구독을 생성할 때 `external_id`를 포함하여 [사용자](./users)에게 연결하는 것이 권장됩니다.
</Note>

### 이메일 구독 관리

**사용자에게 연결**

이메일 구독을 생성할 때 `external_id`를 설정하여 [사용자](./users)에게 연결하세요.

* SDK를 사용하는 경우 `addEmail`을 호출하기 전에 `login` 메서드를 호출하여 `external_id`를 설정하고 이메일 구독을 사용자에게 연결하세요.
* CSV 가져오기 또는 REST API를 사용하는 경우 이메일과 함께 `external_id` 식별자를 설정하세요.

**구독 상태**

새로 생성된 이메일 구독은 달리 지정하지 않는 한 자동으로 **구독됨**으로 설정됩니다.

다음의 경우 이메일 구독은 구독 취소될 수 있습니다:

* 이메일을 보낼 때 사용자가 [구독 취소 링크](./unsubscribe-links-email-subscriptions)를 통해 옵트아웃
* API를 통해 `enabled`를 `false`로 설정
* 대시보드를 사용하여 옵션 버튼을 통해 구독 취소
  다음을 통해 이메일 구독은 다시 구독될 수 있습니다:
* API를 통해 `enabled`를 `true`로 설정
* 대시보드를 사용하여 옵션 버튼을 통해 구독

사용자가 이메일 구독을 취소한 경우 [구독 취소된 이메일에 전송](./email-messaging#send-to-unsubscribed-users)하여 구독 취소 상태를 유지하면서 중요한 이메일을 보낼 수 있습니다.

***

## SMS 구독

SMS 구독은 [E.164 형식의 전화번호](https://en.wikipedia.org/wiki/E.164)(예: `+14155551234`)에 연결됩니다.

다음을 통해 SMS 구독을 생성하세요:

1. SDK `addSms` 메서드 또는 [SMS 프롬프트](./permission-requests) — 외부 ID를 설정하고 구독을 사용자에게 연결하려면 먼저 `OneSignal.login`을 호출하세요.
2. [사용자 생성](/reference/create-user) 또는 [SMS 생성](/reference/sms) API
3. 대시보드 [CSV 가져오기](./import)

<Note>
  전화번호는 앱마다 고유합니다. 삭제 후 다시 추가하면 새 구독 ID가 생성됩니다.

  SMS 구독을 생성할 때 `external_id`를 포함하여 [사용자](./users)에게 연결하세요.
</Note>

### SMS 구독 관리

**사용자에게 연결**

SMS 구독을 생성할 때 `external_id`를 설정하여 [사용자](./users)에게 연결하세요.

* SDK를 사용하는 경우 `addSms`를 호출하기 전에 `login` 메서드를 호출하여 `external_id`를 설정하고 SMS 구독을 사용자에게 연결하세요.
* CSV 가져오기 또는 REST API를 사용하는 경우 전화번호와 함께 `external_id` 식별자를 설정하세요.

**구독 상태**

새로 생성된 SMS 구독은 달리 지정하지 않는 한 자동으로 **구독됨**으로 설정됩니다.

다음의 경우 SMS 구독은 구독 취소될 수 있습니다:

* 사용자가 "STOP" 또는 기타 [옵트아웃 키워드](./sms-consent-keyword-management)로 답장
* API를 통해 `enabled`를 `false`로 설정
* 대시보드의 옵션 버튼을 통해 구독 취소

다음의 경우 SMS 구독은 다시 구독될 수 있습니다:

* 사용자가 "START" 또는 기타 [옵트인 키워드](./sms-consent-keyword-management)로 답장
* API를 통해 `enabled`를 `true`로 설정
* 대시보드의 옵션 버튼을 통해 다시 구독

<Warning>
  사용자의 동의 없이 SMS 구독을 다시 구독하는 것은 통신사 준수 규정(TCPA, CTIA)을 위반하며 통신사 필터링 또는 계정 정지로 이어질 수 있습니다.
</Warning>

***

## 구독 가져오기 또는 마이그레이션

다음을 사용하여 다른 제공업체에서 푸시 토큰, 이메일 주소 및 전화번호를 가져오세요:

* [사용자 생성 API](/reference/create-user)
* [구독 생성 API](/reference/create-subscription)

<Card title="OneSignal로 마이그레이션" icon="arrow-right-to-bracket" href="./migrating-to-onesignal">
  다른 제공업체에서 푸시 토큰, 이메일 및 전화번호를 가져오세요.
</Card>

***

## 구독 삭제

다음을 위해 구독을 삭제할 수 있습니다:

* 데이터 개인정보 보호
* 비활성 레코드 정리

<Card title="사용자 삭제" icon="trash" href="./delete-users">
  개인정보 보호 또는 정리를 위해 구독 및 사용자 데이터를 삭제하세요.
</Card>

<Note>
  무료 플랜에서는 18개월 이상 활동이 없는 구독이 자동으로 삭제됩니다.
</Note>

***

## FAQ

### 푸시 구독 상태는 언제 업데이트되나요?

푸시 구독 상태는 두 가지 메커니즘을 통해 업데이트됩니다:

**1. 사용자가 앱 또는 사이트를 열 때**

OneSignal SDK는 푸시 토큰이 유효한지, 알림 권한이 여전히 허용되었는지 확인한 후 즉시 구독 상태를 업데이트합니다.

예를 들어 사용자가 기기 설정에서 푸시 알림을 비활성화한 후 앱을 다시 열면 SDK가 변경 사항을 감지하고 즉시 구독을 **구독 취소됨**으로 표시합니다.

SDK의 구독 관찰자([모바일](./mobile-sdk-reference#addobserver-push-subscription-changes) | [웹](./web-sdk-reference#addeventlistener-push-subscription-changes))를 사용하여 이러한 변경 사항을 캡처하고 자체 데이터베이스와 동기화할 수 있습니다.

**2. 푸시 알림을 보낼 때**

사용자가 앱을 제거하거나, 브라우저 데이터를 지우거나, 푸시를 비활성화하고 **다시 돌아오지 않으면** OneSignal은 알림을 보낼 때까지 변경 사항을 감지할 수 없습니다. 푸시 서비스(FCM, APNs, HMS)가 토큰을 유효하지 않다고 보고하면 OneSignal은 구독을 **구독 취소됨**으로 표시합니다.

이 감지는 일반적으로 2개 이상의 메시지가 필요합니다. 푸시 서비스는 유효하지 않은 토큰을 즉시 거부하지 않기 때문입니다:

| 전송       | 발생하는 일                                                                                 |
| -------- | -------------------------------------------------------------------------------------- |
| 메시지 1    | 기기에 전달됨. 이후 사용자가 기기 설정에서 구독을 취소하거나 앱을 제거합니다.                                           |
| 메시지 2    | 푸시 서비스가 메시지를 수락하지만 기기에서 받지 못합니다. 푸시 서비스가 아직 토큰을 거부하지 않았기 때문에 OneSignal은 "전달됨"으로 보고합니다. |
| 메시지 3    | 푸시 서비스가 토큰을 거부합니다. OneSignal이 구독을 **구독 취소됨**으로 표시합니다.                                  |
| 메시지 4 이상 | OneSignal이 이 구독에 대한 전달을 시도하지 않습니다.                                                     |

[이벤트 스트림](./event-streams)을 사용하여 메시지 전송 시 실시간으로 구독 취소를 감지하세요.

<Note>
  모든 사용자에게 장기간 전송하지 않으면 구독 취소가 자동으로 누적되어 전송을 재개할 때 대규모 급증으로 나타납니다. 구독 취소를 점진적으로 감지하려면 한 달에 한두 번 이상 모든 사용자에게 전송하세요. 구독 취소 급증에 대한 자세한 내용은 [FCM 만료 토큰 FAQ](./fcm-expired-token-faq)를 참조하세요.
</Note>

<Warning>
  Apple은 구독 취소 보고를 14일 이상 지연합니다. 사용자 개인정보를 보호하기 위해 Apple은 앱 제거 또는 권한 취소를 즉시 보고하지 않습니다. 사용자가 푸시를 비활성화한 후 앱을 열면 OneSignal은 SDK를 통해 즉시 변경 사항을 감지합니다. 사용자가 앱을 다시 열지 않으면 알림을 보낸 후 Apple이 유효하지 않은 토큰을 보고하는 데 몇 주가 걸릴 수 있습니다.

  자세한 내용은 [Apple Forum](https://developer.apple.com/forums/thread/670868) 및 [Technical Note](https://developer.apple.com/library/archive/technotes/tn2265/_index.html#//apple_ref/doc/uid/DTS40010376-CH1-TNTAG34)를 참조하세요. 대시보드 또는 API를 사용하여 [오래된 구독을 삭제](./delete-users)하여 잠재고객을 깔끔하게 유지하세요.
</Warning>

### 사용자가 기기 설정에서 알림을 끄고 앱을 다시 열지 않으면 어떻게 되나요?

구독은 해당 기기에 알림을 보낼 때까지 OneSignal에서 **구독됨**으로 표시된 상태로 유지됩니다. 2번 이상 전송 시도 후 푸시 서비스가 토큰을 유효하지 않다고 보고하면 OneSignal이 구독을 **구독 취소됨**으로 표시합니다. 전체 순서는 위의 [푸시 구독 상태는 언제 업데이트되나요?](#when-do-push-subscription-statuses-update)를 참조하세요.

***

## 관련 페이지

<Columns cols={2}>
  <Card title="사용자" icon="users" href="./users">
    OneSignal 사용자 모델, 별칭, 그리고 사용자와 구독의 관계.
  </Card>

  <Card title="테스트 구독" icon="flask" href="./test-users">
    기기를 찾아 테스트 구독으로 표시하여 더 쉽게 테스트하세요.
  </Card>

  <Card title="사용자 삭제" icon="trash" href="./delete-users">
    개인정보 보호 또는 정리를 위해 구독 및 사용자 데이터를 삭제하세요.
  </Card>

  <Card title="OneSignal로 마이그레이션" icon="arrow-right-to-bracket" href="./migrating-to-onesignal">
    다른 제공업체에서 푸시 토큰, 이메일 및 전화번호를 가져오세요.
  </Card>
</Columns>
