30초 요약
1. Codex는 ~/.codex/sessions의 세션 파일에 리셋 시각(resets_at)과 사용률을 매 요청마다 기록합니다.
2. 창은 첫 요청을 보낸 시각에 열립니다. 08:44에 시작하면 13:44에 닫힙니다. 정각 기준이 아닙니다.
3. 한번 열린 창의 리셋 시각은 초 단위까지 고정입니다. 그 안에서 아무리 써도 뒤로 밀리지 않습니다.
4. 아직 창이 안 열린 상태에서는 resets_at이 ‘지금 + 5시간’으로 계속 따라옵니다. 이걸 보고 “롤링이네”로 오해하기 쉽습니다.
정리하면 “몇 시에 풀리나”의 답은 내가 오늘 처음 코덱스에 말을 건 시각 + 5시간입니다. 남이 알려줄 수 있는 값이 아니고, 내 로그에만 있는 값입니다.
로그 어디에 적혀 있나
Codex CLI는 대화 하나당 rollout-<날짜>-<id>.jsonl 파일을 남깁니다. 경로는 ~/.codex/sessions/연/월/일/입니다. 이 파일 안에 token_count 이벤트가 있고, 거기 rate_limits가 통째로 붙어 옵니다.

레코드 한 건은 이런 모양입니다. 값은 제 것이라 지웠지만 구조는 그대로입니다.
"rate_limits": { "limit_id": "codex", "primary": { "used_percent": 53.0, "window_minutes": 10080, "resets_at": 1789957542 }, "secondary": null, "credits": { "has_credits": false, "balance": "0" }, "plan_type": "..." }
| 필드 | 뜻 |
|---|---|
| window_minutes | 창 길이. 300이면 5시간, 10080이면 7일 |
| used_percent | 그 창에서 지금까지 쓴 비율 |
| resets_at | 유닉스 타임스탬프로 찍힌 리셋 시각 |
| primary / secondary | 두 개의 창을 동시에 추적합니다. 한쪽이 null일 수 있습니다 |
| plan_type | 플랜 식별자. 같은 계정도 시점에 따라 값이 바뀝니다 |
창이 열리는 순간이 보입니다
2026년 9월 10일 하루치를 시간순으로 늘어놓으면 구조가 한눈에 들어옵니다. 시각은 모두 한국 시간입니다.
| 요청 시각 | 사용률 | 리셋 예정 | 남은 시간 |
|---|---|---|---|
| 08:44:12 | 0% | 13:44:02 | 299.8분 |
| 08:47:56 | 25% | 13:44:11 | 296.2분 |
| 08:51:19 | 49% | 13:44:11 | 292.9분 |
| 08:56:05 | 54% | 13:44:11 | 288.1분 |
| 09:03:17 | 69% | 13:44:11 | 280.9분 |
| 09:07:39 | 84% | 13:44:11 | 276.5분 |
| — 13:44 리셋 통과 — | |||
| 14:12:38 | 0% | 19:12:23 | 299.7분 |
| 15:40:45 | 16% | 19:12:30 | 211.7분 |
| 16:07:46 | 44% | 19:12:29 | 184.7분 |
| 16:19:36 | 76% | 19:12:30 | 172.9분 |
읽는 순서는 이렇습니다.
첫째, 08:44:12에 사용률이 0%입니다. 이때 리셋 예정은 13:44:02, 남은 시간은 299.8분. 거의 정확히 5시간입니다. 즉 아직 창이 열리지 않은 상태이고, 서버는 “지금 시작하면 5시간 뒤”를 알려주고 있습니다.
둘째, 다음 요청부터 리셋 시각이 13:44:11로 못 박힙니다. 사용률이 25 → 49 → 54 → 69 → 84%로 오르는 동안 이 값은 초 단위까지 그대로입니다. 창이 열렸고, 닫히는 시각이 확정된 것입니다.
셋째, 08:44에 열린 창은 13:44에 닫힙니다. 그리고 그 뒤 첫 요청인 14:12:38에서 사용률이 다시 0%가 되고, 새 리셋 시각 19:12가 잡힙니다. 14:12 + 5시간 = 19:12. 정확히 맞습니다.
코덱스의 5시간 창은 정각이나 자정 기준이 아닙니다. 오전 8시 44분에 첫 요청을 보내면 그날 오후 1시 44분에 리셋됩니다. 커뮤니티에서 도는 “몇 시에 풀린다”는 정보는 그 사람의 시작 시각일 뿐 내 계정과는 무관합니다.
한번 열리면 요청해도 안 밀립니다
가장 많이 받는 오해가 “계속 쓰면 리셋이 계속 미뤄지는 것 아니냐”입니다. 위 표가 그 답입니다. 08:47부터 09:07까지 다섯 번 요청하는 동안 리셋 시각은 13:44:11에서 1초도 움직이지 않았습니다.
다만 자세히 보면 13:44:02 → 13:44:11처럼 몇 초짜리 차이가 있습니다. 창이 열리지 않은 상태(0%)의 값과 실제로 열린 뒤의 값이 다르기 때문이고, 열린 뒤로는 13:44:11로 완전히 동일합니다. 두 번째 창도 19:12:29와 19:12:30 사이를 오가는데 이건 서버·클라이언트 시계의 1초 오차 수준입니다.
그래서 실무적으로는 이렇게 행동하면 됩니다.
| 상황 | 행동 | 이유 |
|---|---|---|
| 한도에 걸림 | 로그에서 resets_at 확인 | 정확한 시각이 이미 적혀 있습니다 |
| 재시도 반복 | 의미 없음 | 리셋 시각은 고정이라 미뤄지지도, 당겨지지도 않습니다 |
| 오늘 길게 작업할 예정 | 첫 요청 시각을 의식 | 그 시각 + 5시간이 그날의 첫 번째 마감입니다 |
| 사용률이 80%를 넘음 | 남은 분을 계산 | 제 기록에서는 23분 만에 0 → 84%도 나왔습니다 |
마지막 줄을 강조하고 싶습니다. 08:44에 0%였던 게 09:07에 84%였습니다. 23분입니다. 5시간 창이라고 해서 5시간 동안 균등하게 쓸 수 있다는 뜻이 전혀 아닙니다. 창은 시간 단위이고 한도는 사용량 단위라, 대부분의 경우 시간보다 사용량이 먼저 바닥납니다.
주간 창도 같은 구조입니다
window_minutes가 10080인 레코드, 즉 7일 창도 같은 방식으로 동작합니다. 전환점만 추리면 이렇습니다.
| 요청 시각(KST) | 사용률 | 리셋 예정 | 남은 기간 |
|---|---|---|---|
| 08-25 08:47:11 | 0% | 09-01(화) 08:47:01 | 7.00일 |
| 08-26 08:39:40 | 0% | 09-02(수) 08:39:32 | 7.00일 |
| 09-02 10:03:14 | 35% | 09-07(월) 12:23:51 | 5.10일 |
| 09-14 08:48:55 | 0% | 09-21(월) 08:48:43 | 7.00일 |
0%인 줄은 전부 정확히 7.00일입니다. 창이 안 열린 상태라 “지금 + 7일”을 그대로 보여주는 것입니다. 반면 사용률 35%인 줄만 5.10일로 짧습니다. 역산하면 그 주간 창은 8월 31일 12시 23분에 열렸다는 뜻이 됩니다.
주간 창도 요일이 고정돼 있지 않다는 점이 중요합니다. 위 표에서 리셋 요일이 화요일, 수요일, 월요일로 제각각입니다. 주간 한도는 ‘매주 월요일’이 아니라 ‘그 주에 처음 쓴 시각’부터 7일입니다.
제 데이터 전체에서 창이 안 열린 상태의 남은 시간은 5시간 창이 중앙값 299.8분, 7일 창이 10,000분대로 거의 만기값이었습니다. 이 상태만 보고 resets_at을 기록해 두면 “리셋이 계속 미뤄진다”는 잘못된 결론에 도달합니다. 사용률이 0보다 클 때의 값만 진짜 마감 시각입니다.
클로드와는 방식이 다릅니다
같은 날 클로드 쪽 기록도 꺼내 봤습니다. Claude Code는 한도에 걸린 429 응답을 ~/.claude/projects의 세션 로그에 남기고, 거기 resetsAt이 들어 있습니다.

