본문 바로가기

iOS

[iOS] Remote Notification (.p8 VS .p12)

728x90

Notification의 종류

iOS 앱에서 관리하는 알림/Notification의 종류는 크게 두가지이다.

  • local (로컬 알림) : 앱에서 직접 만드는 notification
  • remote (리모트/원격 알림) : 서버 등 원격(remote)에서 만들어지는 notification

 

APNs

Apple Push Notification service의 약자로,

✔️ 앱에 notification을 보낼 수 있도록 애플이 만든 서비스이다.

✔️ 원격으로 앱에 알림을 보내고 싶다면, 무조건 APNs를 거쳐야 한다. (local 알림은 거치지 않아도 된다.)

 

🤔 왜 원격의 경우에는 APNs를 거쳐야 하는가?
개발자/서비스가 보내려는 알림을 특정 사용자의 기기로 전달하는 역할을 해주기 때문이다. 

 

동작 구조

동작 구조는 아래와 같다.

  • Device에서 APNs에 push 요청을 하게 되고, APNs는 푸시 토큰을 Device에 발급을 한다. 이후 Device는 Provider server에게 푸시 토큰을 전달한다.
  • Push Token을 전달 받은 Provider는 추후 디바이스에 푸시를 전송할 때, APNs에 요청을 하게 되고 APNs가 디바이스에 푸시를 전송하게 된다. 

Establish a Trusted Connection to APNs

위의 과정을 거쳐서 푸시 알림이 전달되는데, 대충 .. 서버를 만들고 그 서버에서(= Provider) APNs에 알림 보내라. 라고 하고 싶지만 애플은 역시 만만하지 않다. 알림 요청을 APNs로 보내기 위해서는 Provider 서버가 HTTP/2 및 TLS를 사용해서

  1. Token 기반 (.p8)
  2. Certificate 기반 (.p12)

둘 중 하나로 신뢰를 설정해야 한다.

 

 

Token - Based

토큰 기반 인증은 APNs와 stateless한 방식으로 통신한다. 

stateless 통신은 APNs가 Provider서버와 관련된 Certificate or 기타 정보를 조회할 필요가 없기 때문에 Certificate 기반 통신보다 빠르다. 

 

🟢 토큰 기반 인증의 장점 

  • 여러 Provider server에서 동일한 토큰 사용 가능 
  • 하나의 토큰을 사용해서 모든 앱에 대한 notification을 보낼 수 있다.

🔴 토큰 기반 인증의 단점

  • 매번 요청시마다 인증 토큰을 요청에 포함해야 하므로 인증서 기반보다 요청이 조금 크다.
  • 애플에서 제공하는 Provider Token Signing Key를 사용해서 한시간에 한번 이상 토큰을 업데이트하고 암호화해야 한다.

✔️ 이 Signing Key는 개발 및 프로덕션 환경에서 모두 동작

✔️ 만료되지 않지만 취소할 수 있다. 

 

 

Certificate - Based

인증서 기반은 인증서를 사용해서 Provider와 APNs의 보안연결을 설정한다.

 

(위의 토큰 방식과 마찬가지로) 개발자 계정을 통해서 이 인증서를 발급 받을 수 있다.

 

🟢 인증서 기반 인증의 장점 

  • 토큰 기반과는 다르게 신뢰는 서버 레벨에서 설정하기 때문에 각 요청에서는 인증 토큰이 필요 없다.

 

🔴 인증서 기반 인증의 단점

  • 하지만 각 앱에 대해서 별도의 인증서를 생성해야 하며,
  • 각 알림에 대한 별도의 APNs 연결을 관리해야 한다. 
하나의 토큰을 사용해서 회사의 모든 앱에 대한 notification을 보낼 수 없다.
(간단하게 관리할 수 없다.)

또한, 만료 기간이 있기 때문에 매년 인증서를 갱신해야 하며 이를 까먹으면 앱 사용자 모두에게 앱에 대한 푸시 알림이 가지 않기 때문에 큰 문제가 발생할 수 있다.
(토큰 기반에서 사용하는 signing key는 만료되지 않는다.)

 

 

.p8 과 .p12가 뭔데

그래서 ~~~ 이 둘의 차이가 무엇인가? 하면 !!

간단하게 말해서, 토큰 기반 방식에서 사용하는 파일은 .p8이고 인증서 기반 방식에서 사용하는 것은 .p12이다.

 

.p8

p8의 포맷은 key, Token Signing Key이다.

Apple에서 제공하는 Provider Token Signing Key를 사용하여 한시간에 한번 이상 토큰을 업데이트하고 암호화해야한다고 한다. 이 Signing Key는 개발 및 프로덕션 환경 모두에서 동작하며, Signing Key는 만료되지 않지만 취소할 수 있다. 

 

.p12

p12의 포맷은 인증서이다.

그러므로 인증서 기반 연결에서 사용한다. 

 

p8 VS p12
p8은 public key로 여러 앱에서 인증키 사용이 가능하다.
만료 기간이 없지만, 한번 다운로드 한 후 재다운로드가 불가하기 때문에 인증키 관리가 필요하다.

p12는 private key로 각 앱 당 인증서(개발용 푸시 인증서/배포용 인증서)가 필요하다.
만료 기간은 1년이기 때문에 만료 기간이 지나기 전에 인증서 갱신을 해야한다.
만약 인증서 갱신을 하지 않는다면 만료된 인증서로 인해 서비스에서 푸시 송수신이 불가할 수 있다.

p12 인증서는 p8 인증키가 등장한 이후로 거이 사용되지 않기 때문에 p8 인증키를 사용할 것을 권장한다. 

 

.. 그래서 포맷이 뭔데 ..

자주 사용하는 FCM을 통해서 살펴보자 .

FCM을 Provider Server로 많이 사용하게 되는데,

위의 표시처럼 APN 인증키의 경우는 p8을 업로드하면 되고, APN 인증서의 경우는 p12를 업로드 하면 된다.

 

보통 어떤 방식을 사용하는가? 하면

Firebase에서도 알 수 있는 것처럼 인증 키 방식을 더 추천한다.