Establishing a Token-Based Connection to APNs

Panther·2021년 8월 17일
0

https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_token-based_connection_to_apns

"Secure your communications with Apple Push Notification service (APNs) by using stateless authentication tokens."

stateless 인증 토큰을 사용해서 애플 푸시 노티피케이션 서비스(APNs)와 커뮤니케이션을 보안상 안전하게 합니다.

Overview

토큰 기반 인증은 APNs와 커뮤니케이션 하기 위해 stateless 방식을 제공합니다. stateless 커뮤니케이션은 인증서를 찾는 것 혹은 제공자 서버와 관련이 있는 다른 정보를 APNs에게 요구하지 않기 때문에 인증서 기반 커뮤니케이션보다 더 빠릅니다. 토큰 기반 인증의 장점은 더 있습니다.

  • 다양한 제공자 서버로부터 같은 토큰을 사용할 수 있습니다.
  • 개발자가 개발하는 모든 앱에 하나의 토큰으로 노티피케이션을 보낼 수 있습니다.

토큰 기반 요청은 각 요청이 토큰을 포함하기 때문에 인증 기반 요청보다 미세하게 더 큽니다. 애플이 제공하는 제공자 토큰 서명 키를 사용해서 적어도 한 시간에 한 번은 토큰을 업데이트하고 암호화해야 합니다. 키 생성과 관련해서 알아보려면 Create a private key to access a service를 보시기 바랍니다.

Create a private key to access a service
https://help.apple.com/developer-account/#/devcdfbb56a3

Important
APNs는 단일 연결에서 여러 개발자 계정으로부터 인증 토큰을 지원하지 않습니다.

Obtain an Encryption Key and Key ID from Apple

서버에 의해 사용되는 토큰을 생성하려면 APNs 인증 토큰 서명 키가 필요합니다. Figure 1에 보이는 것처럼 developer.apple.com에서 개발자 계정으로부터 이 키를 요청해야 합니다.

Figure 1 Creating an authentication token signing key

키를 요청하면 애플은 다음을 제공합니다.

  • 키 ID를 갖는 10개의 문자 스트링입니다. JSON 토큰에 이 스트링을 포함시켜야 합니다.
  • 텍스트 파일로 구체화된 인증 토큰 서명 키입니다(.p8 파일 확장자를 갖는).

두 가지 정보를 신중하게 보안에 신경써야 합니다. JSON 토큰을 암호화하기 위해 인증 토큰 서명 키를 사용하게 될 것이기 때문에 이 키는 누군가가 해당 토큰을 생성하는 것을 방지할 수 있도록 private으로 유지해야 합니다.

Important
인증 토큰 서명 키의 손상이 의심되는 경우 이것을 취소하고 새로운 것을 다시 요청하시기 바랍니다. (developer.apple.com에서 인증 토큰 서명 키를 생성했던 같은 장소에서 취소시킬 수 있습니다.) 최대한의 보안을 위해 모든 기존의 APNs에 대한 HTTP/2 연결을 닫고, 새 요청 전에 새 연결을 설정해야 합니다.

인증 토큰 사용과 관련한 내용은 Sending Notification Requests to APNs를 보시기 바랍니다.

Sending Notification Requests to APNs
https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns
https://velog.io/@panther222128/Sending-Notification-Requests-to-APNs

Create and Encrypt Your JSON Token

노티피케이션 요청에 포함시킨 토큰은 JSON 웹 토큰(JWT) 사양을 사용합니다. 토큰은 그 자체로 네 개의 키 값 싸응ㄹ 포함합니다. Table 1에서 설명하고 있습니다.

The token that you include with your notification requests uses the JSON Web Token (JWT) specification. The token itself contains four key-value pairs, which are described in Table 1.

Table 1 Keys you include in the authentication token

