업비트 API가 401 no_authorization_ip로 막힌다 — 허용 IP에 넣을 값은 IPv4다

퇴사하고 AI로 회사를 만드는 과정을 공개로 기록하고 있다. 굴리는 것 중 하나가 업비트에서 30만원으로 도는 실거래 매매 봇이고, 맥의 예약 실행 목록에 걸어 자는 동안 돌게 해뒀다. 이 연재의 첫 이틀은 그게 얼마를 벌었는지가 아니라 어떻게 조용히 멈춰 있었는지의 기록이다.

무인으로 도는 것은 실패해도 죽지 않는다

9월 19일 낮 12시 8분, 자리를 비운 사이 뭘 했는지 브리핑을 받았다. 프로세스는 멀쩡히 떠 있었고, 거기까지만 보고 넘길 뻔했다. 에러 로그를 따로 열고 나서야 주문을 넣는 호출이 401로 떨어지는 걸 봤다. 아예 죽으면 알아차리는데, 주문이 전부 막혀도 프로세스는 살아 있어서 알아차릴 창구가 없었다.

로그에서 no_authorization_ip를 찾으니 401이 처음 난 줄이 거기 있었다. 업비트 키는 요청이 어느 IP에서 오는지를 보고, 등록해둔 허용 목록에 이 맥의 주소가 없으면 막는다. 코드는 안 건드리고 설정 화면에 주소 한 줄을 넣는 일이었다.

살아 있는지 재는 법도 그날 바꿨다. 프로세스 목록 대신 에러 로그의 바이트 수를 재고, 25초 쉬고 다시 잰다. 값이 같으면 그동안 새 실패가 없었다는 뜻이다. 마지막 줄만 꺼내 보면 그게 어제 것인지 방금 것인지 구별이 안 된다.

등록은 하루를 못 갔다

다음 날 아침 7시 30분부터 401이 다시 찍혔다. 5분마다 계좌를 조회해 통과하면 봇을 스스로 올리는 감시 스크립트가 있어서 복구는 자동으로 됐는데, 알림이 없었다. 막혀 있다는 사실을 8시간 45분 동안 몰랐다. 그동안 401 카운트는 969까지 올라갔다.

회선의 공인 IP가 바뀐 줄 알았다. 이 회선은 실제로 주소가 바뀐다. 그런데 401 본문을 처음으로 끝까지 읽었더니 업비트가 본 출발지가 문장으로 적혀 있었고, 지금 이 맥이 쓰는 주소와 같았다. 추측이 아니라 막은 쪽이 보낸 답이다.

가설을 자르는 동안 다른 게 걸렸다. 키를 등록할 때 “허용 IP에 넣을 값”이라며 찍어주던 주소를 스크립트는 외부 서비스에 물어서 가져왔는데, 이 맥에서 그게 주는 건 콜론이 든 IPv6였다. 등록하라고 찍어주던 값을 업비트 등록 폼이 받지도 못했다. 문서가 허용 IP에 대해 적는 건 셋뿐이다. 공인 IP만, IPv4 형식만, 유동 IP는 권장하지 않음. 쓸 수 있는 값과 못 쓰는 값을 가른 건 같은 명령에 -4를 붙였느냐였다.

원인은 여기서 끊긴다

등록이 왜 풀렸는지는 끝내 못 밝혔다. 키 조회 API는 access_key와 만료일만 돌려주고 허용 IP 목록은 안 주고, 공식 문서에도 허용 IP가 자동으로 풀린다는 서술이 없다. 그래서 원인 대신 감지를 고쳤다. 막힘으로 바뀔 때 한 번, 그 뒤 6시간마다 한 번, 복구될 때 한 번 텔레그램이 나간다. 그게 실제로 도착하는지는 아직 확인하지 않았다.

이틀 동안 잃은 돈은 없다. 누적 손익은 217원이고, 한 번에 1만원씩 넣는 설정이라 401이 얼마나 갔든 잃을 게 없었다. 대신 장부 원화 260,436원과 실잔고 270,403원의 차이 9,967원은 아직 설명하지 못했다.

2편 · detect-bot-auth-failure 시작

이 연재의 글 2편

← 연재 전체