# 푸시 알림

마치면 서버가 보낸 알림을 iOS·Android 기기에 띄울 키가 준비돼요. Apple 푸시 키와 Firebase 키 둘 다 콘솔에서 만들어요. 키는 allob 금고에 넣어 두고, 서버나 푸시 서비스에 넣을 때 에이전트가 꺼내 써요. allob 이 푸시를 보내지는 않아요.

## 시작하기 전에

먼저 원격 푸시가 정말 필요한지 가려요.
- **앱이 스스로 아는 일**(매일 리마인더, 백그라운드 작업 결과) — 기기 안 알림이면 돼요. 키·서버가 필요 없으니 [제품 정하기](/docs/journey-product)의 기능에서 푸시를 빼요.
- **다른 사람·서버가 만든 일**(댓글, 처리 결과) — 원격 푸시예요. 아래 할 일을 해요.

필요한 것: Apple 개발자 계정(iOS), Android 앱을 둘 Google Cloud 프로젝트(Android).

키를 만든 뒤에 할 일이에요.
1. **빌드** — 번들 id 에 Push 기능을 켜고, 보내는 곳(푸시 서비스나 내 서버)에 키를 넣고 앱을 다시 빌드해요.
2. **서버** — 알림 기록을 먼저 저장하고 푸시는 그다음에 보내요. 등록이 풀린 기기 토큰은 지우고, 일시적인 실패만 다시 보내요.
3. **법 문서·설문** — 처리방침에 푸시 토큰·알림 기록과 전달 업체(Apple, Google, 쓰는 푸시 서비스)·국외 이전을 적고 스토어 설문도 고쳐요.
4. **광고성 푸시** — 한국에선 알림 권한과 별개로 수신 동의를 받고, 야간(21~8시)은 따로 동의, "(광고)" 표시와 수신 거부 방법을 넣어요([정보통신망법 제50조](https://www.law.go.kr/법령/정보통신망이용촉진및정보보호등에관한법률/제50조)). 서비스 알림에 광고를 섞으면 광고성으로 봐요.

키 만들기 절차는 Apple·Firebase 공식 문서와 다시 맞춰 보지 않았어요 — **확인 필요**.


:::prompt
이 allob 사업 가이드를 읽고, 내 사업에 해당하는 할 일만 골라 진행해 줘: https://allob.app/docs/journey-push.md
1. allob business view 와 allob path view --business 로 내 사업 모양(사업자 형태·돈 버는 방식·파는 나라)을 먼저 확인해.
2. 해당하지 않는 할 일은 왜 아닌지 한 줄로 알려 주고 allob step skip <id> --reason "…" 으로 넘겨.
3. 해당하는 할 일은 allob step view <id> 의 안내대로 하고, 끝나면 allob step done <id> --note "끝났다는 증거" 를 불러.
4. 본인 인증·서명·결제·약관 동의처럼 사람만 하는 곳에서는 멈추고 무엇을 누르면 되는지 알려 줘.
5. 되돌리기 어려운 답(과세 유형·계정 유형 등)은 내 폰으로 확인 요청이 와 — 명령이 보여 준 승인 링크를 알려 주고, 기다리는 동안 다른 할 일로 넘어가.
:::

## Apple 푸시 키(APNs) 만들기 {#push.apns-key}

Apple 개발자 계정에서 푸시 키(.p8)를 만들어 금고에 넣어요. 팀에 이미 있으면 그 키를 다시 써요.

1. 팀에 푸시 키가 있는지 봐요. 키 하나로 팀의 모든 앱에 보낼 수 있어서 앱마다 만들지 않아요.
2. 없으면 Apple 개발자 사이트의 Keys 에서 "Apple Push Notifications service" 를 켠 키를 만들어요.
3. 앱마다 번들 id 에 Push Notifications 기능을 켜요.

:::warning
⚠ .p8 파일은 한 번만 내려받을 수 있어요. 받자마자 금고에 넣고, 키·서류에서 다시 열리는지 확인한 뒤에 내려받은 파일을 지워요.
:::

:::tip 끝났는지 확인
APNs 키(키 id·팀 id·.p8)가 금고에 있으면 끝이에요. 증거는 넣은 날짜 메모예요(값은 적지 않아요).
:::

- Apple 개발자 사이트 로그인.
- 금고에서 꺼내 확인할 때 확인 요청이 오면, 이 키가 맞는지 보고 승인해요.
- 내려받은 .p8 원본 지우기 — 에이전트가 금고에서 다시 열어 확인했다고 알린 뒤에 지워요. 되돌릴 수 없어요.
## Firebase 푸시 키(FCM) 만들기 {#push.fcm-key}

Firebase 에 Android 앱을 등록하고, 푸시 전용 서비스 계정 키를 만들어 금고에 넣어요.

1. 이 앱의 Google Cloud 프로젝트(로그인용으로 만든 곳이 있으면 그곳)에 Firebase 를 붙여요. 새 프로젝트는 만들지 않아요.
2. Android 앱(패키지 이름)을 등록하고 설정 파일을 앱 폴더에 둬요. 공개값이라 커밋해도 돼요.
3. 푸시 보내기만 하는 서비스 계정을 따로 만들어요.
4. 그 키를 금고에 넣어요. 옛 서버 키(legacy)는 쓰지 않아요.

:::tip 끝났는지 확인
FCM 전용 서비스 계정 키가 금고에 있고 앱 폴더에 `google-services.json` 이 있으면 끝이에요. 증거는 메모예요(값은 적지 않아요).
:::

- Google Cloud·Firebase 콘솔 로그인.
- Google Cloud·Firebase 를 처음 쓰면 약관 동의 — 계정(사업자 Google 계정)이 맞는지 보고 동의해요.
앱 등록·서비스 계정·키는 에이전트가 만들어 금고에 넣어요.

## 자주 걸리는 함정

| 증상 | 원인·해결 |
|---|---|
| 키를 연결했는데 알림이 안 와요 | 새 빌드를 안 했어요 → 키·Push 기능·`google-services.json` 은 새 빌드부터 들어가요 |
| 지난 알림이 며칠 뒤에 떠요 | 유효 시간(ttl)을 안 줬어요 → 며칠로 정해 보내요 |
| 실패가 계속 쌓여요 | 등록이 풀린 기기 토큰을 안 지웠어요 → 실패 답에서 토큰을 지워요 |
| 리마인더뿐인데 키를 준비했어요 | 기기 안 알림이면 원격 푸시가 필요 없어요 |

## 출처

공식 안내와 마지막으로 맞춰 본 날: 2026-10-18

- [정보통신망법 제50조(광고성 정보 전송)](https://www.law.go.kr/법령/정보통신망이용촉진및정보보호등에관한법률/제50조)
- [개인정보 보호법 제28조의8(국외 이전)](https://www.law.go.kr/법령/개인정보보호법/제28조의8)
- [Apple App Review 가이드라인](https://developer.apple.com/app-store/review/guidelines/)
- [Google Play 데이터 보안 섹션](https://support.google.com/googleplay/android-developer/answer/10787469)
