# Codex 401 Incorrect API key provided 오류 해결: URL과 키로 원인 가리기

> ChatGPT 계정으로 로그인했는데 이 401이 떴다면 오류 속 URL과 키 문자열부터 보세요. 9월 26일 아침 장애는 끝났고, 지금도 난다면 토큰 갱신이나 키·프로바이더 설정이 원인입니다.

- URL: https://blog.laozhang.ai/ko/posts/codex-401-incorrect-api-key
- Published: 2026-10-01
- Updated: 2026-10-01
- Author: LaoZhang AI Team (https://blog.laozhang.ai/ko/about)
- Category: AI 개발 도구
- Tags: OpenAI Codex, Codex CLI, 401 Unauthorized, Incorrect API key provided, 문제 해결

---
API 키를 설정한 적이 없는데 Codex가 `unexpected status 401 Unauthorized: Incorrect API key provided`를 내놓는다면, 그 문장만으로는 누구의 키가 틀렸는지 알 수 없습니다. 같은 문장이 세 군데에서 나옵니다. OpenAI 서버 내부, 내 컴퓨터의 로그인 토큰, 그리고 내가 직접 넣은 API 키나 커스텀 프로바이더 설정입니다.

구분은 오류 메시지 안에 이미 들어 있습니다. `url:` 뒤의 주소와 `Incorrect API key provided:` 뒤의 키 문자열, 그리고 `codex login status`의 출력 한 줄이면 됩니다. 2026년 9월 26일 아침(한국 시간)에 겪은 401은 OpenAI 쪽 장애였고 이미 복구됐습니다. 그 뒤에도 같은 오류가 계속된다면 원인은 내 쪽 환경에 있을 가능성이 높으며, 아래 표에서 자기 경우를 찾아 해당 절로 가면 됩니다.

## 오류 속 URL과 키 문자열로 401을 돌려준 곳 가리기

오류 전문을 복사해 두고 세 가지만 읽습니다. 장애 당시 여러 사용자가 [GitHub 이슈 #48237](https://github.com/openai/codex/issues/48237)에 올린 원문은 다음과 같은 모양입니다.

```text
unexpected status 401 Unauthorized: Incorrect API key provided: sk-svcac***…***fvMA.
You can find your API key at https://platform.openai.com/account/api-keys.,
url: https://chatgpt.com/backend-api/codex/responses, cf-ray: …, request id: …
```

여기에 로그인 방식을 더합니다.

```bash
codex login status
```

| `url:` 주소 | 키 문자열 | `codex login status` | 401의 출처 | 할 일 |
| --- | --- | --- | --- | --- |
| `chatgpt.com/backend-api/codex/responses` | 내가 만든 적 없는 `sk-svcac…` 형태 | `Logged in using ChatGPT` | OpenAI 서버 쪽 | [상태 페이지](https://status.openai.com/) 확인 후 대기. 로컬 파일은 건드리지 않음 |
| `api.openai.com/v1/responses` | `dummy` | ChatGPT 로그인 | 로컬 토큰 갱신 실패 | `codex logout` 후 다시 로그인 |
| `api.openai.com/...` | 내 키의 앞뒤 글자와 일치 | API 키 로그인 | 내 API 키 | 환경 변수와 키 상태 점검 |
| 내가 설정한 게이트웨이 주소 | 그 서비스에 넣은 키 | 무관 | 커스텀 프로바이더 | `config.toml`의 `env_key`와 base URL 점검 |

![오류에 찍힌 url 주소, 키 문자열, 로그인 방식에 따라 Codex 401의 출처 네 가지와 할 일을 짝지은 그림](https://blog.laozhang.ai/posts/ko/codex-401-incorrect-api-key/img/codex-401-source-map.webp)

표에 없는 경우도 하나 있습니다. 주소는 `chatgpt.com/backend-api/codex/responses`인데 본문이 `{"detail":"Unauthorized"}`이고 "refresh token was revoked. Please log out and sign in again"이라는 안내가 따라붙는 401입니다([#41975](https://github.com/openai/codex/issues/41975)). 이것은 `Incorrect API key provided`와 다른 오류이며, 안내대로 로그아웃 후 재로그인하면 됩니다.

## 9월 26일 아침의 sk-svcac 키 401: OpenAI 내부 자격 증명이 폐기된 장애

ChatGPT 계정으로 로그인한 사용자가 9월 26일 아침에 본 401은 사용자의 키나 로그인과 관계가 없었습니다. [OpenAI의 사고 보고서](https://status.openai.com/incidents/01M3DCNWMW57HYK8FJ5FBFPA39/write-up)가 밝힌 원인은 다음과 같습니다. 자격 증명 유출을 탐지하는 내부 시스템이 Codex를 지원하는 내부 서비스 간 통신용 자격 증명을 유출된 것으로 잘못 판정했고, 이 자격 증명이 기존 보호 장치를 우회한 수동 작업으로 폐기됐습니다. OpenAI는 탐지를 유발한 트래픽이 정상이었고 해당 내부 자격 증명은 유출되지 않았다고 확인했습니다.

영향 범위도 보고서에 적혀 있습니다. ChatGPT 계정 로그인으로 Codex에 접속한 사용자는 인증 오류(401)와 게이트웨이 오류(502)를 겪었고, 사용자가 직접 발급한 API 키로 접속한 경로는 영향을 받지 않았습니다.

오류에 찍힌 `sk-svcac…fvMA`가 내 키가 아니라는 점은 사용자 보고에서 추론할 수 있습니다. #48237, [#48241](https://github.com/openai/codex/issues/48241) 등 서로 다른 사람이 올린 오류에서 가려진 키의 앞뒤 글자가 똑같았고, 보고자들은 API 키를 설정한 적이 없었습니다. 여러 사람이 같은 키를 봤다면 그것은 개인의 키일 수 없습니다. 이 키가 보고서에 나온 내부 자격 증명 그 자체인지, `sk-svcac` 접두어가 무엇을 뜻하는지는 OpenAI의 공개 자료에 기재가 없습니다. 보고서의 설명과 맞아떨어진다는 데까지만 말할 수 있습니다.

### 장애 시각은 74분과 56분, 기준이 다릅니다

시간은 두 가지로 읽어야 합니다. 태평양 일광 절약 시간(PDT)은 UTC보다 7시간 늦고 한국 시간은 UTC보다 9시간 빠르므로, PDT에 16시간을 더하면 한국 시간이 됩니다.

| 기준 | 원문 시각 | 한국 시간(9월 26일) | 길이 |
| --- | --- | --- | --- |
| 사고 보고서의 영향 시간 | 9월 25일 약 3:33 p.m.~4:47 p.m. PDT | 약 07:33~08:47 | 약 74분 |
| 상태 페이지 공지 구간 | 9월 25일 22:58~23:54 UTC | 07:58~08:54 | 56분 |

두 숫자는 서로 다른 것을 잽니다. 앞의 것은 사용자가 실제로 실패를 겪은 시간이고, 뒤의 것은 [상태 페이지 사고 기록](https://status.openai.com/incidents/01M3DCNWMW57HYK8FJ5FBFPA39)이 열려 있던 시간입니다. 실용적으로 중요한 것은 그 차이입니다. 영향이 시작된 07:33 무렵부터 첫 공지가 올라온 07:58까지 약 25분 동안은 상태 페이지에 이 사고의 공지가 없었습니다. 상태 페이지가 정상이라고 해서 곧바로 내 문제라고 단정할 수 없는 이유입니다. 그 시간대에는 GitHub 이슈에 같은 오류가 몰리는지가 더 빠른 신호였습니다.

![한국 시간 기준 9월 26일 Codex 장애 타임라인: 영향 시간 약 74분, 상태 페이지 공지 구간 56분, 공지가 없던 약 25분](https://blog.laozhang.ai/posts/ko/codex-401-incorrect-api-key/img/codex-outage-timeline-kst.webp)

복구도 한순간에 끝나지 않았습니다. 보고서에 따르면 원래 자격 증명은 4:39 p.m. PDT(한국 시간 08:39)에 다시 활성화됐고 서비스는 약 08:47에 "대체로" 복구됐습니다. GitHub에서 OpenAI 담당자는 한국 시간 08:51에 "Recovery is rolling out through clusters"라고 적었습니다. 클러스터별로 순차 복구됐다는 뜻이므로, 사람마다 정상으로 돌아온 시각이 몇 분씩 달랐습니다.

## API 키 재발급, ~/.codex 삭제, 다운그레이드: 장애 때는 효과가 없던 조치

서버 쪽 401에는 로컬 조치가 통하지 않습니다. 폐기된 것은 OpenAI 내부 자격 증명이었으므로, 내 컴퓨터에서 무엇을 바꾸든 요청은 같은 지점에서 거절됩니다. #48241에 환경을 자세히 올린 사용자의 기록이 이를 잘 보여 줍니다. `codex login status`는 `Logged in using ChatGPT`였고, `OPENAI_API_KEY`·`CODEX_API_KEY`·`OPENAI_BASE_URL` 환경 변수는 없었으며, CLI 0.157.0과 0.148.0에서 똑같이 실패했습니다.

그런데도 "이렇게 했더니 고쳐졌다"는 글이 여럿 남았습니다. 시각을 맞춰 보면 이유가 드러납니다.

- [#48302](https://github.com/openai/codex/issues/48302)는 CLI를 0.148.0으로 내렸더니 복구됐다고 했지만, 글이 올라온 시각은 23:56 UTC로 서버 복구 직후입니다. 같은 0.148.0에서 실패를 재현한 사람이 #48241에 있습니다.
- [#48570](https://github.com/openai/codex/issues/48570)은 재로그인 없이 컴퓨터를 다시 켠 것만으로 돌아왔다고 했는데, 실패했던 시간대가 장애와 순차 복구 구간에 겹칩니다.

두 경우 모두 조치와 서버 복구가 같은 시각에 일어났기 때문에, 다운그레이드나 재부팅이 효과를 냈다는 근거가 되지 못합니다. `auth.json`과 `state_5.sqlite`를 지우라는 안내도 돌았지만, [Codex 인증 문서](https://learn.chatgpt.com/docs/auth)에는 `state_5.sqlite` 삭제가 복구 절차로 나와 있지 않습니다. 로컬 상태를 지우면 저장된 세션 정보까지 잃을 수 있으므로, 서버 쪽 401이라고 판단되는 동안에는 다음을 하지 않는 편이 낫습니다.

- API 키 재발급: 애초에 내 키가 요청에 쓰이지 않았습니다.
- `~/.codex` 폴더나 키체인 항목 삭제, 앱 재설치.
- CLI 버전 내리기.
- 같은 내용의 이슈나 `/feedback` 추가 제출: OpenAI 담당자가 장애 중에 추가 제보는 필요 없다고 직접 답했습니다.

## 급하면 API 키 로그인으로 바꿔도 되나: 과금이 따로 붙습니다

장애 중에는 API 키 로그인이 실제로 통하는 우회로였습니다. 상태 페이지에는 한국 시간 08:19에 "Login via API key will unblock access at this time"이라는 공지가 올라왔고, 사고 보고서도 API 키 경로는 영향이 없었다고 적었습니다.

```bash
printenv OPENAI_API_KEY | codex login --with-api-key
```

다만 바꾸기 전에 알아야 할 조건이 있습니다. 인증 문서에 따르면 API 키로 쓴 사용량은 ChatGPT 요금제에 포함된 사용량에서 빠지지 않고 OpenAI Platform의 표준 API 요금으로 별도 청구됩니다. ChatGPT 워크스페이스나 클라우드 서비스에 의존하는 일부 기능은 제한되거나 쓸 수 없고, Codex cloud는 ChatGPT 계정 로그인으로만 이용됩니다. 한 시간 남짓한 장애라면 기다리는 쪽이 비용 면에서 유리한 경우가 많습니다. 마감이 걸린 작업처럼 멈출 수 없을 때만 전환하고, 복구되면 `codex logout` 후 ChatGPT 계정으로 다시 로그인해 원래 경로로 돌아옵니다. 두 방식에 무엇이 포함되는지는 [Codex API 키와 ChatGPT 구독 차이](https://blog.laozhang.ai/ko/posts/codex-api-key-vs-subscription)에 정리돼 있습니다.

## 장애가 끝났는데 아직 401이 나오는 이유: dummy 키와 토큰 갱신 실패

장애가 복구된 뒤에도 ChatGPT 계정 로그인 상태에서 이 오류가 뜬다면 키 문자열을 다시 보세요. `sk-svcac…`가 아니라 `dummy`이고 주소가 `api.openai.com/v1/responses`라면 로컬 로그인 토큰 문제입니다.

[#37192](https://github.com/openai/codex/issues/37192)(2026년 8월, CLI 0.145.0)의 보고에 따르면, 네트워크를 바꾼 뒤 ChatGPT 로그인 토큰 갱신이 실패하자 Codex가 코드에 고정된 `dummy` 키로 요청을 보냈고 `Incorrect API key provided: dummy.`가 돌아왔습니다. 이 설명은 보고자가 코드를 읽고 분석한 것이며, 이슈는 2026년 10월 1일 기준 열려 있고 OpenAI의 공식 확인이나 수정 버전은 공개돼 있지 않습니다. 다만 판별 기준으로는 충분합니다. 키가 `dummy`이고 주소가 `chatgpt.com`이 아니라면 9월 장애와는 다른 일입니다.

이 경우에는 다시 로그인하는 것이 맞는 조치입니다.

```bash
codex logout
codex login
codex login status
```

인증 문서에 따르면 로그인 정보는 `~/.codex/auth.json` 또는 운영체제의 자격 증명 저장소에 보관되고, CLI와 IDE 확장이 같은 캐시를 씁니다. 한쪽에서 로그아웃하면 VS Code 확장도 다시 로그인해야 한다는 뜻입니다. `codex login`은 로그 폴더에 `codex-login.log`를 남기므로, 로그인 자체가 실패하면 이 파일을 먼저 봅니다. 로그인 단계에서 403이 난다면 다른 문제이므로 [Codex 토큰 교환 403 실패](https://blog.laozhang.ai/ko/posts/codex-token-exchange-failed-403) 쪽 절차를 따르세요.

재로그인 뒤에도 그대로라면 요청이 컴퓨터 밖으로 나가고 있는지 확인합니다. Windows 사용자 한 명은 [#48316](https://github.com/openai/codex/issues/48316)에서, Codex 데스크톱 앱이 업데이트된 뒤 실행 파일 경로가 바뀌자 Malwarebytes가 이를 새 프로그램으로 보고 외부 HTTPS 연결을 막았고, 화면에는 똑같은 401 문구가 표시됐다고 보고했습니다. 한 사람의 보고이고 장애 당일 밤에 일어난 일이라 OpenAI가 인과를 확인해 준 사례는 아닙니다. 그래도 서드파티 방화벽이나 보안 프로그램을 쓰고 있고 앱 업데이트 직후부터 오류가 났다면, 차단 기록에 `codex.exe`가 있는지 확인해 볼 만합니다.

회사에서 관리하는 환경이라면 로그인 방식이 강제돼 있을 수도 있습니다. 관리 설정에 `forced_login_method = "chatgpt"` 또는 `"api"`가 있으면 맞지 않는 방식으로 로그인했을 때 Codex가 로그아웃하고 종료합니다. 이럴 때는 관리자에게 허용된 방식을 묻는 것이 먼저입니다.

## API 키 로그인의 Incorrect API key: 실제로 전송된 키 확인

`codex login status`가 API 키 로그인이라면 이 메시지는 글자 그대로의 뜻입니다. [OpenAI API 오류 코드 문서](https://developers.openai.com/api/docs/guides/error-codes#api-errors)는 `401 - Incorrect API key provided`의 원인을 "요청에 쓰인 API 키가 올바르지 않다"로, 해결책을 키가 맞는지 확인하거나 새로 발급하는 것으로 적고 있습니다.

새 키를 만들기 전에, 의도한 키가 실제로 전송되는지부터 봅니다. 오류에 찍힌 키의 앞뒤 글자를 Platform 콘솔에 있는 키와 비교하면 됩니다. 다르다면 셸에 남아 있던 예전 환경 변수가 쓰이고 있는 것입니다.

```bash
env | grep -E '^(OPENAI_API_KEY|CODEX_API_KEY|OPENAI_BASE_URL)=' | cut -c1-26
```

`cut`은 키 전체가 화면에 찍히지 않도록 앞부분만 보여 줍니다. 여기서 확인할 것은 세 가지입니다. 예전에 폐기한 키가 `.zshrc`나 `.env`에 남아 있지 않은지, 변수 두 개가 서로 다른 키를 가리키지 않는지, `OPENAI_BASE_URL`이 다른 서비스 주소로 잡혀 있지 않은지입니다. 마지막 경우에는 OpenAI 키가 엉뚱한 서버로 가거나 그 반대가 되어, 유효한 키인데도 401을 받습니다.

키가 일치하는데도 401이라면 메시지 문구를 다시 읽습니다. 같은 문서에는 401로 분류되는 다른 오류가 따로 있습니다. 인증 정보가 유효하지 않은 경우(Invalid Authentication), 계정이 어떤 조직에도 속하지 않은 경우, 허용되지 않은 IP에서 요청한 경우입니다. 문구가 `Incorrect API key provided`가 아니라면 키를 재발급해도 해결되지 않고, 조직 소속이나 IP 허용 목록을 봐야 합니다.

## 커스텀 프로바이더 401: config.toml의 env_key와 base URL

`url:`에 내가 설정한 게이트웨이나 다른 모델 서비스의 주소가 찍혀 있다면, 401을 돌려준 것은 그 서비스입니다. 9월 장애나 ChatGPT 로그인 상태와는 관계가 없고, 그 서비스에 넣은 키와 주소가 판정 기준이 됩니다.

인증 문서는 커스텀 프로바이더의 인증을 세 가지로 나눕니다.

| `config.toml` 설정 | 요청에 실리는 인증 | 401이 날 때 볼 것 |
| --- | --- | --- |
| `requires_openai_auth = true` | OpenAI 로그인. `env_key`는 무시됨 | 현재 OpenAI 로그인 상태 |
| `env_key`에 환경 변수 이름 지정 | 그 환경 변수에 든 프로바이더 키 | 변수가 지금 셸에 설정돼 있는지, 값이 그 서비스의 키인지 |
| 둘 다 없음 | 인증 없이 요청 | 서비스가 키를 요구하는지 |

놓치기 쉬운 지점은 두 번째와 세 번째 줄에 있습니다. `env_key`에 적은 이름과 실제로 내보낸 환경 변수 이름이 다르거나, 터미널에서는 설정했는데 IDE 확장이 띄운 프로세스에는 전달되지 않는 경우입니다. `requires_openai_auth = true`를 함께 넣어 두면 `env_key`가 무시된다는 점도 놓치기 쉽습니다. 설정 파일 전체를 어떻게 구성하는지는 [Codex Custom Provider 설정](https://blog.laozhang.ai/ko/posts/codex-config-toml)에서 다룹니다.

## 로컬 점검을 멈출 지점과 지원팀에 넘길 정보

점검은 다음 세 가지를 확인한 데서 멈춥니다. 로그인 방식이 의도한 것과 같고, 환경 변수와 `config.toml`에 예상 밖의 키나 주소가 없으며, 로그아웃 후 재로그인을 한 번 했다는 것입니다. 여기까지 하고도 `chatgpt.com/backend-api/codex/responses`에서 401이 계속된다면 남은 원인은 계정이나 서버 쪽이고, 파일을 더 지우거나 재설치를 반복해도 얻을 것이 없습니다.

그다음은 문의입니다. OpenAI의 오류 코드 문서는 오류가 지속될 때 지원팀에 전달할 정보로 사용한 모델, 오류 메시지와 코드, 요청 데이터와 헤더, 요청 시각과 시간대를 듭니다. Codex 오류에서는 아래 항목이 여기에 해당합니다.

- 오류 전문. 특히 `url:`, `cf-ray:`, `request id:` 값.
- 발생 시각과 시간대(예: 2026년 10월 1일 14:20 KST).
- `codex login status` 출력과 Codex 버전, 운영체제.
- 사용한 모델 이름과 프로바이더 설정 여부.

넘기면 안 되는 것도 있습니다. 인증 문서는 `auth.json`에 액세스 토큰이 들어 있으니 비밀번호처럼 다루고, 커밋하거나 문의 내용·채팅에 붙여 넣지 말라고 명시합니다. 오류에 찍힌 키는 이미 가려져 있어 그대로 붙여도 되지만, 환경 변수 값이나 `auth.json` 내용은 올리지 않습니다.

401이 아니라 재시도 한도 초과, 429, 스트림 끊김이 섞여 나온다면 원인 분류가 달라지므로 [Codex 401·429·Stream Disconnected: 실패한 계층부터 찾기](https://blog.laozhang.ai/ko/posts/codex-exceeded-retry-limit-429)를 참고하세요.

## 장애로 날린 Codex 사용량은 돌려받나

OpenAI의 공식 문서에 약속된 보상은 없습니다. 상태 페이지와 사고 보고서 어디에도 사용 한도 이야기는 나오지 않습니다. 있는 것은 Codex 책임자 Tibo(@thsottiaux)가 복구 직후 X에 올린 글로, Codex와 ChatGPT Work의 모든 유료 사용자에 대해 사용 한도를 초기화하겠다는 내용입니다. 이 글은 [OpenAI 개발자 커뮤니티 게시물](https://community.openai.com/t/codex-is-down-confirmed-by-openai/1400811)에 인용돼 있습니다.

담당자의 공개 발언이지 계정별 적용을 보장하는 공지는 아니므로, 자기 계정에 반영됐는지는 Codex의 사용량 화면에서 직접 확인해야 합니다. 장애 중 API 키 로그인으로 전환해 쓴 비용은 Platform 쪽 청구이며, 상태 페이지와 사고 보고서에는 이 비용에 대한 언급이 없습니다.

## 다음에 같은 401을 만났을 때의 순서

오류 전문을 복사하고 `url:`과 키 문자열을 읽습니다. `chatgpt.com/backend-api` 주소에 내 것이 아닌 키라면 상태 페이지와 GitHub 이슈를 확인하고 기다립니다. `dummy`라면 로그아웃 후 재로그인합니다. 내 키가 찍혔다면 환경 변수를, 다른 서비스 주소가 찍혔다면 `config.toml`을 봅니다. 이 순서를 지키면 키를 재발급하거나 폴더를 지우는 일은 정말 필요한 경우로만 좁혀집니다.
