본문 바로가기

iOS

APNS(Apple Push Notifications Service) 기술 정리

APNS는 앱 개발자가 iOS, watchOS, macOS, tvOS등으로 정보를 전달할 수 있게하는 서비스이다.


동작

- 사용자가 어플리케이션을 처음으로 실행하면 시스템이 어플리케이션과 APNS간에 통신이 가능한 공인된 암호화된 영구 IP 연결을 자동으로 함.
이 연결을 통해서 알림을 수신

- 순서

Provider(Server) -> APNs -> Device -> Application(Notification)

- 시나리오

1. Device에서 APNs에 연결

2. APNs에서 Device 인증

3. Device에서 APNs연결

4. APNs에서 Device에 Token 발급

5. Device에서 Provider(Server)에 Token전달

데이터를 보낼떄

6. Provider(Server)에서 APNs에 Device Token과 데이터를 보냄

7. Token 확인 후 타겟 Device에 데이터 전송


APNs에 통보 요청을 보낼때 페이로드 및 배달 정보가 포함되며, APNs는 사용자를 대신해서 해당 장치에 알림을 전달함.



Provider(Server)가 Remote Notification 요청을 할때 처리해야하는 것

- 알림 데이터는 JSON으로 표현되어야 한다.

- 데이터, Token, 기타 배달정보를 HTTP/2 요청에 추가해야한다.

- 영구적이고 안전한 채널로 토큰이나 암호화 자격증명을 포함해서 APNs에 HTTP/2 요청을 보내야한다.


Quality of Service, Store-and-Forward, and Coalesced Notifications
- APNs는 저장 후 절달 기능을 하는 QoS(Quality of Service) 구성요소가 포함되어 있음.
- 알림을 보낼 대상 기기가 오프라인 일경우 일정기간동안 알림을 저장하고 기기가 다시 사용가능한 상태일 때 알림을 전송
- 저장된 알림중에 최신 알림만 저장, 오프라인일 때 해당 장치에 알림요청을 보내면 이전 알림요청 삭제됨
- 오랫동안 오프라인일 시에는 APNs에 저장된 모든 알림은 삭제됨

같은(비슷한) 알림 합치기

  비슷한 내용의 알림이 있을 때 두개의 알림을 띄우는 것보다 하나의 알림을 띄우는것이 좋을 때, apns-collapse-id Key를 requestHeader에 추가를 하고 요청을 하면, 같은 Key를 가진 알림은 합쳐져서 알림이 전송된다.


보안

- Provider(Server)와 APNs 사이의 연결 신뢰 : Provider(Servier)와 APNs 간의 연결이 푸쉬알림을 전달하기 위해 Apple과 계약을 맺은 회사가 소유한 인증된 Provider(Servier) 대해서 만 가능 
    (여기서 계약은 개발자 계정 결제를 뜻하는 것 같으며, 인증된 Provider는 SSL Certificate나 authentication key certificate를 뜻함)

- APNs간 연결 신뢰 : 승인된 장치만 APNs에 연결하여 알림을 수신할 수 있도록 한다. APNs는 각 장치와의 연결 신뢰를 자동으로 시행하여 장치의 정당성을 보정한다.


Device Token

- Device Token은 Apple에서 정한 고유한 식별자를 포함 시킨 NSData 형태이며, 해독은 APNs만 할 수 있다. 각 앱 인스턴스는 APNs를 등록할 때 마다 고유한 기기 토큰을 받는다. 각 앱은 그 고유한 토큰을 수신하므로 토큰을 Provider(Server)에 전달해야한다.
그러면 Provider(Server)는 각 알림에 대상 기기의 토큰을 포함시킨다

- 새로운 기기 토큰을 발급하는 경우

- 유저가 새로운 기기에 앱을 설치하는 경우

- 사용자가 백업 장치를 복원하는 경우

- 사용자가 운영체제를 다시 설치하는 경우

- 기타 시스템 정의 이벤트가 발생했을 경우

(사용자 개인정보를 보호하려면 장치토큰을 사용해서 사용자 장치를 식별하면 안됨)


Provider-to-APNs 연결 신뢰

- Token 기반 Provider 연결 신뢰

- Provider(Server)는 HTTP/2 기반 API를 사용하기 때문에 APNs와 연결을 위해서 JWT(JSON Web Tokens)를 사용이 가능하다.
이 구성의 경우는 Apple이 보유할 공개 키 보유 및 개인 키 를 제공과 보호해야한다.

- Certificate 기반 Provider 연결 신뢰

- Provider는 개인 암호화된 키와 인증서로 고용할 수 있다.

- 개발자 계정이 등록이 되어있어야 하며 앱의 Bundle ID도 등록이 되어있어야한다.