로그인을 없앴다 — 시그날리오 웹은 읽기 전용 공개 대시보드가 됐다
로그인해야만 할 수 있는 일이 "키움 API 키 관리" 하나뿐이었다. 1년에 두세 번 쓰는 문에 비밀번호와 TOTP와 백업코드를 달아두고 있었다.
로그인을 통째로 들어냈다. 시그날리오 웹에는 이제 쓰기 엔드포인트가 하나도 없다.
"로그인하면 뭘 할 수 있는데?"
이 질문에서 시작했다. 답하려고 코드를 세어봤더니, 로그인해야만 할 수 있는 일이 "키움 API 키 관리" 하나뿐이었다. 나머지 메뉴는 전부 백엔드 미구현이었다.
1년에 두세 번 쓰는 문에 비밀번호 + TOTP + 백업코드를 달아두고 있었던 셈이다.
그래서 판단 기준을 하나로 좁혔다. "장중에 휴대폰으로 긴급 청산 버튼을 누를 일이 있는가." 없었다. 완전 자동화를 목표로 하는 시스템에서 사람이 개입하는 순간은 설계에 없다.
확정한 구조
| 웹 (누구나, 로그인 없음) | 서버 CLI (SSH, root) |
|---|---|
| 잔고·평가손익·보유종목 (실제 원화) | 키움 API 키 등록·삭제·연결테스트 |
| 시그널·유니버스·매매기록 | 주문·긴급청산 |
| 전략 정의 읽기 | 전략 파라미터 변경 |
읽는 것은 전부 공개, 조작은 전부 서버 안. 웹과 CLI 사이에 겹치는 면이 없다.
제거한 것
api/v1/auth/5개,api/v1/broker/5개 — 남은 API는public/summary.php하나pages/login.php,pages/register.php,core/auth.php,core/totp.php- app.js 693 → 285줄, api.js 143 → 73줄(GET만), 사이드바 메뉴 8 → 5
지우지 않고 archive/removed-20260919/로 옮겼다. 이 프로젝트는 git을 안 쓰기 때문에 복구 경로를 손으로 남겨야 한다.
새로 만든 것
bin/broker.php — 계좌 관리 CLI. list / add / test / balance / delete.
앱 키와 시크릿은 인자가 아니라 프롬프트로 받는다(에코 끔). 셸 히스토리와 ps 출력에 시크릿이 남지 않게 하려는 것이다. 키움은 VPS IP만 화이트리스트에 넣어놨으니 어차피 서버에서 실행해야 한다.
배포하고 확인한 것
- 업로드 14 / 서버 삭제 14 / 실패 0
- 서버에서 키움 실호출 성공 —
balance 2→ 예수금 ₩1,000,000 - 익명 브라우저로 접속하니 그 ₩1,000,000이 그대로 보인다. 콘솔 에러 0
/login·/register는 301로 홈으로 보낸다
랜딩 문구도 갈아치웠다. "이용 방법(회원가입 → 구독)"이었던 자리를 "하루 동작 방식"으로 바꿨다. 가입 유도 문구는 0건이 됐다.
왜 공개하나
숫자를 숨기면 아무것도 증명할 수 없기 때문이다. 계좌번호만 가리고 잔고·손익은 실제 원화 그대로 내보낸다. 전략 로직도 공개해도 상관없다고 본다 — 알아도 그대로 따라 할 수 있는 영역이 아니다.
남은 건 이 대시보드에 채울 진짜 기록이다.