자동화 slecs

codex OAuth 토큰 만료를 자동 감지해 재로그인하는 cron 자동화

목차

codex OAuth 토큰 만료를 자동으로 감지하고 재로그인하는 cron 작업과 스크립트를 추가했다. 개발 환경의 인증 문제가 반복되지 않도록 하는 작업이었다.

왜 이런 자동화가 필요했나

OAuth 토큰은 보안상 일정 시간 후 만료된다. 개발 환경도 마찬가지인데, 토큰이 만료되면 팀원들이 일일이 재로그인해야 한다. 특히 CI/CD 파이프라인이나 자동화 스크립트에서 codex를 사용할 때, 예고 없이 요청이 실패하기 시작한다. "왜 어제까지 잘 되던 게 오늘 안 돼?" 하는 문의가 들어오고, 결국 누군가는 수동으로 재로그인해야 한다.

이런 상황을 반복하다 보니, 아예 토큰 만료를 감시하고 자동으로 갱신하는 게 낫겠다고 판단했다. 팀원들의 개발 흐름을 끊지 않으면서도, 인증 문제로 인한 방해를 없애려고.

구현 접근

두 개의 스크립트로 구성했다:

파일 역할
codex-auth-check.sh OAuth 토큰 만료 여부를 주기적으로 감시하는 cron 작업
codex-relogin.sh 만료 감지 시 자동으로 재로그인하는 실행 스크립트

cron으로 일정 간격(보통 매일 또는 특정 시간)에 체크하고, 만료 감지되면 재로그인을 수행하는 방식이다. 이렇게 하면:

  • 개발팀이 의식적으로 로그인을 신경 쓰지 않음
  • 자동화 작업(배포, 테스트 등)이 중단되지 않음
  • 토큰 갱신 로그를 남길 수 있어 모니터링 가능

구현할 때 고민한 지점

macOS 환경에서의 인증 처리
macOS는 보안이 엄격해서, 단순히 환경변수나 설정 파일만으로는 인증이 안 되는 경우가 많다. Keychain, 세션 토큰, 권한 문제 등을 고려해야 했다. 스크립트가 충분한 권한으로 실행되도록 하고, 인증 정보를 안전하게 저장하도록 신경 썼다.

멱등성 (idempotent)
cron이 여러 번 실행되어도, 이미 토큰이 유효하면 굳이 재로그인하지 않아야 한다. 불필요한 요청이나 상태 변화를 피하려고. 따라서 auth-check 스크립트는 현재 토큰의 유효시간을 먼저 확인하고, 정말 필요한 경우에만 relogin 스크립트를 실행하도록 했다.

로그 및 모니터링
자동화 스크립트가 조용히 실행되다 보면 문제가 생겼을 때 추적이 어렵다. 토큰 갱신 시도, 성공/실패 여부, 타임스탬프 등을 로그 파일에 남겨두면, 나중에 "언제부터 문제가 있었나?" 같은 질문에 빠르게 답할 수 있다.

일반적인 토큰 자동 갱신 패턴

이런 류의 자동화는 생각보다 자주 마주친다:

  • Refresh Token 기반: 만료 토큰 대신 refresh token을 이용해 새 토큰 획득. OAuth 표준이 많이 이렇게 구현됨
  • API 응답 기반: API 요청이 401 Unauthorized를 반환하면 그때 재로그인. 코드가 단순하지만, 실제로 요청이 실패해야 대응함
  • 시간 기반: 토큰 발급 시간 + TTL을 기반으로 만료 예상 시간을 계산하고, 그 전에 선제적으로 갱신. 부분 선제적 갱신은 API 부하도 줄일 수 있음
  • 주기적 감시 (이번 경우): 독립적인 cron 작업이 정기적으로 토큰 상태를 체크하고 필요시 갱신. 코드가 복잡할 수 있지만, 중앙 집중식 모니터링에 유리

우리가 선택한 "주기적 감시" 방식은 개발팀이나 운영팀이 직접 제어할 수 있고, 로그 추적이 명확하다는 장점이 있다.

회고

처음엔 "개발팀이 이 정도는 스스로 대응하겠지"라고 생각했는데, 실제로 이걸 자동화하자 제안했을 때 반응이 긍정적이었다. 작은 번거로움도 누적되면 팀 생산성에 영향을 준다는 걸 다시 깨달았다. 특히 인증처럼 자주 문제가 되지 않지만, 발생하면 원인 파악이 어려운 분야는 아예 자동화로 없애버리는 게 나을 수 있다.

비슷하게, 자동화할 수 있는 운영 작업들(로그 정리, 캐시 갱신, 설정 동기화 등)을 주기적으로 리뷰하면서, "이게 정말 수동으로 해야 하나?" 하는 질문을 던져야겠다는 생각도 들었다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.