Codex CLI 401 "exceeded retry limit" 해결
Codex CLI 가 5번 재연결하다 401 Unauthorized 로 끝날 때, 어떤 인증이 쓰이는지 확인하고 로그아웃 후 다시 로그인하는 순서를 정리합니다.
exceeded retry limit, last status: 401 Unauthorized, request id: ...요청이 인증 단계에서 거절당한 것입니다. 재시도는 같은 자격 증명으로 되풀이될 뿐이라, 자격 증명을 바꾸기 전에는 끝나지 않습니다. 아래 순서로 어떤 자격 증명이 쓰이는지 확인한 뒤 새로 로그인합니다.
[1] 버전과 로그인 상태를 봅니다.
$ codex --versioncodex-cli 0.163.0$ codex login statusNot logged inAPI 키로 로그인돼 있으면 Logged in using an API key - *** 가 나옵니다. 상태 확인이 Error checking login status: key must be a string at line 1 column 2 처럼 파일을 읽다 실패하면 auth.json 자체가 깨진 것이니 4단계로 갑니다.
[2] 401 이 날 때 화면이 어떻게 흐르는지 알아 둡니다. 가짜 키와, 항상 401 을 돌려주는 로컬 서버로 시험하면 다음처럼 됩니다.
$ codex exec --skip-git-repo-check "hi"ERROR: Reconnecting... 1/5ERROR: Reconnecting... 2/5ERROR: Reconnecting... 3/5ERROR: Reconnecting... 4/5ERROR: Reconnecting... 5/5ERROR: unexpected status 401 Unauthorized: Incorrect API key provided, url: http://127.0.0.1:18401/v1/responses첫 요청 뒤 5번 더 다시 보내고(서버에 POST 가 모두 6번 도착했습니다) 포기합니다. 사용자 보고에 나오는 exceeded retry limit, last status: 401 Unauthorized 는 같은 상황의 다른 문구입니다.
[3] 쓰이는 자격 증명이 무엇인지 가립니다. 0.163.0 에서 시험한 결과는 이렇습니다.
| 상황 | 결과 |
|---|---|
auth.json 에 API 키가 저장돼 있고 OPENAI_API_KEY 환경 변수도 있음 | 요청에는 저장된 키가 실렸습니다 |
auth.json 없음 + OPENAI_API_KEY 만 있음 | codex login status 는 Not logged in, codex exec 요청에는 인증 헤더가 없었습니다 |
auth.json 없음 + CODEX_API_KEY 만 있음 | codex login status 는 Not logged in, codex exec 요청에는 이 키가 실렸습니다 |
OPENAI_API_KEY 를 export 해 두었는데도 오래된 저장 키 때문에 401 이 난다면, 환경 변수를 고치는 것으로는 해결되지 않습니다. 저장된 쪽을 지워야 합니다.
[4] 저장된 로그인을 지웁니다.
$ codex logoutSuccessfully logged out$ codex login statusNot logged incodex logout 은 auth.json 을 지웁니다. 로그인 정보는 $CODEX_HOME(기본 ~/.codex)의 auth.json 이나 OS 자격 증명 저장소에 있고, 어디에 둘지는 cli_auth_credentials_store(file · keyring · auto · ephemeral)가 정합니다(공식 문서). codex logout 이 오류를 내거나 auth.json 이 깨져 있으면 파일을 직접 옮겨 두고(mv ~/.codex/auth.json ~/auth.json.bak) 다시 로그인합니다.
[5] 다시 로그인합니다.
$ codex loginChatGPT 계정은 브라우저로, API 키는 아래처럼 표준 입력으로 넘깁니다.
$ printenv OPENAI_API_KEY | codex login --with-api-keyReading API key from stdin...Successfully logged in브라우저가 없는 서버라면 codex login --device-auth(문서에서는 베타)를 씁니다. 그것도 안 되면 브라우저가 있는 PC 에서 로그인한 auth.json 을 복사하거나, 콜백 포트(기본 localhost:1455)를 SSH 로 전달하라고 문서가 안내합니다.
[6] 되는지 확인하고, 그래도 안 되면 주소 설정을 봅니다.
$ codex login status로그인은 됐는데 같은 401 이 계속되면 요청이 엉뚱한 주소로 가고 있을 수 있습니다. config.toml 의 model_provider·base_url 과 환경 변수 OPENAI_API_BASE 를 점검합니다. 이슈 openai/codex#5456 에서는 OPENAI_API_BASE 를 지우자 풀렸다는 사용자 보고가 있습니다. 담당자 확인은 없는 보고 하나라서, 위 순서로 해결되지 않을 때만 해 봅니다.
설정 파일 위치와 프로필 전환은 Codex CLI 설정 프로필에서 다룹니다.