Token exchange failed: token endpoint returned status 403 Forbidden은 인증 토큰 교환 요청이 거부됐다는 뜻입니다. 사용량 토큰이 부족하다는 뜻이 아니며, 이 문구만으로 OpenAI 장애, 프록시, 지역 제한, 오래된 인증 정보 중 하나를 단정할 수도 없습니다. 먼저 localhost 콜백, 외부 토큰 교환, 로그인 후 첫 인증 요청을 나눠 보세요. 초기화하기 전에 codex --version과 codex login status를 기록하고, Codex가 실제로 실행되는 환경과 비밀을 제거한 응답 본문을 남깁니다. 거부 지점을 모르는 상태에서 ~/.codex 전체 삭제, TLS 검증 해제, 지역 제한 우회, 콜백 URL·토큰 공유를 하면 안 됩니다.
| 증상 | 실패 지점 | 첫 확인 |
|---|---|---|
| 브라우저가 Codex로 돌아오지 않음 | localhost 콜백 | 브라우저와 수신 프로세스가 서로 도달 가능한가 |
| 브라우저 승인 후 정확한 교환 403이 나옴 | 외부 토큰 교환 | 응답 본문, 프록시/WAF, CA, 지역·계정, 실행 환경 |
| 로그인 완료 후 첫 명령에서 403 | 인증된 요청 | 워크스페이스 권한, 모델, 공급자 경로, 자격 증명 출처 |
콜백 실패와 token endpoint 거부는 다른 문제입니다. 로그인 후 API 403도 교환 실패가 아닙니다. 본문이 계정, 워크스페이스, 정책, 지원 지역을 직접 가리키면 프록시 수정을 멈추고 해당 관리자에게 넘겨야 합니다.
“2026년 7월 12일 확인: OpenAI 상태 페이지에는 알려진 전체 장애가 없었습니다. 그러나 녹색 상태는 회사 네트워크, 특정 계정, 워크스페이스 또는 지역 경로를 보증하지 않습니다.
먼저 확인할 다섯 가지
1. 같은 실행 환경에서 상태 기록
bashcodex --version codex login status
오류가 난 macOS, Windows, Linux, WSL, 컨테이너, SSH 호스트 또는 IDE 터미널에서 실행합니다. 검증 환경의 codex-cli 0.144.0-alpha.4는 예시일 뿐 최소 버전이 아닙니다.
2. 서비스 상태와 시각 확인
OpenAI Status에 인증 또는 Codex 사고가 있으면 로컬 설정을 바꾸지 말고 복구를 기다립니다. 정상이라면 로컬 네트워크와 계정 경로 진단을 계속합니다.
3. Codex의 실제 실행 위치 확인
브라우저는 호스트에 있고 Codex는 WSL, 컨테이너, 원격 서버에 있을 수 있습니다. 브라우저가 수신기에 도달하지 못하면 콜백 토폴로지 문제입니다. Codex가 콜백을 받은 뒤 token endpoint 403을 출력했다면 외부 교환 경로가 조사 대상입니다.
4. 비밀을 제외한 응답 보존
정확한 오류, 시각과 시간대, 버전, 명령, 짧은 오류 코드, request ID를 남깁니다. authorization code, access/refresh token, 전체 callback URL, Cookie, API key, 이메일, 조직 ID, 프록시 인증 정보는 지웁니다.
5. 한 번만 깨끗하게 재시도
Codex 버전, 승인된 네트워크, 실행 환경, 신뢰 CA, 로그인 상태 중 하나만 변경합니다. 성공은 브라우저 화면이 아니라 같은 환경의 codex login status와 작은 인증 요청으로 확인합니다.
인증 경로를 다섯 단계로 보기

순서는 브라우저 승인, localhost 콜백, 코드-토큰 교환, 자격 증명 저장, 첫 인증 요청입니다. 정확한 교환 403은 세 번째 단계입니다. 거부 주체는 OpenAI 계정·정책, 회사 프록시/WAF, TLS 검사와 CA, 잘못된 실행 환경, 오래된 로그인 컨텍스트일 수 있습니다.
Codex 인증 문서는 지원 로그인 방식과 저장 경로를 설명합니다. 환경 변수 문서는 승인된 사용자 CA 번들을 위한 CODEX_CA_CERTIFICATE를 제공합니다. 인증서 검증을 끄는 대신 공식 신뢰 설정을 사용하세요.
증거별 복구 분기

