본문으로 바로가기
Guide

코덱스(Codex) 로그인 에러, 인증이 안 될 때 원인과 해결 방법

코덱스 CLI에서 로그인 정보가 없으면 Codex 로그인 에러가 어떤 메시지로 나오는지 직접 재현했습니다. 상태 확인과 다시 로그인하는 순서, 저장 폴더를 바꿨을 때 로그인이 풀리는 이유를 담았습니다.

· · 수정

빈 상자를 가리키는 화살표와 잠긴 자물쇠, 옆의 열쇠 상자를 그린 코덱스 로그인 오류 개념 그림
코덱스(Codex) 로그인 에러, 인증이 안 될 때 원인과 해결 방법 표지 삽화

로그인 정보가 없는 폴더를 가리킨 채 코덱스에 요청을 보내면 바로 실패하지 않습니다. 재연결을 5/5까지 시도한 뒤에야 401 Unauthorized로 끝나고, 맥 한 대에서 직접 실행해 보면 여기까지 15.5초가 걸렸습니다. Codex 로그인 에러를 만났다면 아래 순서대로 상태 확인부터 해 보세요.

로그인 에러는 어떤 메시지로 나올까요?

결론부터 말하면 순서는 간단합니다. codex login status로 지금 상태를 보고, Not logged in이 나오면 codex login으로 다시 로그인합니다. 그런데 분명히 로그인했는데도 이 메시지가 나온다면요? 그때는 코덱스가 로그인 정보를 찾는 폴더가 바뀐 건 아닌지 의심해 볼 차례입니다.

codex-cli 0.164.0-alpha.11.1에서 평소 상태와 로그인 정보가 없는 상태를 나란히 실행한 결과는 다음과 같습니다.

상황명령출력종료 코드
평소 상태codex login statusLogged in using ChatGPT0
빈 폴더를 CODEX_HOME으로 지정codex login statusNot logged in1
같은 상태로 요청 보내기codex exec(출력을 tail로 넘김)401 Unauthorized측정 안 됨(파이프라인 값 0)

요청을 보낸 단계의 마지막 여섯 줄은 이렇게 찍혔습니다.

$ CODEX_HOME="$PWD/empty-codex" codex exec --ephemeral --skip-git-repo-check "OK라고만 답하세요" 2>&1 | tail -6
ERROR: Reconnecting... 2/5
ERROR: Reconnecting... 3/5
ERROR: Reconnecting... 4/5
ERROR: Reconnecting... 5/5
ERROR: unexpected status 401 Unauthorized: Missing bearer or basic authentication in header, url: https://api.openai.com/v1/responses, cf-ray: a502cb929f05c10a-ICN, request id: req_dd1b5b20f7c64f7cbfd0d6f88ac15e65
ERROR: unexpected status 401 Unauthorized: Missing bearer or basic authentication in header, url: https://api.openai.com/v1/responses, cf-ray: a502cb929f05c10a-ICN, request id: req_dd1b5b20f7c64f7cbfd0d6f88ac15e65

메시지를 풀어 보면 요청 헤더에 인증 정보가 없었다는 뜻이에요. 이 단계에 기록된 종료 코드 0은 출력을 tail로 넘긴 파이프라인의 값입니다. 그래서 codex exec 자체가 어떤 종료 코드로 끝났는지는 이 측정으로 확인하지 못했습니다. AI 에이전트 작업을 스크립트로 돌린다면, 작업 전에 codex login status를 먼저 실행해 종료 코드 1(Not logged in)을 걸러 내는 편이 좋습니다. 그와 별개로 codex exec 출력을 파이프로 넘길 때는 파이프라인 마지막 명령의 값이 아니라 Codex 프로세스 자체의 종료 코드를 따로 보존해 확인하는 편이 좋습니다.

단계별 시간을 보면 상태 확인과 도움말은 모두 0.0초에 끝났고, 요청 단계만 15.5초가 걸렸습니다. 기다리는 동안 화면에는 재연결 메시지만 쌓이니, 에러가 늦게 뜬다고 해서 네트워크 문제로 단정하지 않는 게 좋겠죠.

코덱스 로그인 상태와 오류를 확인하는 단계별 걸린 시간을 비교한 막대그래프
단계별로 한 번씩 실행해 잰 시간. 요청 단계만 재연결 끝에 15.5초가 걸렸습니다.
도식출처: 명령 실행 실측

