두 손끝의 창조자

APNs Overview 본문

프로그래밍

APNs Overview

codinglog 2021. 10. 7. 11:49

Apple 푸시 알림 서비스(APN)는 원격 알림 기능의 핵심입니다. 앱 개발자가 iOS(및 간접적으로 watchOS), tvOS 및 macOS 장치에 정보를 전파할 수 있는 강력하고 안전하며 매우 효율적인 서비스입니다.

사용자 기기에서 앱을 처음 시작할 때 시스템은 앱과 APN 간에 인증되고 암호화된 영구 IP 연결을 자동으로 설정합니다. 이 연결을 통해 앱은 원격 알림 지원 구성에 설명된 대로 알림을 받을 수 있도록 설정을 수행할 수 있습니다.

알림 전송을 위한 연결의 나머지 절반(제공자 서버와 APN 간의 지속적이고 안전한 채널)에는 온라인 개발자 계정의 구성과 Apple 제공 암호화 인증서의 사용이 필요합니다. 공급자는 APN과 함께 작동하도록 구성하고 배포 및 관리하는 서버입니다. 그림 6-1은 원격 알림의 전달 경로를 보여줍니다.

Figure 6-1 공급자에서 앱으로 원격 알림 전달

Figure 6-1 공급자에서 앱으로 원격 알림 전달

공급자와 앱에서 푸시 알림 설정이 완료되면 공급자는 APN에 알림 요청을 보낼 수 있습니다. APN은 각 대상 장치에 해당 알림 페이로드를 전달합니다. 알림을 받으면 시스템은 페이로드를 기기의 적절한 앱에 전달하고 사용자와의 상호 작용을 관리합니다.

기기의 전원이 켜져 있지만 앱이 실행되고 있지 않은 상태에서 앱에 대한 알림이 도착하는 경우 시스템은 여전히 알림을 표시할 수 있습니다. APN이 알림을 보낼 때 장치의 전원이 꺼지면 APN은 알림을 보류하고 나중에 다시 시도합니다(자세한 내용은 서비스 품질, 저장 후 전달 및 통합 알림 참조).

제공자의 책임

공급자 서버는 APN에 참여하기 위해 다음과 같은 책임이 있습니다.

  • APN을 통해 사용자 장치의 앱 인스턴스에서 전 세계적으로 고유한 앱별 장치 토큰 및 기타 관련 데이터 수신. 이를 통해 공급자는 앱에서 실행 중인 각 인스턴스에 대해 알 수 있습니다.
  • 알림 시스템의 설계에 따라 원격 알림을 언제 각 장치로 보내야 하는지 결정합니다.
  • 알림 페이로드 및 전달 정보를 포함하는 알림 요청을 빌드하고 APN에 전송합니다. 그러면 APN이 사용자를 대신하여 해당 알림을 의도한 장치에 전달합니다.

공급자가 보내는 각 원격 알림 요청에 대해 다음을 수행해야 합니다.

  1. 원격 알림 페이로드 생성에 설명된 대로 알림의 페이로드를 포함하는 JSON 사전을 구성합니다.
  2. 페이로드, 전역적으로 고유한 장치 토큰 및 기타 전달 정보를 HTTP/2 요청에 추가합니다. 장치 토큰에 대한 자세한 내용은 APN-장치 연결 신뢰 및 장치 토큰을 참조하십시오. HTTP/2 요청 형식과 APN의 가능한 응답 및 오류에 대한 정보는 APN과 통신을 참조하십시오.
  3. 영구적인 보안 채널을 통해 토큰 또는 인증서 형태의 암호화 자격 증명을 포함하여 HTTP/2 요청을 APN에 보냅니다. 이 보안 채널을 설정하는 방법은 보안 아키텍처에 설명되어 있습니다.

여러 공급자 사용

그림 6-2는 APN이 앱을 실행하는 장치에 대해 활성화하는 일종의 가상 네트워크를 보여줍니다. 알림 로드를 처리하기 위해 일반적으로 APN에 대한 자체 영구 보안 연결이 있는 여러 공급자를 배포합니다. 그러면 각 공급자는 공급자에게 유효한 장치 토큰이 있는 모든 장치를 대상으로 알림 요청을 보낼 수 있습니다.

Figure 6-2 여러 공급자의 원격 알림을 여러 장치로 푸시

Figure 6-2 여러 공급자의 원격 알림을 여러 장치로 푸시

서비스 품질, 저장 후 전달 및 통합 알림

