튜토리얼
OpenAI API 키 무효: 401, 환경 변수 및 프로젝트 설정 점검
OpenAI 401, 403, 429를 구분하고 환경 변수, 조직 및 프로젝트 설정을 점검하며 읽기 전용 요청으로 자격 증명을 검증하세요.
TL;DR
OpenAI가 401을 반환하며 키가 올바르지 않다는 메시지가 나오면 먼저 자격 증명, 런타임 변수, 조직 또는 프로젝트 설정을 확인하세요. 429는 오류 코드에 따라 속도, 잔액 또는 사용 한도를 확인해야 하며, 403도 구체적인 사유를 읽어야 합니다.
Python 예제를 실행하기 전에 동일한 Python 환경에서 python -m pip install requests를 실행하세요.
먼저 오류 유형을 구분하세요
| 응답 | 확인 방향 |
|---|---|
| 401, Incorrect API key 안내 | 전체 키, 철자, 폐기 상태 및 소속 |
| 401, 기타 인증 안내 | 조직 구성원 관계, 권한 또는 IP 제한 등 구체적 사유 |
| 403 | 응답 사유(지역 또는 기타 접근 제한 포함) 읽기 |
| 429 | 속도 제한, 잔액, 조직 또는 프로젝트 사용 한도 구분 |
sk- 접두사만으로 키가 유효하다고 판단하지 마세요. 전체 자격 증명, 대상 도메인 및 계정 설정이 모두 일치해야 합니다.
다섯 단계로 실행 환경 점검
- OpenAI를 호출하는지 호환 플랫폼을 호출하는지 확인하세요. 각 플랫폼은 자체 키를 사용합니다.
- 실제 프로세스의
OPENAI_API_KEY를 확인하여 빈 값, 자리 표시자, 잘못 복사된 값을 배제하세요. - 환경 변수 로드 우선순위를 확인하세요. 배포 플랫폼의 값이 로컬
.env를 덮어쓸 수 있습니다. - 키가 폐기되었는지, 어느 조직과 프로젝트에 속하는지 확인하세요. 조직 또는 프로젝트 요청 헤더를 직접 설정했다면 해당 값이 일치하는지 확인하고, 무작정 요청 헤더를 추가하지 마세요.
- 실행 환경을 다시 로드한 뒤 읽기 전용 점검을 수행하세요. 계속 오류가 나면 응답의 요청 ID를 기록하고 계정 담당자에게 문의하세요.
로컬 점검 시 자격 증명을 출력하지 마세요
import os
name = "OPENAI_API_KEY"
key = os.environ.get(name, "")
print({
"variable": name,
"present": bool(key),
"length": len(key),
"has_whitespace": any(c.isspace() for c in key),
"wrapped_in_quotes": len(key) >= 2 and key[0] == key[-1] and key[0] in (chr(34), chr(39)),
})
전체 요청 헤더를 출력하는 디버그 로그를 사용하지 말고, 키를 16진수로 변환해 티켓에 붙여 넣지도 마세요. 그것 역시 전체 자격 증명입니다.
읽기 전용 검증 요청
서버 환경에서 다음 코드를 실행하세요. 모델 목록을 읽을 뿐 콘텐츠 생성을 제출하지 않습니다. 제한된 키는 읽기 권한 부족으로 거부될 수 있으므로, 200이 아닌 모든 응답을 키 손상으로 판정해서는 안 됩니다.
import os
import re
import requests
key = os.environ.get("OPENAI_API_KEY", "")
if not key or any(ord(c) < 33 or ord(c) > 126 for c in key) or any(c in key for c in (chr(34), chr(39))):
raise SystemExit("Check the key environment variable: empty, whitespace, control characters, or quotes")
try:
response = requests.get(
"https://api.openai.com/v1/models",
headers={"Authorization": f"Bearer {key}"},
timeout=30,
)
except requests.RequestException as exc:
raise SystemExit("Request failed: " + type(exc).__name__) from None
print("HTTP", response.status_code)
if response.ok:
print("Model list received")
else:
try:
body = response.json()
error = body.get("error", {})
message = str(error.get("message") or body.get("message") or "")
message = message.replace(key, "[REDACTED]")
message = re.sub(r"sk-[A-Za-z0-9_*.-]+", "[REDACTED]", message)
print("code:", error.get("code") or body.get("error_code"))
print("type:", error.get("type"))
print("message:", message)
print("request_id:", error.get("request_id") or response.headers.get("x-request-id"))
except ValueError:
print("Non-JSON response; check the base URL and network path")
HiAPI로 전환할 때 확인할 사항
HiAPI를 사용할 때는 키를 HIAPI_API_KEY로 바꾸고, Base URL은 HiAPI 주소를 사용한 뒤 모델 페이지에 따라 요청 진입점을 선택하세요. 먼저 HiAPI 인증 안내와 인터페이스 선택 가이드를 읽어 보세요.
두 요청은 반드시 각자 플랫폼의 자격 증명을 독립적으로 사용해야 하며, OpenAI 키를 HiAPI에 보내 소위 “격리 검증”을 해서는 안 됩니다.
자주 묻는 질문
키 접두사가 올바르면 반드시 사용할 수 있나요?
접두사만으로 판단할 수 없습니다. 전체 값, 폐기 상태, 계정 설정도 확인해야 합니다.
401을 만나면 즉시 충전해야 하나요?
먼저 응답이 지적하는 인증 사유를 처리하세요. 잔액 또는 사용 한도 오류는 해당 오류 코드에 따라 별도로 처리해야 합니다.
모든 요청에 조직 및 프로젝트 요청 헤더를 추가해야 하나요?
무작정 추가하지 마세요. 다중 조직이나 구형 사용자 키 등의 경우 올바른 컨텍스트를 선택해야 하며, 이미 설정한 요청 헤더는 사용하는 자격 증명과 일치해야 합니다.
HiAPI 키로 OpenAI에 직접 요청할 수 있나요?
서로 교환할 수 없습니다. HiAPI와 OpenAI는 각자 자격 증명을 관리하며, 도메인과 키가 대응해야 합니다.
관련 글
모든 아티클 보기 →-
튜토리얼
Recraft Creative Upscale 사례: 풍경과 수채화 업스케일
통나무집, 호수, 수채화 마을의 텍스처 변화를 살펴보고 전체 결과와 미리보기를 구분하며 재화 디테일을 점검하세요.
-
튜토리얼
Kling 4.0 프롬프트 모음: 6가지 장면에서 바로 복사해 영상 만들기
이커머스 제품, 음식, 여행 풍경, 일상 장면, 소리가 있는 빈 풍경, 이미지→영상까지, 각 장면마다 실제 결과물과 전체 프롬프트, 원클릭 자동 입력 링크가 있습니다.
-
튜토리얼
Kandinsky 6.0 Pro 사용법? 5분 만에 첫 영상 만들기
온라인 체험 3단계, API 연동 3단계, 바로 실행 가능한 curl과 Python, 이미지 투 비디오 JSON, 프롬프트 4층 구조 및 출시 전 주의사항 포함.