| Codex CLI | Claude Code | |
|---|---|---|
| 기록 위치 | ~/.codex/sessions | ~/.claude/projects |
| 기록 시점 | 매 요청마다 (사용률 포함) | 한도에 걸렸을 때 (429 응답) |
| 리셋 시각 정밀도 | 초 단위 (13:44:11, 19:12:29) | 30분 경계 (13:30:00, 14:00:00) |
| 미리 알 수 있나 | 예. 사용률과 남은 시간이 상시 기록 | 걸리기 전에는 로그에 안 남습니다 |
| 창 길이 | 300분 / 10080분 | 5시간 / 7일 |
가장 큰 차이는 “미리 볼 수 있느냐”입니다. 코덱스는 한도에 걸리지 않아도 매 요청마다 지금 몇 %인지가 파일에 쌓입니다. 사용량 추이를 스스로 그릴 수 있다는 뜻입니다. 클로드는 걸려야 남습니다. 대신 클로드는 /usage 화면에서 같은 정보를 보여줍니다.
리셋 시각의 성격도 다릅니다. 코덱스는 내가 시작한 시각을 초 단위로 그대로 반영하고, 클로드는 30분 경계로 정돈합니다. 클로드 기록 세 건 모두 1800초의 배수였고, 같은 날 13분 간격으로 두 번 걸렸을 때도 리셋 시각은 13:30:00으로 동일했습니다.
단서는 달아 둡니다. 클로드 쪽은 제 계정 3건이 전부라 항상 30분 경계라고 단정하기엔 표본이 작습니다. 코덱스 쪽은 8,905건이라 패턴이 확실합니다.
내 로그로 직접 확인하기
남의 수치를 믿을 필요가 없습니다. 아래 한 덩어리를 붙여 넣으면 자기 계정의 실제 창 이력이 나옵니다.
cd ~/.codex/sessions
grep -rho '"rate_limits".*' . | tail -1 ← 최근 한 건 원본 확인
시각으로 바꾸려면 resets_at 숫자를 date -r <숫자>(macOS) 또는 date -d @<숫자>(Linux)에 넣으면 됩니다.
판단 순서는 이렇게 하면 됩니다.
| 단계 | 확인할 것 |
|---|---|
| 1 | used_percent가 0보다 큰지. 0이면 그 resets_at은 아직 의미 없는 값입니다 |
| 2 | window_minutes가 300인지 10080인지. 5시간 창과 7일 창을 섞어 보면 안 됩니다 |
| 3 | resets_at을 시각으로 변환. 그게 확정된 마감입니다 |
| 4 | used_percent와 남은 시간을 함께 보기. 대개 시간보다 사용량이 먼저 끝납니다 |
자주 묻는 질문
코덱스 한도는 몇 시에 리셋되나요?
고정된 시각이 없습니다. 그 창의 첫 요청 시각 + 5시간입니다. 제 기록에서는 08:44 시작 → 13:44 리셋, 14:12 시작 → 19:12 리셋이었습니다. 자기 로그의 resets_at을 보는 게 유일하게 정확한 방법입니다.
계속 쓰면 리셋이 미뤄지나요?
아닙니다. 창이 열린 뒤에는 초 단위까지 고정입니다. 사용률이 0에서 84%까지 오르는 동안 리셋 시각은 13:44:11 그대로였습니다.
제 로그에는 secondary가 null입니다.
정상입니다. 제 데이터에도 두 창이 동시에 채워진 구간과 한쪽만 있는 구간이 섞여 있었습니다. 플랜과 시점에 따라 달라집니다.
5시간 창인데 왜 30분 만에 다 썼나요?
창 길이와 한도 크기는 별개입니다. 창은 “언제 초기화되는가”이고 한도는 “얼마나 쓸 수 있는가”입니다. 제 기록에서도 23분 만에 84%에 도달한 구간이 있습니다.
주간 한도는 월요일에 풀리나요?
아닙니다. 제 로그의 리셋 요일은 화·수·월로 제각각이었습니다. 그 주에 처음 쓴 시각부터 7일입니다.
확인한 자료 2026년 9월 15일, 로컬에 설치된 Codex CLI 0.148.0의 세션 로그(~/.codex/sessions)에서 rate_limits가 포함된 레코드 8,905건을 추출해 window_minutes·used_percent·resets_at의 관계를 직접 분석했습니다. 본문의 2026년 9월 10일 5시간 창 추적표와 주간 창 전환표는 모두 제 계정의 실제 기록이며, 시각은 한국 시간으로 변환했습니다. 비교용 Claude Code 기록은 ~/.claude/projects의 429 응답 3건에서 resetsAt·rateLimitType를 뽑은 것입니다. 한도의 절대 크기와 플랜별 배정량은 로그에 비율로만 남아 다루지 않았습니다. 리셋 창의 동작에 관한 OpenAI의 공개 문서 설명은 확인하지 못했고, 이 글의 결론은 전부 제 로컬 기록에 근거합니다.
Codex CLI 공식 문서 ↗ · Claude Code 한도 오류 레퍼런스 ↗ · openai/codex 저장소 ↗