Apple 푸시 알림 서비스에는 저장 후 전달 기능을 수행하는 QoS(서비스 품질) 구성 요소가 포함되어 있습니다. APN이 알림 전달을 시도하고 대상 장치가 오프라인인 경우 APN은 제한된 시간 동안 알림을 저장하고 장치를 다시 사용할 수 있게 되면 전달합니다. 이 구성 요소는 기기 및 앱별로 가장 최근 알림만 저장합니다. 장치가 오프라인인 경우 해당 장치를 대상으로 하는 알림 요청을 보내면 이전 요청이 삭제됩니다. 장치가 오랫동안 오프라인 상태를 유지하면 APN에 저장된 모든 알림이 삭제됩니다.

유사한 알림을 합칠 수 있도록 알림 요청에 축소 식별자를 포함할 수 있습니다. 일반적으로 장치가 온라인 상태일 때 APN에 보내는 각 알림 요청으로 인해 장치에 알림이 전달됩니다. 그러나 apns-collapse-id 키가 HTTP/2 요청 헤더에 있는 경우 APN은 해당 키 값이 동일한 요청을 병합합니다. 예를 들어, 동일한 헤드라인을 두 번 보내는 뉴스 서비스는 두 요청에 대해 동일한 축소 식별자 값을 사용할 수 있습니다. 그런 다음 APN은 두 요청을 장치에 전달하기 위한 단일 알림으로 통합합니다. apns-collapse-id 키에 대한 자세한 내용은 표 8-2를 참조하십시오.

Security Architecture

APN은 연결 신뢰와 장치 토큰 신뢰라는 두 가지 신뢰 수준을 사용하여 종단 간 암호화 유효성 검사 및 인증을 시행합니다.

연결 신뢰는 공급자와 APN 사이, 그리고 APN과 장치 간에 작동합니다.

공급자-APN 연결 신뢰는 공급자와 APN 간의 연결이 푸시 알림 전달에 대해 Apple과 계약을 맺은 회사가 소유한 승인된 공급자에 대해서만 가능하다는 확신을 설정합니다. 이 섹션에 설명된 대로 공급자 서버와 APN 간에 연결 신뢰가 존재하는지 확인하는 단계를 수행해야 합니다.

APNs-to-device 연결 신뢰는 승인된 장치만 APN에 연결하여 알림을 받을 수 있도록 합니다. APN은 각 장치와의 연결 신뢰를 자동으로 적용하여 장치의 합법성을 보장합니다.

공급자가 APN과 통신하려면 유효한 인증 키 인증서(토큰 기반 연결 신뢰의 경우) 또는 SSL 인증서(인증서 기반 연결 신뢰의 경우)를 사용해야 합니다. Xcode 도움말의 "푸시 알림 구성"에 설명된 대로 온라인 개발자 계정에서 이러한 인증서 중 하나를 얻습니다. 두 가지 인증서 유형 중에서 선택하려면 공급자-APN 연결 신뢰를 읽으십시오. 어떤 인증서 유형을 선택하든 공급자 연결 신뢰는 APN에 푸시 알림 요청을 보내는 공급자의 전제 조건입니다.

장치 토큰 신뢰는 각 원격 알림에 대해 종단 간 작동합니다. 알림이 올바른 시작(제공자)과 끝(장치) 지점 사이에서만 라우팅되도록 합니다.

장치 토큰은 Apple이 특정 장치의 특정 앱에 할당한 고유 식별자를 포함하는 불투명한 NSData 인스턴스입니다. APN만 장치 토큰의 내용을 해독하고 읽을 수 있습니다. 각 앱 인스턴스는 APN에 등록할 때 고유한 장치 토큰을 받은 다음 원격 알림 지원 구성에 설명된 대로 토큰을 공급자에게 전달해야 합니다. 공급자는 연결된 장치를 대상으로 하는 각 푸시 알림 요청에 장치 토큰을 포함해야 합니다. APN은 장치 토큰을 사용하여 알림이 의도한 고유한 앱-장치 조합에만 전달되도록 합니다.

APN은 다양한 이유로 새 장치 토큰을 발급할 수 있습니다.

  • 사용자가 새 기기에 앱을 설치합니다.
  • 사용자가 백업에서 기기를 복원합니다.
  • 사용자가 운영 체제를 다시 설치합니다.
  • 기타 시스템 정의 이벤트

결과적으로 앱은 APN-장치 연결 신뢰 및 장치 토큰에 설명된 대로 시작 시 장치 토큰을 요청해야 합니다. 코드 예제는 원격 알림 수신 등록을 참조하십시오.

중요
사용자 개인 정보를 보호하려면 장치 토큰을 사용하여 사용자 장치를 식별하지 마십시오.

공급자-APN 연결 신뢰

