개발 일지

iOS 푸시 알림(APNs) 구성 및 실무 정리

backend.log 2025. 5. 28. 18:52
728x90
반응형

🍎 iOS 푸시 알림(APNs) 구성 및 실무 정리

iOS에서 푸시 알림 기능을 구현할 때 반드시 알아야 할 것이 Apple Push Notification service(APNs)입니다. APNs는 Apple이 제공하는 공식 푸시 알림 서비스로, 서버에서 iOS 디바이스로 푸시 메시지를 전달하는 역할을 합니다. 앱이 백그라운드에 있거나 꺼져 있어도 알림을 받을 수 있도록 해주는 중요한 메커니즘입니다.

1. APNs 작동 방식

iOS 앱이 설치되고 실행되면, APNs에 등록 요청을 보내고 디바이스 토큰(Device Token)을 발급받습니다. 이 토큰은 iOS 기기를 식별하는 유일한 키이며, 서버는 이 토큰을 저장한 뒤 푸시 전송에 활용합니다.

푸시 전송 과정은 아래와 같습니다:

  1. 클라이언트 앱이 디바이스 토큰을 APNs로부터 수신
  2. 앱 서버에 디바이스 토큰 전달 및 저장
  3. 앱 서버에서 푸시 전송 조건이 만족되면, APNs에 HTTP/2 API 요청
  4. APNs가 해당 디바이스로 푸시 메시지 전송

2. 인증 방식

서버가 APNs에 푸시 메시지를 보내려면 신뢰할 수 있는 인증 수단이 필요합니다. 크게 두 가지 방식이 있으며, 실무에서는 프로젝트나 서버 구성에 따라 선택됩니다.

① 인증서 방식 (PEM/P12)

  • Apple Developer Center에서 앱용 인증서를 발급
  • 다운로드한 .p12 파일을 openssl을 이용해 .pem 파일로 변환
  • 해당 인증서를 서버에서 사용해 푸시 메시지 서명 및 전송
  • 단점: 인증서 유효기간이 있어 갱신 필요, 개발용/배포용 인증서를 구분해야 함

② JWT 기반 Key 방식 (신규 방식)

  • Apple Developer Center에서 Auth Key (.p8), Key ID, Team ID를 발급
  • JWT 토큰을 생성해 Authorization Header에 포함하여 전송
  • 장점: 유효기간이 없어 지속적으로 사용 가능, 설정 간편

3. 개발용 vs 운영용 구분

iOS의 푸시 인증서는 Sandbox(개발용)Production(운영용)이 명확하게 구분되어야 합니다. 이 두 환경을 혼용하면 특정 디바이스에서 푸시가 오지 않거나, 예기치 않은 오류가 발생할 수 있습니다.

항목 개발용(Sandbox) 운영용(Production)
서버 주소 api.sandbox.push.apple.com api.push.apple.com
디바이스 토큰 개발 빌드에서 발급 배포 빌드에서 발급
인증서 개발용 인증서(.pem) 배포용 인증서(.pem)

실제 운영 서버에서 개발용 인증서를 사용할 경우, 디바이스에서 배포 빌드 앱을 실행하고 있다면 푸시 수신이 불가능합니다. 이로 인해 사용자 일부는 푸시를 정상 수신하지만, 다수 사용자에게 푸시가 전달되지 않는 문제가 발생할 수 있습니다.

4. 실무에서 경험한 문제와 해결

운영 서버에 연결된 푸시 인증서가 개발용(sandbox) 인증서로 구성되어 있었으며, 이로 인해 일부 사용자에게 푸시가 누락되는 현상이 있었습니다. 인증서를 확인해보니 경로에 _dev.pem으로 명시되어 있었고, 실제 운영용 인증서(_dist.pem)가 주석 처리되어 있었습니다.

이후 운영 인증서 갱신한 뒤, 서버 설정을 수정하고 푸시 연동 테스트를 통해 정상 수신됨을 확인하였습니다.

5. 인증서 관리 팁

  • 인증서 유효기간 확인 명령어:
    openssl x509 -in apns_cert.pem -text -noout
  • P12 → PEM 변환:
    openssl pkcs12 -in cert.p12 -out cert.pem -clcerts -nodes
  • 개발/운영 환경 구분 시, config에서 env() 함수로 환경에 따라 pem 경로를 분리 설정

6. 마무리

iOS 푸시 알림 시스템은 한 번 구성해 두면 오랜 기간 수정 없이 운용할 수 있지만, 인증서 만료, 운영/개발 환경 혼동, 잘못된 디바이스 토큰 등으로 인해 문제가 발생하기 쉽습니다.

푸시 관련 이슈가 생겼을 때는 다음을 체크하는 것이 좋습니다:

  • 현재 서버에서 참조 중인 인증서가 운영용인지 확인
  • 디바이스에서 받은 토큰이 개발용인지 운영용인지 확인
  • 실제 APNs 요청과 응답 로그 확인 (status code, error message)

앞으로는 인증서 기반 방식보다 JWT 기반 인증 키 방식으로의 전환을 고려해보는 것도 좋은 선택입니다.

 

관련 내용

https://moon-devnote.tistory.com/55

728x90
반응형