이전 HTTP에서 HTTP v1로 이전

FCM의 이전 HTTP API를 사용하는 앱은 이 가이드의 안내에 따라 HTTP v1 API로 이전해야 합니다. HTTP v1 API는 이전 API에 비해 다음과 같은 장점이 있습니다.

  • 액세스 토큰을 통한 보안 향상: HTTP v1 API는 OAuth2 보안 모델에 따라 수명이 짧은 액세스 토큰을 사용합니다. 액세스 토큰이 공개되는 경우에도 만료되기 전에 1시간 정도만 악의적으로 사용될 수 있습니다. 새로고침 토큰이 이전 API에서 사용하는 보안 키만큼 자주 전송되지 않으므로 캡처될 가능성이 매우 낮습니다.

  • 여러 플랫폼에서 보다 효율적인 메시지 맞춤설정: 메시지 본문의 경우 HTTP v1 API에 모든 대상 인스턴스에 전달되는 공용 키는 물론 여러 플랫폼의 메시지를 맞춤설정할 수 있는 플랫폼별 키가 있습니다. 이러한 키를 사용하면 메시지 하나로 여러 클라이언트 플랫폼에 약간 다른 페이로드를 전송하는 '재정의'를 만들 수 있습니다.

  • 새 클라이언트 플랫폼 버전을 위한 확장성 강화 및 미래 경쟁력 확보: HTTP v1 API는 iOS, Android, 웹에 제공되는 메시지 옵션을 완전히 지원합니다. 각 플랫폼마다 JSON 페이로드에 자체 정의된 블록이 있으므로 FCM에서 필요에 따라 새 버전과 새 플랫폼으로 API를 확장할 수 있습니다.

하지만 기기 그룹 메시징이나 멀티캐스트 메시징을 사용하는 앱은 다음 버전의 API를 기다리는 것이 좋습니다. HTTP v1은 이전 API의 해당 기능을 지원하지 않습니다.

서버 엔드포인트 업데이트

HTTP v1 API의 엔드포인트 URL은 다음과 같은 면에서 이전 엔드포인트와 다릅니다.

  • 경로의 /v1로 버전이 지정됩니다.
  • 경로에 /projects/myproject-ID/ 형식으로 앱의 Firebase 프로젝트 ID가 포함됩니다. Firebase 콘솔의 General project settings(일반 프로젝트 설정) 탭에서 이 ID를 확인할 수 있습니다.
  • 명시적으로 send 메소드를 :send로 지정합니다.

HTTP v1의 서버 엔드포인트를 업데이트하려면 전송 요청 헤더의 엔드포인트에 이러한 요소를 추가합니다.

이전

POST https://fcm.googleapis.com/fcm/send

이후

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send

전송 요청의 승인 업데이트

HTTP v1 전송 요청의 경우 이전 요청에서 사용하는 서버 키 문자열 대신 OAuth 2.0 액세스 토큰을 헤더에 Authorization: Bearer <valid Oauth 2.0 token>으로 추가해야 합니다.

이전

Authorization: key=AIzaSyZ-1u...0GBYzPu7Udno5aA

이후

Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

액세스 토큰 생성 및 가져오기

모든 Firebase 프로젝트에는 기본 서비스 계정이 있습니다. 이 계정을 사용하여 앱 서버 또는 신뢰할 수 있는 환경에서 Firebase 서버 API를 호출할 수 있습니다. 다른 서비스 계정을 사용하는 경우 편집자 또는 소유자 권한이 있어야 합니다.

서비스 계정을 인증하고 Firebase 서비스에 액세스하도록 승인하려면 JSON 형식의 비공개 키 파일을 생성하고 이 키를 사용하여 수명이 짧은 OAuth 2.0 토큰을 발급받아야 합니다. 유효한 토큰을 확보했으면 원격 구성, FCM 등 다양한 Firebase 서비스의 요구사항에 따라 서버 요청에 토큰을 추가할 수 있습니다.

서비스 계정에 대한 비공개 키 파일을 생성하는 방법은 다음과 같습니다.

  1. Firebase 콘솔에서 설정 > 서비스 계정을 엽니다.
  2. 새 비공개 키 생성을 클릭하고 키 생성을 클릭하여 확인합니다.
  3. 키가 들어있는 JSON 파일을 안전하게 저장합니다. 다음 단계를 완료하려면 이 파일이 필요합니다.

액세스 토큰을 발급받는 방법은 다음과 같습니다.