제공자 서버와 Apple 푸시 알림 서비스 간의 연결 신뢰를 협상하는 데 사용할 수 있는 두 가지 체계가 있습니다.

토큰 기반 공급자 연결 신뢰: HTTP/2 기반 API를 사용하는 공급자는 JSON 웹 토큰(JWT)을 사용하여 APN과의 연결을 위한 검증 자격 증명을 제공할 수 있습니다. 이 체계에서 귀하는 Apple이 보유할 공개 키와 귀하가 보유하고 보호하는 개인 키를 제공합니다. 그런 다음 공급자는 개인 키를 사용하여 JWT 공급자 인증 토큰을 생성하고 서명합니다. 각 푸시 알림 요청에는 공급자 인증 토큰이 포함되어야 합니다.

공급자와 APN 간의 단일 토큰 기반 연결을 사용하여 온라인 개발자 계정에 번들 ID가 나열된 모든 앱에 푸시 알림 요청을 보낼 수 있습니다.

모든 푸시 알림 요청은 APN에서 HTTP/2 응답을 가져와서 공급자에게 성공 또는 실패에 대한 세부 정보를 반환합니다.

인증서 기반 공급자 연결 신뢰: 공급자는 또는 고유한 공급자 인증서와 개인 암호화 키를 사용할 수 있습니다. 온라인 개발자 계정에서 푸시 서비스를 설정할 때 Apple에서 제공하는 공급자 인증서는 앱 중 하나의 번들 ID인 하나의 주제를 식별합니다.

공급자와 APN 간의 인증서 기반 연결을 사용하여 온라인 개발자 계정에서 인증서를 구성할 때 지정하는 정확히 하나의 앱에 푸시 알림 요청을 보낼 수 있습니다.

중요
APN으로 HTTP/2 기반 TLS 세션을 설정하려면 GeoTrust Global CA 루트 인증서가 각 공급자에 설치되어 있는지 확인해야 합니다. 공급자가 macOS를 실행하는 경우 이 루트 인증서는 기본적으로 키체인에 있습니다. 다른 시스템에서는 이 인증서를 명시적으로 설치해야 할 수 있습니다. GeoTrust 루트 인증서 웹사이트에서 이 인증서를 다운로드할 수 있습니다. 다음은 인증서에 대한 직접 링크입니다.

APN에 대한 레거시 바이너리 인터페이스를 대신 사용하는 경우 각 공급자에 Entrust SSL 인증서 웹 사이트에서 제공되는 Entrust 인증 기관(2048) 루트 인증서가 있는지 확인해야 합니다.

토큰 기반 공급자-APN 신뢰

토큰 기반 공급자 신뢰는 "Apple 푸시 알림 인증 키(샌드박스 및 프로덕션)" 유형의 인증서를 사용합니다. Xcode 도움말의 "범용 공급자 토큰 서명 키 생성"에 설명된 대로 온라인 개발자 계정을 사용하여 이 인증서를 구성하고 얻습니다. 이 인증서에는 다음과 같은 특징이 있습니다.

  • 하나의 인증서는 계정과 연결된 모든 앱에 대한 푸시 알림 요청을 보내는 데 유효합니다. 인증서는 앱의 Apple Watch 컴플리케이션 연결 및 앱의 VoIP(Voice-over-Internet Protocol) 상태 알림에도 유효합니다. APN은 해당 항목이 백그라운드에서 실행 중인 경우에도 이러한 알림을 전달합니다. 자세한 내용은 APN 공급자 인증서를 참조하고 iOS 앱용 에너지 효율성 가이드에서 VoIP(Voice Over IP) 모범 사례를 참조하세요.
  • JWT 토큰 기반 APN 연결을 통해 푸시 알림 요청을 보낼 때 공급자 인증 토큰을 포함해야 합니다.
  • APNs 인증 키 인증서는 만료되지 않지만 온라인 개발자 계정을 사용하여 영구적으로 취소할 수 있습니다. 한 번 취소된 인증서는 다시 사용할 수 없습니다.

그림 6-3은 HTTP/2 기반 APN 제공자 API를 사용하여 신뢰를 설정하고 JWT 제공자 인증 토큰을 사용하여 알림을 보내는 방법을 보여줍니다.

Figure 6-3 토큰 기반 공급자 연결 신뢰 설정 및 사용

Figure 6-3 토큰 기반 공급자 연결 신뢰 설정 및 사용

