[IOS] App Store Connect API에 대하여 알아보자 (feat. API Key, Private Key, JWT 토큰)
이번 포스팅에서는 App Store Connect에서 일부 적업을 자동화 할 수 있는 REST API인 App Store Connect API에 대해서 알아보겠습니다.
App Store Connect에 대해서 잘 모르신다면
해당 링크에 접근하셔서 공식 문서에서 알아보시면 될 것 같습니다.
해당 포스팅은 Apple의 공식문서 순서대로 진행하곘습니다.
1. App Store Connect API는 무엇이고, 무엇을 할 수 있을까?
App Store Connect API는 Apple의 App Store Connect 서비스와 프로그래밍 방식으로 상호 작용할 수 있게 해주는 RESTful API입니다. 개발자는 이 API를 사용하여 자동화된 방식으로 앱의 메타데이터를 관리하거나, 판매 보고서를 받아보고, 사용자 권한을 관리하거나, TestFlight 제출을 자동화하는 등의 작업을 할 수 있습니다.
App Store Connect API를 사용하기 위해서는 먼저 App Store Connect에서 API 키를 생성하고, 해당 키를 사용하여 API 요청에 서명해야 합니다. 각 요청은 인증 헤더가 필요하며, JWT(JSON Web Token)를 사용하여 이루어집니다.
API를 사용하기 위해서는 API Key, Private Key, 그리고 JWT토큰이 필요합니다.
2. App Store Connect API용 API Key(API Key, Private Key) 생성하기
위 공식문서 사진에 나와있는 순서대로 진행해보겠습니다.
-1. App Store Connect API 요청
-2. 팀 API 키 생성
이렇게 생성하면 키(Private Key)를 다운로드 할 수 있는데
공식문서에 나와있는 것 처럼 API키는 한번 만 다운받을 수 있다고 합니다.
2. API 요청에 대한 토큰 생성하기
API 요청을 승인하려면 개인 키로 서명된 JSON 웹 토큰(JWT)을 생성해야합니다.
토큰 형식은 문서에 나온 것에 맞게 해주면 됍니다.
JWT 페이로드에 대한 부분입니다.
저는 팀 키를 발급 받았기에 팀 키에 대한 JWT 페이로드 생성하는 법에 대해서 보았습니다.
만드시고 승인 헤더에 아래 사진과 같이 포함시키고, url로 요청하시면 됍니다.
서버 쪽 로직을 nest.js로 예시코드를 만들어본다면 아래와 같습니다.
(코드는 확실하지 않으므로 검증이 필요합니다.)
import { Injectable } from '@nestjs/common';
import * as jwt from 'jsonwebtoken';
import { HttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';
@Injectable()
export class AppStoreService {
constructor(private httpService: HttpService) {}
// JWT 생성
private createToken() {
const issuerId = '57246542-96fe-1a63-e053-0824d011072a'; // App Store Connect에서 제공받은 Issuer ID
const keyId = '2X9R4HXF34'; // App Store Connect에서 제공받은 Key ID
const privateKey = `-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----`; // 생성한 API 키
// 현재 시간과 만료 시간 계산
const issuedAt = Math.floor(Date.now() / 1000);
const expiration = issuedAt + (10 * 60); // 예: 토큰의 유효기간을 현재로부터 10분으로 설정
const token = jwt.sign({
// JWT 페이로드
iss: issuerId,
iat: issuedAt,
exp: expiration,
aud: "appstoreconnect-v1",
scope: ["GET /v1/apps?filter[platform]=IOS"],
}, privateKey, {
// JWT 헤더
algorithm: 'ES256',
header: {
kid: keyId,
},
});
return token;
}
// App Store Connect API 요청
public async getAppInformation(appId: string) {
const token = this.createToken();
const url = `https://api.appstoreconnect.apple.com/v1/apps/${appId}`;
try {
const response = await firstValueFrom(
this.httpService.get(url, {
headers: {
Authorization: `Bearer ${token}`,
},
}),
);
return response.data;
} catch (error) {
console.error('App Store Connect API 요청 실패', error);
throw error;
}
}
}
참고 링크
https://developer.apple.com/documentation/appstoreconnectapi
https://developer.apple.com/kr/help/app-store-connect/get-started/app-store-connect-api/