토큰을 발급받으려면 사용할 언어에 대한 Google API 클라이언트 라이브러리를 사용하여 다음과 같이 비공개 키 JSON 파일을 참조합니다.

토큰이 만료되면 토큰 새로고침 메소드가 자동으로 호출되어 업데이트된 토큰이 발급됩니다.

FCM에 대한 액세스를 승인하려면 https://www.googleapis.com/auth/firebase.messaging 범위를 요청합니다.

HTTP 요청 헤더에 액세스 토큰을 추가하는 방법은 다음과 같습니다.

Authorization 헤더의 값으로 토큰을 Authorization: Bearer <access_token> 형식으로 추가합니다.

node.js

headers: {
  'Authorization': 'Bearer ' + accessToken
}

Python

headers = {
  'Authorization': 'Bearer ' + _get_access_token(),
  'Content-Type': 'application/json; UTF-8',
}

자바

URL url = new URL(BASE_URL + FCM_SEND_ENDPOINT);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestProperty("Authorization", "Bearer " + getAccessToken());
httpURLConnection.setRequestProperty("Content-Type", "application/json; UTF-8");
return httpURLConnection;

전송 요청의 페이로드 업데이트

FCM HTTP v1에서 JSON 메시지 페이로드의 구조에 중대한 변화가 있습니다. 이러한 변화를 통해 기본적으로 여러 클라이언트 플랫폼에 수신될 때 메시지가 올바르게 처리될 수 있을 뿐만 아니라 플랫폼별로 보다 유연하게 메시지 필드를 맞춤설정하거나 '재정의'할 수 있습니다.

HTTP v1에 익숙해지려면 이 섹션의 예시를 살펴보는 것 외에도 여러 플랫폼의 메시지 맞춤설정을 참조하고 API 참조를 검토하세요.

예시: 간단한 알림 메시지

다음은 title, body, data 필드만 있는 매우 간단한 알림 페이로드의 비교이며, 이전 및 HTTP v1 페이로드의 기본적인 차이점을 보여줍니다.

이전

{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available."
  },
  "data": {
    "story_id": "story_12345"
  }
}

이후

{
  "message": {
    "topic": "news",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    }
  }
}

예시: 여러 플랫폼 타겟팅

여러 플랫폼 타겟팅을 사용 설정하기 위해 이전 API는 백엔드에서 재정의를 수행했습니다. 반면 HTTP v1는 플랫폼 간의 차이점을 분명하게 만들고 개발자에게 이러한 차이점을 보여주는 플랫폼별 키 블록을 제공합니다. 이를 통해 다음 샘플에 나와 있는 것처럼 요청 하나로 언제든지 여러 플랫폼을 타겟팅할 수 있습니다.

이전

// Android
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available.",
    "click_action": "TOP_STORY_ACTIVITY"
  },
  "data": {
    "story_id": "story_12345"
  }
}
// iOS
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available.",
    "click_action": "HANDLE_BREAKING_NEWS"
  },
  "data": {
    "story_id": "story_12345"
  }
}

이후

{
  "message": {
    "topic": "news",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    }
    "android": {
      "notification": {
        "click_action": "TOP_STORY_ACTIVITY"
      }
    },
    "aps": {
      "payload": {
        "aps": {
          "category" : "NEW_MESSAGE_CATEGORY"
        }
      }
    }
  }
}

예시: 플랫폼 재정의로 맞춤설정

HTTP v1 API를 사용하면 메시지의 교차 플랫폼 타겟팅이 단순해지는 것 외에도 플랫폼별 메시지를 유연하게 맞춤설정할 수 있습니다.

이전

// Android
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "Check out the Top Story.",
    "click_action": "TOP_STORY_ACTIVITY"
  },
  "data": {
    "story_id": "story_12345"
  }
}
// iOS
{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available.",
    "click_action": "HANDLE_BREAKING_NEWS"
  },
  "data": {
    "story_id": "story_12345"
  }
}

이후

{
  "message": {
    "topic": "news",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    },
    "android": {
      "notification": {
        "click_action": "TOP_STORY_ACTIVITY",
        "body": "Check out the Top Story"
      }
    },
    "apns": {
      "payload": {
        "aps": {
          "category" : "NEW_MESSAGE_CATEGORY"
        }
      }
    }
  }
}

FCM HTTP v1 API에 대한 추가 샘플과 자세한 내용은 Firebase 블로그를 참조하세요.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.