그림 6-3과 같이 토큰 기반 공급자 신뢰는 다음과 같이 작동합니다.

  1. 공급자는 그림에서 "TLS 시작"이라고 표시된 화살표로 표시된 TLS(전송 계층 보안)를 사용하여 APN과의 보안 연결을 요청합니다.
  2. 그런 다음 APN은 그림의 다음 화살표로 표시된 APN 인증서("APN 인증서"로 표시됨)를 공급자에게 제공하고 공급자가 이를 검증합니다. 이 시점에서 연결 신뢰가 설정되고 공급자 서버가 APN에 토큰 기반 원격 푸시 알림 요청을 보낼 수 있습니다.
  3. 공급자가 보내는 각 알림 요청에는 JWT 인증 토큰이 수반되어야 하며, 그림에서 "알림 푸시"로 표시된 화살표로 표시됩니다.
  4. APN은 그림에서 "HTTP/2 응답"이라고 표시된 화살표로 표시된 각 푸시에 응답합니다. 이 단계에서 공급자가 받을 수 있는 응답에 대한 자세한 내용은 APN의 HTTP/2 응답을 참조하세요.

인증서 기반 공급자-APN 신뢰

인증서 기반 공급자 연결은 "범용 APN 클라이언트 SSL 인증서 생성"에 설명된 대로 공급자 인증서(이전에 생성해야 함)에 지정된 주제(앱 번들 ID)로 식별되는 하나의 특정 앱에 전달하는 데 유효합니다. Xcode 도움말에서). 인증서를 구성하고 프로비저닝하는 방법에 따라 신뢰할 수 있는 연결은 앱에 대한 Apple Watch 컴플리케이션 및 VoIP(Voice-over-Internet Protocol) 상태를 포함하여 앱과 연결된 다른 항목에 원격 알림을 전달하는 데에도 유효할 수 있습니다. 당신의 앱에 대한 알림. APN은 해당 항목이 백그라운드에서 실행 중인 경우에도 이러한 알림을 전달합니다. 자세한 내용은 APN과 통신을 참조하고 iOS 앱용 에너지 효율 가이드에서 VoIP(Voice Over IP) 모범 사례를 참조하십시오.

인증서 기반 신뢰를 통해 APN은 인증서 해지 목록을 유지 관리합니다. 공급자의 인증서가 해지 목록에 있는 경우 APN은 공급자 신뢰를 취소할 수 있습니다(즉, APN은 TLS 시작 연결을 거부할 수 있음).

그림 6-4는 Apple에서 발급한 SSL 인증서를 사용하여 공급자와 APN 간의 신뢰를 설정하는 방법을 보여줍니다. 그림 6-3과 달리 이 그림은 알림 푸시 자체를 표시하지 않지만 TLS(전송 계층 보안) 연결 설정 시 중지됩니다. 인증서 기반 신뢰 체계에서 푸시 알림 요청은 인증되지 않지만 함께 제공되는 장치 토큰을 사용하여 유효성이 검사됩니다.

그림 6-4인증서 기반 공급자 연결 신뢰 구축

그림 6-4인증서 기반 공급자 연결 신뢰 구축

그림 6-4와 같이 인증서 기반 공급자-APN 신뢰는 다음과 같이 작동합니다.

  1. 공급자는 그림에서 "TLS 시작"이라고 표시된 화살표로 표시된 TLS(전송 계층 보안)를 사용하여 APN과의 보안 연결을 요청합니다.
  2. APN은 그림의 다음 화살표로 표시된 APN 인증서("APN 인증서"로 표시됨)를 공급자에게 제공하고 공급자가 이를 검증합니다.
  3. 공급자는 Apple에서 제공한 공급자 인증서(Xcode 도움말의 "범용 APN 클라이언트 SSL 인증서 생성"에 설명된 대로 온라인 개발자 계정에서 이전에 획득)를 "제공자"로 표시된 화살표로 표시된 APN으로 다시 보내야 합니다. 자격증."
  4. APN은 공급자 인증서의 유효성을 검사하여 연결 요청이 합법적인 공급자로부터 시작되었는지 확인하고 TLS 연결을 설정합니다. 이 시점에서 연결 신뢰가 설정되고 공급자 서버가 APN에 인증서 기반 원격 푸시 알림 요청을 보낼 수 있습니다.

APN-장치 연결 신뢰 및 장치 토큰

APN과 각 장치 간의 신뢰는 이 섹션에 설명된 대로 앱의 참여 없이 자동으로 설정됩니다.

각 장치에는 초기 장치 활성화 시 운영 체제에서 제공하고 장치의 키체인에 저장되는 암호화 인증서와 개인 암호화 키가 있습니다. 활성화하는 동안 APN은 그림 6-5와 같이 인증서와 키를 기반으로 장치 연결을 인증하고 확인합니다.

