[iOS] 사용자 알림(User Notifications) - (1) APNs - 3

Hyunndy·2023년 2월 27일
1

iOS-Push

목록 보기
4/4

🐸

이번 글에서는
APNs <-> Provider Server의 신뢰 연결을 위한

  • Token-Based 관계
  • Certificated-Base 관계

를 구축하려면 어떤게 필요한지 정리하겠습니다.


Certificate-Based 관계

(1)편에서 Apple Developer 계정에 들어가서 APNs를 항목을 보게되면 옆에 Configure라는게 있습니다.
그걸 클릭 하게 되면 이런 창이 뜨는데요.
https://velog.velcdn.com/images/yoosa3004/post/0557319a-0db6-4369-8a43-5b10fb119429/image.png

음..APNs SSL 인증서..?
App ID에 Push Notification을 구성하기 위해, Provider Server와 APNs의 연결 하기 위해 Client SSL 인증서가 필요하다고 합니다.
각각 App ID는 각자의 Client SSL 인증서를 요구합니다.

ㅇ ㅓ..? SSL 인증서..?
내가 지금까지 본건 AAA Certificate Service root 인증서였는데 말이죠.
그걸로 서버를 신뢰하게 한 것 아니었어..? 🥹
헷갈립니다 헷갈려

APNs SSL Certificates VS AAA Certificate Service Certificates

APNs SSL 인증서

  • 특정 앱이 APNs와 통신하는데 사용됩니다.
  • 이 인증서는 앱 -> 서버로 전송하는 모든 Push Notification에 대한 보안 연결을 제공합니다.

AAA Certificate Service 루트 인증서

  • APNs SSL 인증서를 발급하는 인증 기관(CA) 중 하나.
  • 이 루트 인증서는 APNs SSL 인증서의 유효성을 검증하고, 인증서가 발급된 인증 기관이 신뢰할 수 있는지 확인합니다.

👩‍💻 정리하자면....
APNs SSL 인증서는
1) 개발자가 자체 서명 인증서를 생성하고 2) 해당 인증서를 Apple에 등록한 후, 3) Apple이 해당 인증서를 식별하여 해당 App과 Push Notification을 연결하는데 사용됩니다.

AAA Certificate Service 루트 인증서는
1) 서버에 설치되며 2) APNs SSL 인증서의 유효성을 검사하고, 3) SSL 인증서가 해당 앱과 연결되어 있음을 확인합니다.

앱 개발자가 자체설명으로 만들어낸 인증서를 서버에 등록된 공인인증기관 인증서로 검사하는 거였군요~!

APNs SSL 인증서 만들기

인증서 어떻게 만들까요?

1) "Certificates, Identifiers & Profiles" 섹션으로 이동

2) (+) 눌러 APNs(Sandbox & Production) 옵션 선택 후 continue

3) APNs와 연결할 App ID 선택

4) CSR(Certificate Signing Request) 업로드

👩‍💻 CSR 파일이란?
인증서 서명 요청 파일.
인증서 발급을 위해 필요한 정보를 담고 있는 인증서 신청 형식 데이터 파일입니다.
공개키와 인증서가 적용되는 도메인에 대한 정보가 포함됩니다.
나는 누구인데(도메인), 이 키(공개키)가 포함된 인증서를 발급하고 싶다. 라는 뜻

Keychain access를 열고

인증기관에서 인증서 요청 클릭


생성 완료!

5) APNs 인증서 다운로드

애플이 시키는데로 APNs SSL 인증서 받아서 .cer 파일 더블클릭 한 뒤 키체인에 인스톨 합시다.

에...근데
이 인증서를 서버에도 줘야..? APNs가 정상작동 할 것 같은데
서버엔 어떻게 줘야할까요?

APNs SSL 인증서 추출하기

1) 키체인 접근에서 내보내기

키체인 접근에 가서 APNs, 개인 키 둘 다 선택한 뒤 내보내기를 선택합니다.

그럼 .p12 파일이 뽑힙니다.

그럼 요 .p12 파일을 서버 개발자에게 전달하면 됩니다.

👩‍💻 p12 파일이란?
1년마다 갱신되는 인증서 입니다.

어휴 1년마다 갱신이라니 애플은 참 복잡하기도 하네요...

Provider Server <-> APNs 신뢰!


어떻게, 이제 신뢰할까요 둘이?
Transport layer security(TLS)를 사용해서 보안 연결을 요청한 후에, APNs는 Provider Server의 유효성을 검사할 인증서를 통해 응답합니다.
Provider Server는 이 인증서의 유효성을 검사한 후 Provider 인증서를 APNs에 보내고,
APNs가 유효성 검사 하면 둘이! 신뢰관계를 구축합니다!


Token-Based 신뢰 관계

토큰으로 인증하면 인증서 방식 보다 조금 빠르다네요.
그리고 여러 서버에서 동일한 토큰을 사용할 수 있어서 토큰 1개 갖고 회사 모든 앱에 대한 알림을 배포 할 수 있겠군요 ㅎㅎ
근뎨! 인증서 방식은 1년에 1번인데 이건 적어도 1시간에 한 번 토큰을 업뎃하고 암호화 해야 한다네요..

여기서 키 발급 받아서 사용할 수 있습니다.
요기서..

  • 키 ID가 포함된 10자 문자열
  • 텍스트 파일(.p8 확장명)으로 지정된 인증 토큰 서명 키
    를 주는데요,

저 키ID 문자열을 JSON 토큰에 넣어야 하고, p8 파일인 인증 토큰 서명키로 JSON 토큰을 암호화 한다고 합니다.

JSON 토큰 생성 및 암호화

Notification에 사용되는 토큰은 JWT(JSON WEB TOKEN) 형식을 사용합니다.
4개의 키 - 쌍을 포함하는데,
{
"alg" : "ES256", // 토큰 암호화 알고리즘 (APNs는 ES256알고리즘만 지원하므로 고정 값)
"kid" : "ABC123DEFG" (개발자 계정에서 얻은 10자리 키 ID)
}
{
"iss": "DEF123GHIJ", (팀 ID 발급자 키)
"iat": 1437179036 (JSON 토큰 발행 시간)
}

요렇게 JSON WEB TOKEN을 보내면~ 이걸 암호화해서 보내는 것이지요.


마무리

여기까지 APNs를 보았습니다.
음.. 서버에서 PUSH Request를 보내는건... 굳이 정리 안해도 될 것 같아 패스하겠습니다.

어쨋든 애플은 참.. Remote Notification 하는데에 많은 고생을 필요로 하네요. ㅠㅠ

인증서(or 키) 발급, XCode 세팅, 디바이스토큰 보내주는 delegate 세팅, payload 생각, 근데 또 그게 4KB넘으면 안되고.. 액션이나 알림 정보 수정하려면 또 뭔가 등록해줘야하고..생성해줘야하고..

아무튼 그래도 회사에서 기계적으로 사용하던 것 TOP1이라고 생각했던
APNs를 이렇게 정리해놔서 뿌듯합니다!

profile
https://hyunndyblog.tistory.com/163 티스토리에서 이사 중

0개의 댓글