시세 조회 CLI 구현과 토큰 재발급 충돌
종목과 가격, 시장 정보를 프로그램에서 조회하기 위해 Python 클라이언트와 CLI를 만들었습니다. 당시 토스증권 Open API 명세에서 조회 기능을 골라 구현했습니다. 주문과 계좌 변경은 명령으로 노출하지 않았습니다.
구현 중에는 여러 명령이 각각 토큰을 발급받으면서 앞선 토큰이 무효화되는 문제를 만났습니다. 이 글에서는 조회 명령 구성과 인증 처리 변경을 정리합니다.
조회 API 연결
HTTP 호출과 CLI는 Python 표준 라이브러리로 구성했습니다. 당시 받은 OpenAPI 1.2.2 명세를 기준으로 가격과 호가, 체결, 캔들, 종목, 환율, 캘린더 등 조회 범위를 선택했습니다.
사람이 읽는 명령은 가격과 종목 기본정보를 나누고, 여러 응답을 합치는 종합 조회도 뒀습니다.
| 조회 | 표시 내용 |
|---|---|
| 가격 | 현재가와 변동 |
| 종목 | 기본정보와 상태 |
| 종합 조회 | 가격·기본정보·주의 항목 |
| 시장 정보 | 지원하는 캘린더·환율·지표 |
실제 종목의 현재가와 기본정보, 환율, 캔들 응답을 확인했습니다. 반면 개별 종목 수급처럼 당시 지원 범위에 없던 정보는 명령으로 제공하지 않았습니다.
토큰 재발급 충돌
초기에는 명령마다 새 토큰을 발급받았습니다. 그런데 다른 명령이 새 토큰을 받으면 앞서 사용하던 토큰이 무효화되는 동작이 있었습니다. 발급 직후의 토큰도 다음 요청에서는 실패할 수 있었습니다.
유효한 토큰은 캐시에서 재사용하도록 바꾸고, 무효 토큰 오류일 때만 캐시를 버린 뒤 한 번 재발급·재시도하도록 했습니다. 같은 오류가 난다고 계속 새 토큰을 만드는 방식은 피했습니다.
캐시 파일은 제한된 권한으로 저장했고 캐시를 사용하지 않는 옵션도 뒀습니다. 인증값은 로그와 조회 결과에 넣지 않았습니다.
설치와 실제 명령 구성
조회 도구는 tossinvest-open-api 에 공개했습니다. Python 3.10 이상을 대상으로 하며 런타임 HTTP 요청과 CLI에 외부 라이브러리를 추가하지 않았습니다. 아래는 저장소 README의 설치 방식입니다.
git clone https://github.com/ersione/tossinvest-open-api.git
cd tossinvest-open-api
python3 -m venv .venv
.venv/bin/python -m pip install -e .
.venv/bin/tossinvest --help조회에는 별도로 발급받은 API 인증 설정이 필요합니다. 코드와 결과 파일에 인증값을 적지 않고 도구가 읽는 환경 설정으로 준비합니다. 다음은 제공하는 조회 명령의 예시이며 종목 선택이나 매매를 권하는 의미는 아닙니다.
.venv/bin/tossinvest price 005930 AAPL
.venv/bin/tossinvest quote 005930
.venv/bin/tossinvest orderbook 005930
.venv/bin/tossinvest trades AAPL --count 20
.venv/bin/tossinvest candles 005930 --interval 1d --count 30price는 가격 조회이고 quote는 기본정보·가격·캔들·시장 캘린더·가격 제한·주의 항목을 조합합니다. 한 명령의 출력이 하나의 원격 요청과 같지는 않습니다. 여러 요청을 합치는 과정에서는 토큰을 명령 내부에서도 재사용할 필요가 있습니다. 명령별 지원 인자는 저장소의 docs/usage.md와 --help에서 확인할 수 있습니다.
한 번만 재발급하는 경로
현재 client.py는 메모리 토큰과 파일 캐시를 확인한 뒤 새 토큰을 발급합니다. 토큰 유효성에는 만료 직전 요청을 피하기 위한 여유도 두고 있습니다. API가 무효 토큰 오류를 반환할 때는 캐시를 비우고 원래 요청을 한 번만 다시 실행합니다.
메모리·파일의 유효 토큰 → 조회 요청
├─ 정상: 결과 반환
├─ 무효 토큰: 캐시 제거 → 재발급 → 한 번 재요청
└─ 그 외 오류: 호출자에게 오류 반환실제 코드는 HTTP 401과 invalid-token 응답 조건을 확인하고 두 번째 호출에서는 재시도 플래그를 끕니다. 인증과 무관한 모든 4xx·5xx를 새 토큰 발급으로 해결하려는 방식은 아닙니다. 이 분기는 공개 클라이언트 소스 에서 확인할 수 있습니다.
파일 캐시는 프로세스가 달라도 토큰을 재사용하기 위한 장치입니다. 다만 캐시를 둔 것만으로 여러 프로세스의 동시 발급을 완전히 직렬화했다고 볼 수는 없습니다. 당시 재발급 충돌을 줄인 변경과 모든 병렬 실행을 보장하는 분산 인증 설계는 구분해서 설명했습니다.
독립 도구와 서비스 연동 구분
CLI 자체로 실제 데이터를 조회하는 데까지 확인했습니다. Quant Vault 백엔드에 연결하는 방법도 살펴봤지만, 독립 도구 구현과 대시보드 통합은 별도 작업으로 남겼습니다.
가격을 사용하는 쪽에서는 숫자뿐 아니라 기준일과 거래 구간도 함께 읽어야 합니다. 당시 API와 계정에서 확인한 결과이며 현재의 모든 데이터 지원 범위를 뜻하지는 않습니다. 이 도구는 조회를 재사용하기 위한 클라이언트로 범위를 유지했습니다.