| 분기 | 증거 | 제한된 조치 | 성공 신호 | 중단 조건 |
|---|---|---|---|---|
| 프록시/WAF | 회사 차단 페이지, proxy ID | 네트워크 담당자에게 인증 경로 허용 요청 | 승인 경로에서 한 번의 로그인 성공 | 조직 정책을 우회하지 않음 |
| 회사 CA | 인증서 체인 오류와 TLS 검사 | 승인 PEM을 설정 | 검증을 켠 채 교환 성공 | insecure TLS 금지 |
| WSL/컨테이너/원격 | 브라우저와 수신기가 다른 네트워크 | 콜백 가능한 환경 또는 공식 대체 인증 사용 | 같은 Codex 프로세스가 콜백 수신 | 포트를 공개하지 않음 |
| 지역·계정 | unsupported_country_region_territory 등 | 지원 국가 확인, 오판은 지원 문의 | 공식 경로 사용 가능 | VPN·타인 계정 우회 금지 |
| 워크스페이스 | 개인 로그인은 성공, SSO는 거부 | 관리자에게 Codex 권한과 identity policy 확인 | 대상 워크스페이스 로그인 성공 | 정책 명시 후 로컬 변경 중단 |
| 인증 캐시 | 경로·정책 정상, logout 후 변화 | codex logout 뒤 1회 codex login | 예상 방식과 요청 성공 | 전체 디렉터리를 먼저 삭제하지 않음 |
프록시에서 loopback과 외부 요청 분리
프록시가 필요한 환경에서도 loopback은 보통 로컬에 둡니다.
bashexport NO_PROXY="localhost,127.0.0.1,::1"
외부 token endpoint는 승인된 회사 프록시를 통과해야 할 수 있으므로 OpenAI 도메인을 무조건 NO_PROXY에 넣지 마세요. 회사 TLS 검사가 확인된 경우에만 보안팀이 제공한 PEM을 사용합니다.
bashexport CODEX_CA_CERTIFICATE="/path/to/company-ca-bundle.pem" codex login
필요한 인증 계층만 초기화
bashcodex logout codex login
rm -rf ~/.codex부터 실행하면 구성, 상태, 진단 증거까지 사라질 수 있습니다. 파일 역할은 Codex config.toml 안내에서 확인하세요. 다른 사람의 auth.json을 복사하거나 자신의 파일을 공개 이슈에 올리지 마세요.
2026년 7월 12일 확인한 CLI에는 --device-auth, --with-api-key, --with-access-token이 있습니다. device auth는 브라우저와 localhost 연결 문제에 도움이 되지만 계정·지역 정책을 넘지 않습니다. API key는 개발자 과금과 기능 경계가 적용되므로 Codex API key와 구독 비교를 먼저 확인하세요.
증상에 따라 다음 단계를 고르기
브라우저는 성공인데 터미널은 계속 대기
token endpoint 403 이전에 callback이 Codex 프로세스에 도착하지 않은 상황일 수 있습니다. 브라우저는 호스트에 있고 Codex는 WSL, 컨테이너 또는 SSH 서버에 있는지 확인하세요. 브라우저의 성공 화면은 사용자 승인을 뜻할 뿐, 로컬 프로세스가 결과를 받았다는 증거가 아닙니다.
콜백이 도달 가능한 호스트에서 다시 로그인하거나 CLI가 명시적으로 지원하는 device auth를 선택할 수 있습니다. localhost 수신 포트를 인터넷에 공개하거나 callback URL을 메신저에 보내는 방식은 사용하지 마세요.
터미널에 token endpoint 403이 정확히 표시됨
이제 외부 교환 경로를 봅니다. 응답이 OpenAI 형식 JSON인지, 회사 proxy의 HTML인지, 짧은 텍스트인지 구분하세요. 회사 로고, block ID, 내부 문의처가 있는 페이지는 네트워크 계층 증거입니다. 네트워크를 바꿔도 같은 account 또는 region policy code가 나오면 계정·정책 계층이 더 유력합니다.
마지막 403 Forbidden 한 줄만 저장하면 이 차이가 사라집니다. 탈민감 본문, request ID, 시간대를 한 묶음으로 남기세요. workspace 또는 account가 명시된 뒤 Cookie와 DNS를 반복해 지우는 것은 해당 조건을 바꾸지 못합니다.
인증서 오류와 403이 함께 보임
발생 순서를 확인합니다. TLS handshake가 실패한 동안에는 실제 OpenAI HTTP 403에 도달하지 못했을 수 있습니다. 승인된 CA로 handshake가 성공한 뒤 별도의 JSON 403이 남는다면 CA 문제는 해결됐고 다른 분기가 남은 것입니다.
네트워크 담당자에게 TLS inspection 여부, 배포해야 할 root CA, 인증 경로 허용 상태를 확인하세요. 인터넷에서 받은 낯선 인증서나 NODE_TLS_REJECT_UNAUTHORIZED=0 같은 전체 검증 비활성화는 사용하지 않습니다.
WSL·컨테이너·SSH에서만 실패
호스트는 성공하고 격리 환경만 실패하면 실행 환경 차이가 강한 증거입니다. 각 환경의 버전, proxy 변수, NO_PROXY, CA 변수, codex login status를 비교하세요. 컨테이너 재시작 후 자격 증명이 사라지는 문제와 교환 시점의 403도 별개로 다뤄야 합니다.
호스트의 auth.json을 복사해 넣는 방식은 피하세요. 토큰이 노출될 뿐 아니라 격리 환경의 네트워크·저장 문제를 가립니다.
회사 워크스페이스나 SSO만 실패
브라우저에 여러 계정이 로그인돼 있다면 올바른 계정과 조직을 선택했는지 확인합니다. 관리자는 Codex 사용 설정, 멤버 권한, SSO 강제, 조건부 액세스, identity mapping을 점검해야 합니다. 개인 계정 성공은 회사 워크스페이스 권한의 증거가 아닙니다.
관리자가 수정한 후에는 같은 워크스페이스와 같은 실행 환경에서 한 번만 다시 로그인합니다. 다른 계정으로 바꾸면 원래 정책 수정이 검증되지 않습니다.
교환 성공 후 첫 요청에서만 403
먼저 codex login status로 자격 증명 저장을 확인한 뒤, 후속 응답을 별도 문제로 읽습니다. 모델 권한, 조직 entitlement, API 호환 공급자, 환경 변수의 API key가 원인일 수 있습니다. OAuth와 API key가 동시에 설정됐다면 실제로 어떤 자격 증명이 선택됐는지 기록하세요.
지원팀이 재현할 수 있는 최소 기록
text시간/시간대: 2026-07-12 17:20 +08:00 OS/실행 환경: host / WSL / container / SSH Codex version: <출력> 인증 방식: ChatGPT / device auth / API key / access token callback: 도달 / 미도달 / 불명 exchange: status, 탈민감 code, request_id network: direct / corporate proxy / TLS inspection 변경한 항목: 한 가지 결과: 같은 403 / login 성공 / 후속 요청 실패
짧은 시간선은 어떤 단계가 바뀌었는지 보여 줍니다. 브라우저, 네트워크, 계정, 버전을 동시에 바꾸면 성공해도 원인을 확인할 수 없습니다.
피해야 할 행동은 로그인 연타, 브라우저와 ~/.codex 동시 전체 삭제, 모든 OpenAI 도메인의 NO_PROXY 추가, VPN 지역 우회, 원문 로그 공개, 제3자 API 공급자의 403을 OpenAI OAuth와 혼동하는 것입니다. 많은 시도보다 한 번의 시도로 하나의 책임 계층을 제외했는지가 중요합니다.
응답 모양이 바뀌지 않았다면 같은 조치를 반복하지 마세요. 실패 단계와 오류 코드가 그대로라면 새 증거가 생긴 것이 아니며, 해당 계층의 관리자에게 전달할 시점입니다.
지원 요청에 필요한 증거

