codex로 코딩하다 보면 ■ Your access token could not be refreshed because your refresh token was revoked. Please log out and sign in again. 라는 에러가 뜰때가 있다. 요새 코딩하면서 나오는 에러는 codex가 다 고쳐 줘서 검색할 필요가 없는데 얘는 왜 이런 에러남? 하고 물어보면 또 ■ Your access token could not be refreshed because your refresh token was revoked. Please log out and sign in again.이러고 답을 안해줘서 귀찮음을 무릅쓰고 검색을 해야한다.

오류가 무슨 뜻인가?
간단히 말하면 로그인 상태를 갱신하는 데 실패했다는 뜻이다.
여기서 나오는 토큰은 두 종류다.
- 액세스 토큰: 서비스에 접근할 때 사용하는 인증 정보
- 리프레시 토큰: 액세스 토큰을 새로 발급받을 때 사용하는 인증 정보
refresh token was already used는 이미 사용된 갱신 토큰을 다시 사용하려다가 실패했다는 의미다.
비슷한 오류로 다음과 같은 문구도 있다.
Your access token could not be refreshed because your refresh token was revoked. Please log out and sign in again.
여기서 revoked는 갱신 토큰이 무효화됐다는 뜻이다. 로그인 갱신이 안 된다는 점은 같지만, already used와 정확히 같은 오류는 아니다. 또한 이 문구의 토큰은 로그인 인증용이다. 모델에 질문할 때 소모하는 사용량 토큰과는 다른 개념이다.
해결법
일단은 컴퓨터에서 너무 많은 codex창을 켜놔서 그런다. 하나만 남기고 다 꺼보자. 그리고 chat gpt도 다운받아서 로컬에서 실행하는 경우도 일단은 창을 닫아주자. codex랑 chat gpt는 토큰과 계정을 공유하기 때문에 그렇다.
그러면 보통해결된다. 그래도 안되면 로그아웃 로그인을 해보자.
- Codex/ChatGPT에서 로그아웃
- 브라우저를 완전히 종료
- 다시 열어서 로그인
- 계속 뜨면 해당 사이트의
chatgpt.com쿠키·사이트 데이터만 삭제 후 재로그인
CLI에서 나온 오류면 터미널에서 codex logout 후 codex login으로 다시 인증하면 된다.
그래도 안된다면 이제 해결법이 길어지는데 이런 상황에서 확인할 부분과 인증 정보를 초기화하는 방법을 정리해 보려고 한다. Windows와 Cursor를 기준으로 하고, WSL을 사용하는 경우도 같이 다룬다. 참고로 아래 내용은 참고 글의 복구 사례를 정리한 것이다. 모든 환경에서 같은 원인으로 발생하는 오류는 아니므로, 처음부터 모든 폴더를 초기화할 필요는 없다.
왜 재로그인해도 반복될까?
여러 실행 환경에 남아 있던 인증 정보와 동시 실행을 원인으로 의심된다. 확인할 상황은 다음과 같다.
- Cursor 창을 여러 개 열어 둔 경우
- 여러 프로젝트에서 Codex를 실행하고 있는 경우
- Windows와 WSL 양쪽에서 Codex를 사용한 경우
- 창을 닫았는데 백그라운드 프로세스가 남아 있는 경우
다만 Windows와 WSL에 인증 파일이 각각 있다고 해서 무조건 충돌하는 것은 아니다. 여러 Cursor 프로세스가 보이는 것 자체도 충돌의 증거는 아니다.
핵심은 문제를 확인하는 동안 실행 환경을 하나로 줄이고, 기존 인증 상태가 계속 재사용되는지 확인하는 것이다.
3. 시작하기 전에 주의할 점
아래 절차는 파일을 삭제하는 대신 이름을 바꿔 보관하는 방식이다. 예를 들어 auth.json을 다음처럼 바꾸는 식이다.
auth.json.bak_20260912_120000
파일은 남겨 두되 기존 위치에서는 사용하지 않도록 만드는 것이다. 다만 백업이라고 해서 영향이 없는 것은 아니다.
인증 파일을 옮기면 다시 로그인해야 하고, 세션 폴더를 옮기면 기존 대화가 바로 보이지 않을 수 있다. Cursor 저장소를 초기화하면 다른 확장 기능의 상태에도 영향을 줄 수 있다. 따라서 작업 중인 파일을 먼저 저장하고, 인증 정보 정리부터 시도하자. 해결되면 뒤의 추가 초기화는 하지 않아도 된다.
4. Cursor를 완전히 종료하기
먼저 Cursor 창을 닫는다.
이후 Windows의 별도 PowerShell 창을 열어 남아 있는 프로세스를 확인한다. Cursor 내부 터미널에서 실행하면 Cursor 종료와 함께 터미널도 닫힐 수 있으니 별도 창이 편하다.
Get-Process cursor -ErrorAction SilentlyContinue
아무것도 나오지 않으면 실행 중인 Cursor 프로세스가 없는 상태다. 목록이 남아 있고, 저장할 작업도 없는 것을 확인했다면 다음 명령으로 종료할 수 있다.
Get-Process cursor -ErrorAction SilentlyContinue | Stop-Process -Force
강제 종료 명령이므로 저장하지 않은 작업이 남아 있지 않은지 꼭 확인하자. 다시 확인한다.
Get-Process cursor -ErrorAction SilentlyContinue
아무것도 출력되지 않으면 다음 단계로 넘어가면 된다.
5. Windows의 인증 파일 백업하기
참고 글에서 확인한 Windows 인증 파일 위치는 다음과 같다.
C:\Users\<사용자 이름>\.codex\auth.json
아래 명령은 이 파일이 있으면 날짜와 시간을 붙여 이름을 변경한다.
PowerShell에서 실행하면 된다.
$codexDir = Join-Path $env:USERPROFILE ".codex"
$authFile = Join-Path $codexDir "auth.json"
if (Test-Path -LiteralPath $authFile) {
$backupName = "auth.json.bak_" + (Get-Date -Format "yyyyMMdd_HHmmss")
Rename-Item -LiteralPath $authFile -NewName $backupName
"Backed up: $backupName"
} else {
"auth.json not found: $authFile"
}
정상적으로 처리됐는지 확인하려면 다음 명령을 실행한다.
Get-ChildItem "$env:USERPROFILE\.codex" -Force
auth.json.bak_날짜_시간 형태의 파일이 보이면 된다.
파일이 없다는 메시지가 나왔다고 해서 직접 만들 필요는 없다. 해당 경로에 파일이 없다는 의미다. 그리고 auth.json이나 백업 파일의 내용은 다른 사람에게 공유하면 안 된다. 인증 정보가 들어 있을 수 있기 때문이다.
6. WSL을 사용한다면 그쪽도 확인하기
WSL에서 Codex를 사용한 적이 없다면 이 단계는 건너뛰면 된다. Windows 쪽을 정리했더라도 WSL은 별도의 환경이므로, WSL에서 사용하던 인증 상태는 따로 확인해야 한다.
Ubuntu 같은 WSL 터미널을 열고 다음 명령을 실행한다.
ls -la ~/.codex
여기에 auth.json이 있고 WSL 쪽 인증도 초기화하려면, WSL에서 실행 중인 Codex를 종료한 뒤 다음 명령으로 백업한다.
if [ -f ~/.codex/auth.json ]; then
mv ~/.codex/auth.json ~/.codex/auth.json.bak_$(date +%Y%m%d_%H%M%S)
fi
결과를 확인한다.
ls -la ~/.codex
이 단계는 WSL 인증 파일이 반드시 문제라는 뜻이 아니다. 실제로 사용하는 환경의 인증 상태를 따로 정리하는 과정이다.
7. 창 하나만 열고 다시 로그인하기
인증 파일 정리가 끝났으면 Cursor 창 하나만 연다.
프로젝트 폴더도 하나만 열고, Codex에 다시 로그인한다. 로그인과 간단한 대화가 정상적으로 되는지 확인할 때까지 다른 창이나 WSL 쪽 Codex는 실행하지 않는 편이 문제를 구분하기 쉽다. 여기서 정상적으로 작동하면 일단 끝이다. 아래의 세션 폴더나 Cursor 저장소 초기화까지 진행할 필요는 없다.
8. 추가 조치: Codex 세션 폴더 백업
참고 글에서는 인증 파일 외에 sessions 폴더도 옮겼다.
다만 이 폴더까지 옮겨야 인증 오류가 해결된다고 단정할 수는 없다. 기존 대화 기록 접근에도 영향을 줄 수 있으므로 추가 조치로만 생각하자. 진행하려면 먼저 Cursor와 관련 Codex 실행을 종료한다.
Windows PowerShell에서는 다음 명령을 사용한다.
$sessionDir = Join-Path $env:USERPROFILE ".codex\sessions"
if (Test-Path -LiteralPath $sessionDir) {
$backupName = "sessions.bak_" + (Get-Date -Format "yyyyMMdd_HHmmss")
Rename-Item -LiteralPath $sessionDir -NewName $backupName
"Backed up: $backupName"
} else {
"Not found: $sessionDir"
}
WSL 쪽 세션 폴더까지 백업하려는 경우에는 WSL 터미널에서 실행한다.
if [ -d ~/.codex/sessions ]; then
mv ~/.codex/sessions ~/.codex/sessions.bak_$(date +%Y%m%d_%H%M%S)
fi
삭제하는 것은 아니지만, 기존 이름의 폴더가 사라지므로 이전 대화가 안 보일 수 있다는 점은 기억하자.
9. 마지막 조치: Cursor 저장소 백업
참고 글에서는 Cursor의 다음 저장소도 백업했다.
%APPDATA%\Cursor\User\workspaceStorage
%APPDATA%\Cursor\User\globalStorage
주의할 점은 이 폴더들이 Codex만을 위한 저장소는 아니라는 것이다.
다른 확장 기능이나 작업 공간 상태에도 영향을 줄 수 있으므로, 처음부터 실행하기보다는 앞 단계로 해결되지 않았을 때 검토하는 편이 낫다.
진행한다면 Cursor를 완전히 종료한 상태에서 아래 명령을 실행한다.
$cursorUserDir = Join-Path $env:APPDATA "Cursor\User"
$stamp = Get-Date -Format "yyyyMMdd_HHmmss"
$storageNames = @("workspaceStorage", "globalStorage")
foreach ($storageName in $storageNames) {
$storagePath = Join-Path $cursorUserDir $storageName
if (Test-Path -LiteralPath $storagePath) {
$backupName = $storageName + ".bak_" + $stamp
Rename-Item -LiteralPath $storagePath -NewName $backupName
"Backed up: $storagePath"
} else {
"Not found: $storagePath"
}
}
작업이 끝나면 다시 Cursor 창 하나만 열어 로그인하고 확인한다. 이 명령은 Cursor 경로 기준이다. VS Code를 사용하고 있다면 그대로 적용하는 명령이 아니라는 점도 주의하자.
10. PowerShell에서 ls -la가 안 되는 이유
명령어를 따라 하다가 자주 헷갈리는 부분이다.
다음은 Linux 계열 터미널에서 사용하는 명령이다.
ls -la ~/.codex
PowerShell에서는 다음과 같이 확인하면 된다.
Get-ChildItem "$env:USERPROFILE\.codex" -Force
PowerShell과 WSL 터미널은 서로 다른 환경이다. 명령어만 보지 말고 어느 터미널에서 실행하는지도 확인하자.
11. Join-Path 오류나 따옴표 오류가 뜬다면
PowerShell에서 경로 여러 개를 한꺼번에 만들다가 매개변수 오류가 난다면, 경로를 하나씩 만든 뒤 배열로 묶으면 확인하기 편하다.
$target1 = Join-Path $env:APPDATA "Cursor\User\globalStorage\openai.chatgpt"
$target2 = Join-Path $env:APPDATA "Cursor\User\globalStorage"
$target3 = Join-Path $env:APPDATA "Cursor\User\workspaceStorage"
$targets = @($target1, $target2, $target3)
foreach ($target in $targets) {
"$target : $(Test-Path -LiteralPath $target)"
}
위 명령은 경로가 있는지만 확인한다. 파일을 변경하지는 않는다.
또한 PowerShell에서 wsl bash -lc '...'처럼 여러 셸을 거쳐 실행하면 따옴표 처리 때문에 문법 오류가 날 수 있다.
이럴 때는 복잡하게 연결하지 말고 WSL 터미널을 직접 열어 Linux 명령을 실행하는 편이 간단하다.
12. 계속 안 되면 어떤 정보를 남겨야 할까?
오류 문구만 적기보다는 실행 환경과 이미 시도한 작업을 함께 정리하면 원인을 좁히기 쉽다.
예를 들어 다음처럼 적으면 된다.
Codex에서 로그인 갱신 오류가 반복된다.
[오류 메시지]
여기에 오류 문구 입력
[사용 환경]
- 운영체제:
- 사용 프로그램: Cursor / VS Code / Codex CLI
- WSL 사용 여부:
- 여러 창이나 프로젝트에서 동시 실행했는지:
[시도한 작업]
- 로그아웃 후 재로그인:
- 관련 프로그램 완전 종료:
- Windows 인증 파일 백업:
- WSL 인증 파일 백업:
- 세션 폴더 백업:
- Cursor 저장소 백업:
[실행 결과]
여기에 명령 실행 결과나 오류 입력
파일 삭제보다는 백업을 우선하고,
다음으로 확인할 항목을 순서대로 안내해 줘.
사용자 이름이나 개인 경로는 필요하면 가리고, 인증 파일 내용이나 토큰 값은 붙여 넣지 말자.
정리
이 오류는 로그인 상태를 갱신하지 못해서 발생하는 문제다. 남아 있는 프로세스를 종료하고, Windows와 WSL의 인증 정보 및 관련 저장소를 백업한 뒤 다시 로그인하는 방식으로 복구했다. 다만 모든 폴더를 한 번에 초기화할 필요는 없다. 우선 실행 중인 환경을 정리하고 인증 정보를 확인한 뒤, 다시 로그인해 보자. 해결되지 않을 때만 세션이나 편집기 저장소 같은 범위가 큰 조치를 검토하면 된다. 문제를 확인하는 동안에는 창 하나, 실행 환경 하나로 줄이는 것이 편하다. 그렇다고 여러 창이나 Windows·WSL 병행 사용이 항상 오류를 일으킨다는 뜻은 아니다.
출처 : 내경험과 Cursor의 Codex 갱신 토큰 오류 복구 사례

Leave a Reply
Your email is safe with us.