ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Apple Dev Reference] Apple Push Notification Service
    앱등이에게 살충제를 뿌린다./Apple Dev Reference 2016. 4. 3. 23:05

    Apple Developer 문서를 번역만 하였습니다.


    Apple Push Notification Service

    Apple Push Notification service(APNs)는 리모트 푸쉬시스템에서 가장 중요한 역할을 합니다. iOS, tvOS, OS X 디바이스에게 메시지를 발송하는 방법중 가장 효과적인 방법이기도 합니다. 각각의 디바이스는 APNs와 인증되고 암호화되어있는 IP연결을 하게되고 이 커넥션을 통해서 메시지 알림을 받게 됩니다. 앱이 실행중이지 않을 때 이 메시지가 도착하게 된다면 디바이스는 사용자에게 앱에 데이터가 도착했다는 것을 알려주게 됩니다.


    여러분은 사용자들에게 발송할 메시지를 생성하는 서버를 구축해야 합니다. 이 서버는 Provider라고도 알려져있는데, 사용자들에 대한 정보를 모으고 언제 알림을 보낼 것인지를 판단합니다. 각각의 알림에 대해, Provider는 Notification Payload를 생성하고 생성한 Payload를 HTTP/2 요청에 실은 뒤 HTTP/2 Multiplex 프로토콜을 이용하여 APNs에 요청을 보냅니다. 이 요청을 받은 APNs는 여러분이 생성한 Payload를 처리하여 사용자의 디바이스에 메시지를 전송하게 됩니다.


    APNs에 보내는 요청의 Format과 요청에 대한 응답/에러에 대해 궁금하시다면 APNs Provider API를 살펴보세요. Notification Service를 구현하는 방법에 대해서는 Registering, Scheduling, and Handling User Notifications를 살펴보세요.




    The Path of a Remote Notification

    APNs는 Remote Notification을 Provider로부터 디바이스까지 전송하고 라우팅하는 역할을 합니다. 아래그림은 하나의 Notification이 전송되는 경로를 보여줍니다. Provider에서 Notification의 발송이 필요하다고 판단되면 APNs 서버로 Notification과 디바이스 토큰을 보냅니다. APNs서버는 이를 토대로 알맞은 디바이스에 Notification을 라우팅해줍니다. 그리고 디바이스의 OS는 앱에 해당 Notification을 전달하게 됩니다.

    <Pushing a remote notification from am provider to a client app>


    Provider에서 APNs서버로 넘기는 디바이스 토큰은 핸드폰 번호와 유사합니다. 이 디바이스 토큰을 통해 APNs는 해당 앱이 설치되어 있는 디바이스를 식별할 수 있습니다. 디바이스 토큰은 앱에서 생성하여 여러분에게 제공이 되는데요, 사용자가 앱에서 원격 알림 서비스 사용에 동의하면 이를 알 수 있게 됩니다.


    Notification Payload는 JSON 딕셔너리 형태이고 디바이스에 보내고자 하는 메시지에 대한 정보를 담습니다. 이 Payload에는 여러분이 사용자들에게 어떤 방식으로 알림을 줄 것인지에 대한 정보를 담을 수 있습니다. 예를 들면 Alert나 sound, badge등이 있겠죠. 물론 여러분이 커스텀하게 생성한 데이터가 될 수도 있겠습니다.


    아래 그림은 APNs가 Provider와 디바이스를 연결해주는 가상 네트워크를 좀더 자세하게 보여주고 있습니다. APNs에서 디바이스, Provider와 마주하고 있는 부분에는 여러 커넥션 포인트가 존재하고 있습니다. Provider와 마주하고 있는 지점을 Gateway라고 부릅니다. 많은 수의 Provider들이 이 Gateway를 통해 여러개의 커넥션을 APNs와 맺고 있습니다. 그 결과 이 Provider들이 APNs를 통해 앱이 설치되어있는 디바이스들에 Notification을 보낼 수 있게 되는 것입니다.

    <Pushing remote notifications from multiple providers to multiple devices>


    Notification Payload에 대한 자세한 정보는 The Remote Notification Payload를 살펴보세요.



    Quality of Service

    APNs는 store-and-forward기능을 하는 디폴트 Quality of Service(QoS)컴포넌트를 갖습니다. APNs가 offline인 디바이스에 알림을 전송하면 해당 알림은 일정 기간동안 저장됩니다. 그리곤 디바이스가 사용가능해질 때 비로소 전송이 됩니다. 가장 최근에 발송된 알림 한개만 저장이 됩니다. 따라서 디바이스가 offline인 동안 여러개의 알림이 전송되면 새로운 알림이 이전에 존재하던 알림을 지워버리게 됩니다. 이렇게 가장 최근의 알림 1개만 저장하는 방식을 coalescing  notifications라고 합니다.


    만약 디바이스의 offline상태가 오래되면 저장되어 있던 모든 알림이 삭제됩니다.



    Security Architecture

    안전한 통신을 위해 APNs는 Provider와 디바이스 사이에 두가지 레벨의 신뢰를 요구합니다. (connection trust and token trust)


    Connection trust는 APNs가 애플이 Notification을 전송할 수 있도록 인가된 Provider에 연결되었는지를 확인합니다. APNs는 connection trust를 통해 디바이스에 대한 적합도도 검사를 합니다. 디바이스에 대한 Connection trust는 APNs에 의해 자동으로 이루어집니다. 하지만 그 전에 Provider와 APNs사이에 connection trust가 존재한다는 것을 보장하는 몇가지 절차를 반드시 수행해야 합니다.


    Token trust는 Notification이 정해진 Start Point와 End Point사이에서만 라우팅이 되었는지를 확인합니다. Token trust는 디바이스 토큰을 사용하는데요, 이 디바이스 토큰은 특정 디바이스의 특정 앱에 할당된 opaque한 식별자입니다. 각 앱 instance에서는 APNs에 등록이 될 때 디바이스 토큰을 얻게 되고 이 토큰을 반드시 Provider와 공유하게 됩니다. 이 후에 이 토큰은 Provider에서 생성하는 Notification과 항상 같이 다니게 됩니다. Token을 제공함으로써 Notificatoin은 Notification의 목적지 디바이스에만 전달이 될 수 있게됩니다.


    Note : 디바이스 토큰은 디바이스를 식별하는 Unique ID가 아닙니다. 디바이스 토큰은 디바이스에서 OS를 업데이트해도 변하게 됩니다. 이렇게 되면 앱은 다시 디바이스 토큰을 알려주어야 합니다.


    APNs 서버 또한 여러 인증서들과 CA 인증서, 암호화키(공개키,개인키)를 통해 커넥션의 유효성을 검사하고 Provider와 디바이스를 식별합니다.




    Provider-to-APNs Connection Trust

    Provider에서는 unique한 Provider인증서와 APNs와의 커넥션에 대한 유효성 검사를 위해 필요한 개인암호화키가 필요합니다. Provider인증서(Apple이 프로비져닝해줌) Provider가 지원하는 topic을 나타낼 수 있습니다.(topic은 앱의 번들ID라고 하네요.) 


    Provider는 TLS(SSL이랑 같음) 방식을 통해 APNs서버와 커넥션을 맺습니다. TLS 커넥션이 시작되면 APNs 서버의 서버인증서를 얻게 되고 Provider엔드에서 인증서를 검사합니다. 그리고 Provider에서 Provider 인증서를 APNs로 보내면 APNs에서 이 인증서를 검사합니다. 이 과정이 성공적으로 끝나면, TLS커넥션이 이루어지게 됩니다: APNs는 올바른(legitimate) Provider와 커넥션이 맺어졌다고 할 수 있습니다.

    <Establishing connection trust between a provider and APNs>


    HTTP/2 Provider 커넥션이 이제 한 개의 앱(인증서에 명시된 bundle ID)에 대한 메시지 전달을 할 수 있게 되었습니다. 여러분이 APNs SSL 인증서에 설정한 값에 따라 이 커넥션은 Apple Watch Complication이나 백그라운드 VoIP에도 Notification을 전달할 수 있습니다. APNs Provider API에서 자세히 알아볼 수 있습니다. APNs는 인증서 파기에 관한 리스트를 갖고 있습니다. 만약 Provider의 인증서가 이 리스트에 존재한다면 APNs는 Provider trust를 파기할 수 있습니다.(connection을 거절하게 되겠죠.)



    APNs-to-Device Connection Trust

    디바이스에는 디바이스 인증서와 APNs와 디바이스의 커넥션 인증에 필요한 개인암호화키가 있습니다. 디바이스는 이 인증서와 키 값을 디바이스가 활성화될 때 얻게되고 키체인에 보관하고 있습니다. 


    디바이스와 APNs의 커넥션을 구축하는데에 여러분이 할 일은 없습니다. APNs가 커넥팅하고자 하는 디바이스와의 TLS 인증을 통해 커넥션을 구축합니다. 이 과정에서 디바이스는 TLS커넥션을 시작하여 서버의 인증서를 검사하게 됩니다. 그 후 디바이스의 인증서를 APNs에 전송하면 APNs가 디바이스의 인증서를 검사합니다.

    <Establishing connection trust between a device and APNs>




    Token Generation and Dispersal

    앱은 리모트 Notification을 받기 위해서 시스템에 등록해야 합니다. (이 내용은 Registering for Remote Notifications에서 자세히 알아보실 수 있습니다.) 시스템에서는 앱의 등록 요청을 받은 뒤에 APNs에 이 요청을 알려줍니다. 그러면 APNs에서는 디바이스의 인증서에 있는 정보를 이용하여 이 앱에 해당하는 디바이스 토큰을 생성합니다. 생성한 뒤에 이 토큰 값을 token key를 이용하여 암호화 한 뒤 디바이스에 전달합니다. 이 토큰 값을 전달받은 디바이스의 시스템은 앱에 NSData형태로 토큰 값을 전달합니다. 이 토큰 값을 받은 뒤 앱은 반드시 Provider에 바이너리 또는 16진수형태로 포워딩해주어야 합니다. Provider에서 이 값이 없으면 디바이스에 토큰을 보낼수가 없으니까요.

    <Managing the device token>


    Important : APNs 디바이스 토큰의 크기는 가변적입니다. 특정 사이즈로 하드코딩을 하지마세요. 



    아래 그림은 디바이스 토큰이 공유되는 과정을 보여주고 있습니다. APNs에서 토큰이 생성되어 Provider까지 전달되는 루트도 보여주고 있네요.


    <Sharing the device token>






    Token Trust(Notification)
    Provider가 APNs에 보내는 모든 Notification은 목적지 디바이스의 디바이스 토큰 값을 항상 갖고 있어야 합니다. APNs는 token key를 이용해 토큰 값을 복호화하여 해당 Notification의 source(즉 Provider)를 검사합니다. APNs는 디바이스 토큰에 있는 Device ID를 통해 타겟 디바이스를 결정하게 됩니다. 그리고 Notification을 해당 디바이스에 전달하게 됩니다. 아래 그림은 이 과정을 나타내고 있습니다.

    <Identifying a device using the device token>




    출처 : https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html

Designed by Tistory.