App Store Connect API JWT 20분(1200초) Hard Cap

← hexisteme · 2026-06-13 · iOS 배포 실증 노트

ASC API에서 401 NOT_AUTHORIZED — Authentication credentials are missing or invalid가 발생하는데 JWT 서명(ES256)은 정확한 경우, JWT의 exp 값이 원인일 가능성이 높습니다.

규칙: exp ≤ iat + 1200초

Apple ASC API는 exp - iat ≤ 1200초(20분)를 영구 hard cap으로 강제합니다.

exp 설정값결과
iat + 1200 (정확히 20분)✅ 정상
iat + 1199 (약간 짧게)✅ 정상 (권장 — 시계 오차 방지)
iat + 1201 이상❌ 401 NOT_AUTHORIZED (서명 유효해도)
iat + 1800 (30분)❌ 401 (배치 전체 실패)
주의: 이 한도는 ASC API에만 적용됩니다. Apple의 다른 JWT(DeviceCheck, App Attest, Apple Pay)는 다른 정책을 씁니다. ASC API 전용 cap입니다.

올바른 JWT 생성 (Python 예시)

import jwt, time

iat = int(time.time())
payload = {
    "iss": ISSUER_ID,
    "iat": iat,
    "exp": iat + 1180,  # 1200 이하, 약간의 시계 오차 마진
    "aud": "appstoreconnect-v1"
}
token = jwt.encode(payload, PRIVATE_KEY, algorithm="ES256",
                   headers={"kid": KEY_ID})

배치 스크립트 주의사항

스크린샷 업로드 같은 12개+ 연속 API 호출 배치에서는 각 요청마다 토큰을 재발급하거나, 배치 시작 시 1180초 토큰을 발급해 전체를 20분 이내에 완료해야 합니다. 일부 호출은 성공하고 일부는 401이 나는 패턴이 이 cap 때문인 경우가 많습니다.

hexisteme dev-notes — iOS 배포 실증에서 얻은 노트 · 목록 · CC-BY-NC-4.0