함께 읽을 글

로그인이 안 될 때 따라 할 순서

그럼 실제로 무엇부터 하면 될까요? Authentication 문서와 codex login --help 출력이 말하는 선택지를 따라 할 순서로 묶으면 다음과 같습니다.

  1. 상태를 확인합니다. 공식 문서는 이 명령이 지금 쓰는 인증 방법을 보여 준다고 설명합니다.
    $ codex login status
    Logged in using ChatGPT
  2. Not logged in이 나오면, 그 터미널에서 CODEX_HOME을 다른 폴더로 지정해 두지 않았는지 확인합니다. 이 부분은 다음 절에서 자세히 다룹니다.
  3. 저장된 로그인 정보를 지우고 싶다면 codex logout을 실행한 뒤 codex login을 실행하고 브라우저 로그인을 마칩니다. 유효한 세션이 없을 때는 이 방식이 기본 인증 경로입니다.
  4. 구독 대신 사용량 과금으로 쓰려면 API 키를 표준 입력으로 넘깁니다.
    shell
    printenv OPENAI_API_KEY | codex login --with-api-key
  5. ChatGPT Enterprise 환경에서 Codex 액세스 토큰을 받아 두었다면 같은 방식으로 넘깁니다.
    shell
    printenv CODEX_ACCESS_TOKEN | codex login --with-access-token
  6. 다시 codex login status로 상태가 바뀌었는지 확인합니다.
ChatGPT 로그인, API 키, Enterprise 액세스 토큰 세 가지 방법을 언제 고르는지와 그다음 할 일로 나눠 비교한 표
상태와 저장 위치를 확인한 뒤 용도에 맞는 방법 하나를 고르고, 어느 방법이든 상태를 다시 확인합니다.
도식출처: 근거를 바탕으로 코드가 그린 도식

어떤 방법을 골라야 할지 헷갈린다면 아래 표로 비교해 보세요.

방법맞는 경우주의점
ChatGPT 로그인구독으로 로컬에서 쓸 때Codex cloud는 이 방식만 지원
API 키CI/CD 같은 자동화 작업요금제 크레딧 대신 표준 API 요금
액세스 토큰Enterprise 자동화관리자가 권한을 줘야 함
기기 코드원격·헤드리스 환경베타 기능

저장 폴더를 바꾸면 왜 로그인이 풀릴까요?

공식 문서에 따르면 파일 방식으로 저장할 때 로그인 정보는 CODEX_HOME 아래의 auth.json에 들어갑니다. 기본값은 ~/.codex이고, 설정에 따라 운영체제 자격 증명 저장소를 쓰기도 해요. 그래서 이 측정에서도 같은 맥, 같은 계정인데 빈 폴더를 CODEX_HOME으로 가리키자 결과가 Not logged in으로 바뀌었습니다.

$ mkdir -p empty-codex && CODEX_HOME="$PWD/empty-codex" codex login status; echo "종료 코드 $?"
종료 코드 1
Not logged in

파일 저장 방식을 쓰면서 프로젝트마다 CODEX_HOME을 따로 두고 에이전트를 돌린다면, 폴더를 바꿀 때 그 폴더에 auth.json이 있는지와 codex login status 결과를 먼저 확인하는 편이 좋습니다. 다만 평소 상태의 로그인 정보가 파일에 있었는지 자격 증명 저장소에 있었는지는 이 측정만으로 알 수 없습니다. 저장 위치는 config.toml의 cli_auth_credentials_store로 정할 수 있어요.

toml
# file | keyring | auto | ephemeral
cli_auth_credentials_store = "keyring"
하나의 터미널에서 나온 두 갈래 길이 각각 열쇠가 든 상자와 빈 상자로 이어지는 개념 그림
기본 폴더를 가리키면 로그인 정보를 찾고, 빈 폴더를 가리키면 찾지 못하는 관계를 그린 개념 그림입니다.

브라우저 로그인이나 접속이 안 될 때

