ASC API에서 401 NOT_AUTHORIZED — Authentication credentials are missing or invalid가 발생하는데 JWT 서명(ES256)은 정확한 경우, JWT의 exp 값이 원인일 가능성이 높습니다.
Apple ASC API는 exp - iat ≤ 1200초(20분)를 영구 hard cap으로 강제합니다.
| exp 설정값 | 결과 |
|---|---|
| iat + 1200 (정확히 20분) | ✅ 정상 |
| iat + 1199 (약간 짧게) | ✅ 정상 (권장 — 시계 오차 방지) |
| iat + 1201 이상 | ❌ 401 NOT_AUTHORIZED (서명 유효해도) |
| iat + 1800 (30분) | ❌ 401 (배치 전체 실패) |
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 때문인 경우가 많습니다.