KeyDescription
alg토큰 암호화를 위해 사용하는 암호화 알고리즘입니다. APNs는 ES256 알고리즘만 지원하므로 이 키의 값을 ES256으로 설정해야 합니다.
kid개발자 계정으로부터 얻은 10 문자 키 ID입니다. Obtain an Encryption Key and Key ID from Apple을 보시기 바랍니다.
iss앱 개발을 위해 사용하는 10 문자 팀 ID 값인 발행자 킹입니다. 개발자 계정에서 가져올 수 있습니다.
iatJSON 토큰이 잘행되었던 시점 시간을 나타내는 값을 갖는 발행시점 시간입니다. UTC에서 에포크 이후로 나타나는 초 단위로써 값을 구체화해야 합니다. 값은 현재 시간으로부터 한 시간이 지나지 않아야 합니다.

Obtain an Encryption Key and Key ID from Apple은 이 글의 윗부분에서 나왔습니다.

키는 헤더와 JSON 웹 토큰의 클레임 페이로드로 나눠집니다. 토큰의 헤더는 암호화 알고리즘 및 키 ID를 포함하고, 클레임 페이로드는 팀 ID 및 토큰 생성 시점을 포함합니다. Listing 1은 JSON 토큰의 예시를 보여줍니다.

Listing 1 Sample JSON for an authentication token

{
   "alg" : "ES256",
   "kid" : "ABC123DEFG"
}
{
   "iss": "DEF123GHIJ",
   "iat": 1437179036
}

Important
iat 필드에 있는 값이 한 시간 이상 오래된 경우 APNs는 이 토큰을 포함하는 모든 노티피케이션을 거부하고 ExpiredProviderToken(403) 에러를 반환합니다.

인증 토큰 서명 키 및 구체화된 알고리즘을 사용해서 결과 JSON 데이터를 암호화해야 합니다. 제공자 서버는 모든 노티피케이션 요청과 함께 암호화된 결과 데이터를 포함해야 합니다.

JWT 사양에 대한 자세한 정보는 https://tools.ietf.org/html/rfc7519를 보시기 바랍니다. 서명된 JWT 생성에 대한 사용 가능한 라이브러리의 리스트와 함께 JWT에 대한 추가적인 정보는 https://jwt.io를 보시기 바랍니다.

Attach Your Token to Notification Requests

노티피케이션에 대한 POST 요청을 생성할 때 요청의 인증 헤더에 암호화된 토큰을 포함시켜야 합니다. 토큰은 Base64URL-encoded JWT 포맷에 있고, bearer <token data>로 구체화됩니다. 아래 예시에서 설명합니다.

Listing 2 Adding the authentication token to your POST request

authorization = bearer eyAia2lkIjogIjhZTDNHM1JSWDciIH0.eyAiaXNzIjogIkM4Nk5WOUpYM0QiLCAiaWF0I
		 jogIjE0NTkxNDM1ODA2NTAiIH0.MEYCIQDzqyahmH1rz1s-LFNkylXEa2lZ_aOCX4daxxTZkVEGzwIhALvkClnx5m5eAT6
		 Lxw7LZtEQcH6JENhJTMArwLf3sXwi

POST 요청 구성에 대한 방법은 Sending Notification Requests to APNs를 보시기 바랍니다.

Sending Notification Requests to APNs
https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns
https://velog.io/@panther222128/Sending-Notification-Requests-to-APNs

Refresh Your Token Regularly

보안을 위해서 APNs는 토큰을 주기적으로 리프레시할 것을 요청합니다. 20분에서 60분 사이로 토큰을 리프레시해야 합니다. APNs는 한 시간 이상 지난 타임스탬프를 포함하는 토큰을 갖는 모든 요청을 거부합니다. 유사하게 APNs는 20분에 한 번 이상 토큰을 재생성할 경우 에러를 보내니다.

제공자 서버에서 현재 타임스탬프로 토큰을 재생성하기 위해 반복 작업을 설정하시기 바랍니다. 토큰을 다시 암호화하고 후속 노티피케이션 요청에 붙이시기 바랍니다.

See Also


Security

Establishing a Certificate-Based Connection to APNs

제공자 서버에 인증서 설치를 통해 애플 푸시 노티피케이션 서비스(APNs)와 커뮤니케이션을 보안상 안전하게 합니다.

https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_certificate-based_connection_to_apns
https://velog.io/@panther222128/Establishing-a-Certificate-Based-Connection-to-APNs


0개의 댓글