그림 6-5기기와 APN 간의 연결 신뢰 구축

그림 6-5기기와 APN 간의 연결 신뢰 구축

그림 6-5와 같이 APNs-to-device trust는 다음과 같이 작동합니다.

  1. 그림의 위쪽 화살표와 같이 장치가 APN과의 TLS 연결을 시작할 때 신뢰 협상이 시작됩니다.
  2. APN은 APN 인증서를 장치에 반환합니다.
  3. 운영 체제는 이 인증서의 유효성을 검사한 다음 "장치 인증서" 화살표에 표시된 대로 장치 인증서를 APN으로 보냅니다.
  4. 마지막으로 그림의 아래쪽 화살표로 표시된 것처럼 APN은 장치 인증서의 유효성을 검사하여 신뢰를 설정합니다.

APN과 장치 간에 TLS 연결이 설정되면 장치의 앱이 APN에 등록하여 원격 알림을 위한 앱별 장치 토큰을 받을 수 있습니다. 자세한 내용 및 코드 예제는 원격 알림 지원 구성에서 원격 알림 수신 등록을 참조하십시오.

기기 토큰을 받은 후 앱은 앱과 연결된 공급자에 연결하고 토큰을 전달해야 합니다. 이 단계는 공급자가 나중에 장치를 대상으로 하는 APN에 알림 요청을 보낼 때 장치 토큰을 포함해야 하기 때문에 필요합니다. 토큰 전달을 위해 작성한 코드는 원격 알림 수신 등록에도 나와 있습니다.

사용자가 처음으로 장치를 활성화하든 APN이 새 장치 토큰을 발행했든 프로세스는 유사하며 그림 6-6에 나와 있습니다.

그림 6-6장치 토큰 관리

그림 6-6장치 토큰 관리

앱별 장치 토큰을 가져오고 처리하는 것은 다음과 같이 작동합니다.

  1. 앱은 위쪽 화살표와 같이 원격 알림을 위해 APN에 등록됩니다. 앱이 이미 등록되어 있고 앱별 디바이스 토큰이 변경되지 않은 경우 시스템은 기존 토큰을 앱에 빠르게 반환하고 이 프로세스는 4단계로 건너뜁니다.
  2. 새 장치 토큰이 필요할 때 APN은 장치의 인증서에 포함된 정보를 사용하여 토큰을 생성합니다. 토큰 키를 사용하여 토큰을 암호화하고 가운데 오른쪽 화살표와 같이 장치로 반환합니다.
  3. 시스템은 application:didRegisterForRemoteNotificationsWithDeviceToken: 대리자 메서드를 호출하여 기기 토큰을 앱으로 다시 전달합니다.
  4. 토큰을 받으면 앱(대리자 메서드 내)에서 이진 또는 16진수 형식으로 공급자에게 전달해야 합니다. 공급자는 이 토큰이 없으면 장치에 알림을 보낼 수 없습니다. 자세한 내용은 원격 알림 지원 구성에서 원격 알림 수신 등록을 참조하십시오.

중요
APN 장치 토큰의 길이는 가변적입니다. 크기를 하드 코딩하지 마십시오.

공급자가 APN에 푸시 알림 요청을 보낼 때 고유한 앱-장치 조합을 식별하는 장치 토큰이 포함됩니다. 이 단계는 그림 6-7에서 공급자와 APN 사이의 "토큰, 페이로드" 화살표에 표시됩니다. APN은 토큰을 해독하여 요청의 유효성을 확인하고 대상 장치를 결정합니다. APN은 발신자와 수신자가 합법적이라고 판단하면 식별된 장치에 알림을 보냅니다.

그림 6-7 공급자에서 장치로의 원격 알림 경로

그림 6-7 공급자에서 장치로의 원격 알림 경로

장치가 알림을 수신한 후(그리고 그림 6-7에 표시된 마지막 단계 이후) 시스템은 원격 알림을 앱으로 전달합니다.

프로비저닝 절차

APN은 iOS App Store, tvOS App Store 및 Mac App Store를 통해 배포되는 앱과 엔터프라이즈 앱에서 사용할 수 있습니다. APN을 사용하려면 앱을 프로비저닝하고 코드 서명해야 합니다. 팀의 일부로 개발하는 경우 이러한 구성 단계의 대부분은 팀 에이전트 또는 관리자만 수행할 수 있습니다.

Xcode 및 온라인 개발자 계정에서 푸시 알림 지원을 구성하는 방법에 대한 정보는 Xcode 도움말에서 "푸시 알림 구성"을 참조하십시오.

참조

반응형
Comments