응답이 정책, 계정, 워크스페이스, 지역을 명시하면 즉시 에스컬레이션합니다. 그 외에는 현재 빌드와 승인 경로에서 한 번 재시도한 뒤 같은 증거가 나오면 멈춥니다. 정확한 오류와 탈민감 본문, 시각, 버전, 인증 방식, OS와 실행 환경, 콜백 결과, proxy/WAF/TLS 유무, request ID 또는 /feedback ID, 한 가지 변경과 결과를 전달합니다.
callback URL, authorization code, token, API key, Cookie, 전체 auth.json, 인증 정보가 포함된 proxy URL은 전달하지 않습니다. 로그인 복구 후 사용량 문제는 Codex 사용 한도로 분리합니다.
자주 묻는 질문
브라우저는 성공했는데 Codex는 왜 실패하나요?
사용자 승인과 코드-토큰 교환은 다른 요청입니다. 후자만 프록시, 정책, 계정 규칙에 거부될 수 있습니다.
OpenAI 도메인을 NO_PROXY에 넣어야 하나요?
일괄 추가하지 마세요. localhost는 로컬에 두되 외부 교환은 회사 라우팅 정책을 따라야 합니다.
API key로 바꾸면 해결되나요?
적합한 개발자 인증일 수 있지만 과금과 기능이 바뀝니다. 계정, 워크스페이스, 지원 지역 정책을 우회하지 못합니다.
언제 로컬 진단을 중단하나요?
명시적인 policy/account/workspace/region 거부가 나오거나, 승인 경로에서 한 번의 깨끗한 재시도가 같은 결과를 낼 때입니다.
