[iOS] provider server와 APNs의 안전한 연결을 위한 두가지 방법

Token-Based Connection vs Certificate-Based Connection to APNs

provider server(push 알림 보내는 서버)와 Apple Push Notification service(APNs) 통신은 secure connection 위에서 이뤄져야하는데, 안전한 연결 설정 방법에는 두가지가 있다.

1. APNs에 대한 토큰 기반 연결 설정

  • stateless 인증 토큰을 사용하여 APNs와의 통신을 보호한다.
  • stateless 통신은 인증서 기반 통신보다 빠르다. provider server와 관련된 인증서 또는 기타 정보를 조회 등을 위해 APNs가 필요하지 않기 때문이다.
  • 여러 provider server에서 동일한 토큰을 사용 할 수 있다. 즉, 하나의 토큰을 사용하여 회사의 모든 앱에 대한 알림 배포 가능하다.
  • 토큰 기반 요청은 각 요청에 토큰이 포함되어 있으므로 인증서 기반 요청보다 약간 더 크다.
  • Apple에서 제공하는 provider token signing key를 사용하여 최소 한 시간에 한 번 토큰을 업데이트하고 암호화해야 한다.
  • apns 서비스를 위한 키가 2개인 상태에서 더 만들려고 하면 You have already reached the maximum allowed number of Keys for this service 뜨는걸 봐서 최대 2개 생성 가능한듯.
  • 매년 인증서 갱신이 필요 없다
  • 아래 그림은 APNs provider API(HTTP / 2-based)를 사용하여 신뢰를 설정하고, JWT provider authentication token을 사용하여 알림을 보낼 때 발생하는 일련의 단계를 보여준다.
  1. Provider server에서 TLS (전송 계층 보안)를 사용하여 보안 연결요청
  2. APNs는 공급자 서버가 유효성을 검사 할 수 있도록 인증서를 전송하여 응답. 이 시점에서 연결에 대한 신뢰가 설정되고 푸시 알림 요청을 APNs에 보낼 수 있음.
  3. 이때 각 알림 요청에는 JWT 인증 토큰이 함께 제공되어 함.
  4. APN은 각 푸시에 응답

서버에게 전달할 것

Key 생성할 때 다운받을 수 있는 .p8 파일(토큰) 과, 키 ID, push 서비스를 원하는 제품의 팀 ID, 번들 ID를 전달하면 된다.

발급 방법 참고 링크

2. APNs에 대한 인증서 기반 연결 설정

  • provider server에 인증서를 설치하여 Apple Push Notification service (APNs)와의 통신을 보호한다.
  • 즉, provider certificate를 사용하여 provider server와 APNs간에 보안 연결을 설정한다.
  • Apple developer 사이트에서 이 인증서를 얻을 수 있다.
  • 서버 수준(server-level)에서 신뢰가 설정되므로, 개별 알림 요청(individual notification request)에는 페이로드(보낼 메시지)와 디바이스 토큰만 포함된다. 인증 토큰이 포함되어 있지 않으므로 각 요청의 크기가 약간 줄어든다.
  • provider certificate를 사용하여 단일 앱, Apple Watch complication, 또는 단일 앱과 연관된 백그라운드 VoIP 서비스에 알림을 보낼 수 있다.
  • 여러 앱에 원격 알림을 보내려면 각 앱에 대해 별도의 인증서를 만들어야 하고, 각 앱의 알림에 대해 별도의 APNs 연결을 관리해야한다.
  • 따라서 토큰 기반 인증을 사용하여 여러 앱을 지원하는 것이 더 간단한 경우가 많다.
  • 인증서 또는 개인 키손상되었다고 생각되면 개발자 계정에서 인증서를 해지(revoke) 할 수 있다. APNs는 해지된 인증서 목록을 유지하고 해당 목록에있는 인증서가 있는 서버의 TLS 연결을 거부한다.
  • 인증서가 설치된 상태에서 아래 그림은 APNs 서버에 대한 연결을 열 때 발생하는 일련의 단계를 보여준다.
  1. Provider 서버에서 TLS (전송 계층 보안)를 사용하여 보안 연결요청
  2. APNs는 공급자 서버가 유효성을 검사 할 수 있도록 인증서를 전송하여 응답
  3. Provider 서버는 해당 인증서의 유효성을 검사 한 후, APNs로 provider certificate를 다시 보냄
  4. APNs는 provider certificate의 유효성을 검사하고 보안 연결완료
  5. 이제 APNs에 알림 요청을 보낼 수 있음

서버에게 전달할 것

provider server에 인증서와 개인 키를 모두 설치해야하는데, 서버 개발환경에 따라 전달할 파일이 달라지는 듯 하다. php 서버에는 .pem 을 전달해야하고, 나머지는 .p12 만 전달해도 되는 경우가 있는 듯

발급 방법 참고 링크

추가로..

APNs 와 각 디바이스에 대한 연결은 자동으로 설정되는데, 더 자세한 정보는 이곳을 참고한다

출처

 https://github.com/sujinnaljin/TIL