코덱스 접속이 안 되는 원인이 계정이 아니라 환경일 때도 있습니다. 원격 서버나 화면 없는 환경에서 쓰는 경우, 또는 로그인 뒤 토큰을 돌려받는 localhost 콜백이 네트워크 설정에 막힌 경우가 그렇죠. 이럴 때 공식 문서는 기기 코드 인증(베타)을 먼저 권합니다.

  1. ChatGPT 보안 설정(개인 계정)이나 워크스페이스 권한(관리자)에서 기기 코드 로그인을 켭니다.
  2. 터미널에서 codex login --device-auth를 실행합니다.
  3. 안내된 링크를 브라우저로 열어 로그인하고 일회용 코드를 입력합니다.

기기 코드가 안 되면 대안이 두 가지 있습니다. 첫째는 브라우저가 있는 기기에서 codex login으로 로그인한 뒤 ~/.codex/auth.json이 실제로 있는지 먼저 확인하고, 이 파일을 화면 없는 기기의 ~/.codex/auth.json으로 옮기는 방법입니다. 운영체제가 인증 정보를 이 파일이 아니라 운영체제 자격 증명 저장소(credential store)에 보관한다면 파일이 없어서 이 방법을 쓰지 못할 수 있습니다. 이때는 인증 문서를 보고 파일 기반 저장으로 설정해야 합니다. 이 파일에는 액세스 토큰이 들어 있으니 비밀번호처럼 다루고, 신뢰할 수 있는 기기에만 옮기는 편이 좋습니다. 둘째는 로컬 콜백 서버의 기본 포트 1455를 SSH로 넘겨 브라우저 로그인을 그대로 쓰는 방법입니다.

shell
ssh -L 1455:localhost:1455 user@remote

회사 TLS 프록시나 사설 루트 CA를 쓰는 네트워크라면 로그인 전에 인증서 묶음을 지정합니다. 그래도 원인을 모르겠다면 로그 폴더에 남는 codex-login.log를 확인해 보세요.

shell
export CODEX_CA_CERTIFICATE=/path/to/corporate-root-ca.pem
codex login

자주 하는 실수

  • CODEX_HOME을 프로젝트 폴더 안에 두고 auth.json까지 커밋하는 경우: 이 파일에는 액세스 토큰이 들어 있어 비밀번호처럼 다뤄야 합니다.
  • 다른 터미널에서 지정한 CODEX_HOME을 잊고 로그인이 풀렸다고 생각하는 경우
  • API 키로 로그인해 놓고 Codex cloud를 쓰려는 경우: 클라우드는 ChatGPT 로그인이 필요합니다.
  • 관리 환경에서 forced_login_method와 다른 방식으로 로그인하는 경우: 설정과 맞지 않으면 코덱스가 로그아웃시키고 종료합니다.
  • 워크로드 아이덴티티(workload identity)가 선택된 환경에서 codex login을 반복하는 경우: 이때는 프로세스 환경이 인증을 정하므로 로그인과 로그아웃 명령이 거부됩니다.

자동화 전에 한 번 더 볼 항목

  • codex login status가 Logged in using ChatGPT처럼 로그인 상태를 보여 주는가
  • 지금 터미널의 CODEX_HOME이 평소 쓰던 폴더를 가리키는가
  • 원격·헤드리스 환경이라면 기기 코드 로그인을 켰는가
  • 사내 네트워크라면 인증서 묶음을 지정했는가
  • auth.json이 저장소나 채팅에 올라가지 않았는가

설치와 첫 로그인 과정 전체는 Codex CLI 문서에서 확인할 수 있습니다.

측정 조건과 한계

측정은 darwin arm64 맥 한 대에서 Node.js v22.23.1, git version 2.54.0, codex-cli 0.164.0-alpha.11.1로 했습니다. 작업 폴더 안의 빈 폴더를 CODEX_HOME으로 가리킨 것은 로그인 정보가 없는 상태를 재현한 3단계와 4단계뿐이고, 나머지 단계에서는 따로 지정하지 않았습니다. 새 임시 폴더에서 각 명령을 한 번씩만 실행했기 때문에, 15.5초는 반복해서 잰 대표값이 아닙니다.

실제 로그인은 건드리지 않았고, 오류는 빈 폴더를 CODEX_HOME으로 가리킨 실행에서만 재현했습니다. 그래서 브라우저 로그인, 기기 코드, API 키 로그인은 도움말과 공식 문서로만 확인했고 직접 실행하지 않았습니다. 윈도우나 리눅스, 다른 버전에서는 메시지와 동작이 다를 수 있습니다.

참고 자료