이번 글에서는
APNs <-> Provider Server의 신뢰 연결을 위한
를 구축하려면 어떤게 필요한지 정리하겠습니다.
(1)편에서 Apple Developer 계정에 들어가서 APNs를 항목을 보게되면 옆에 Configure라는게 있습니다.
그걸 클릭 하게 되면 이런 창이 뜨는데요.
음..APNs SSL 인증서..?
App ID에 Push Notification을 구성하기 위해, Provider Server와 APNs의 연결 하기 위해 Client SSL 인증서가 필요하다고 합니다.
각각 App ID는 각자의 Client SSL 인증서를 요구합니다.
ㅇ ㅓ..? SSL 인증서..?
내가 지금까지 본건 AAA Certificate Service root 인증서였는데 말이죠.
그걸로 서버를 신뢰하게 한 것 아니었어..? 🥹
헷갈립니다 헷갈려
APNs SSL 인증서
AAA Certificate Service 루트 인증서
👩💻 정리하자면....
APNs SSL 인증서는
1) 개발자가 자체 서명 인증서
를 생성하고 2) 해당 인증서를 Apple에 등록
한 후, 3) Apple이 해당 인증서를 식별하여 해당 App과 Push Notification을 연결
하는데 사용됩니다.
AAA Certificate Service 루트 인증서는
1) 서버에 설치되며 2) APNs SSL 인증서의 유효성을 검사
하고, 3) 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가 정상작동 할 것 같은데
서버엔 어떻게 줘야할까요?
1) 키체인 접근에서 내보내기
키체인 접근에 가서 APNs, 개인 키 둘 다 선택한 뒤 내보내기를 선택합니다.
그럼 .p12 파일이 뽑힙니다.
그럼 요 .p12 파일을 서버 개발자에게 전달하면 됩니다.
👩💻 p12 파일이란?
1년마다 갱신되는 인증서 입니다.
어휴 1년마다 갱신이라니 애플은 참 복잡하기도 하네요...
어떻게, 이제 신뢰할까요 둘이?
Transport layer security(TLS)를 사용해서 보안 연결을 요청한 후에, APNs는 Provider Server의 유효성을 검사할 인증서를 통해 응답합니다.
Provider Server는 이 인증서의 유효성을 검사한 후 Provider 인증서를 APNs에 보내고,
APNs가 유효성 검사 하면 둘이! 신뢰관계를 구축합니다!
토큰으로 인증하면 인증서 방식 보다 조금 빠르다네요.
그리고 여러 서버에서 동일한 토큰을 사용할 수 있어서 토큰 1개 갖고 회사 모든 앱에 대한 알림을 배포 할 수 있겠군요 ㅎㅎ
근뎨! 인증서 방식은 1년에 1번인데 이건 적어도 1시간에 한 번 토큰을 업뎃하고 암호화 해야 한다네요..
여기서 키 발급 받아서 사용할 수 있습니다.
요기서..
저 키ID 문자열을 JSON 토큰에 넣어야 하고, p8 파일인 인증 토큰 서명키로 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를 이렇게 정리해놔서 뿌듯합니다!