Skip to content
Protomothis edited this page Sep 28, 2026 · 2 revisions

이 서비스는 LAN의 HTTP 요청으로 PC를 끄거나 재시작할 수 있는 도구입니다. 그래서 기본값은 노출을 줄이는 쪽입니다 — WebUI 꺼짐, 텔레그램 제어 꺼짐, 로컬 API는 localhost만.

1. 시크릿

항목 내용
역할 SmartThings 드라이버 인증(X-PC-Secret 헤더)과 앱·WebUI 로그인의 공용 비밀
비어 있으면 같은 네트워크의 누구나 명령을 보낼 수 있고 로컬 API도 인증 없이 열립니다. 서비스 로그와 드라이버가 경고합니다
권장 20자 이상 무작위 문자열. /, ?, #, 공백은 피하세요
저장 config.json에 평문. exe 폴더(Program Files)의 권한으로 보호됩니다. status 명령도 평문으로 출력합니다
전송 허브 ↔ PC는 평문 HTTP입니다. LAN을 신뢰할 수 있어야 하며, 5001을 인터넷에 포트포워딩하지 마세요
틀렸을 때 401 + 로그(시크릿은 ***로 가림) + "잘못된 시크릿 요청" 보안 알림(출처별 5분 집계)

2. SmartThings /st/v1

  • 허용 허브(smartthings.allowed_hubs)를 채우면 목록 밖 출처는 시크릿이 맞아도 403입니다. 앱 네트워크 탭의 [현재 허브를 허용 목록에 추가]로 지금 연결된 허브만 허용할 수 있습니다.
  • 출처 IP별 초당 10회 레이트 리밋이 있습니다.
  • 푸시 콜백은 요청을 보낸 허브의 사설 주소로만 등록됩니다.
  • 인증 없이 열려 있는 것은 SSDP 응답과 /st/v1/description뿐이며, machine_id·호스트 이름·버전·포트·시크릿 설정 여부만 알려 줍니다.
  • 세션 정보(잠금·유휴·사용자 이름)는 기본 꺼짐이며, 켠 경우에만 드라이버로 갑니다.

3. WebUI와 로컬 API (5002)

  • 기본 비활성: HTML 페이지는 403 안내만 돌려주고, JSON API는 127.0.0.1에만 바인드됩니다.
  • "WebUI 브라우저 접속 허용 (로컬+LAN)" 을 켜면 모든 인터페이스에 바인드되고 방화벽 규칙이 열립니다. 시크릿 없이는 켜지지 않습니다.
  • 로그인은 시크릿 하나이고 TLS가 없습니다. 게스트 Wi-Fi나 IoT 기기와 같은 구간이라면 끄고 데스크톱 앱만 쓰세요.
  • 세션 쿠키는 HttpOnly·SameSite=Strict이고, 새 로그인이 이전 세션을 끊으며, 서비스 재시작 시 모두 무효가 됩니다.
  • CSRF: 상태를 바꾸는 요청은 X-Requested-With: XMLHttpRequest 헤더가 없으면 403입니다. 단, /api/test/{command}는 GET으로도 동작하므로 WebUI를 LAN에 열어 둔 채 로그인된 브라우저에서 신뢰할 수 없는 링크를 열지 마세요.
  • 로그인 제한: IP당 5회 실패 → 60초 잠금(429) + "로그인 실패 제한" 알림. 데스크톱 앱의 로그인도 같은 제한을 받습니다.

4. 텔레그램

장치 내용
기본 꺼짐 제어를 켜지 않으면 봇은 명령을 받지 않습니다(폴링 자체를 안 함)
허용 목록 허용 Chat ID(비면 Chat ID)의 채팅만 처리. 그 밖은 무시 + 보안 알림
확인 단계 전원 명령은 [확인] 버튼이나 분 지정이 필요
시간 제한 서비스 시작 전에 쌓인 메시지는 폐기, 10분 넘은 메시지는 실행하지 않음
토큰 DPAPI 머신 범위로 암호화 저장, 앱·API에는 ****1234만 노출, 로그에 기록하지 않음

Chat ID는 위장할 수 없지만 봇 토큰을 가진 사람은 명령을 가로채거나 가짜 알림을 보낼 수 있습니다. 유출이 의심되면 BotFather /revoke 후 새 토큰을 넣으세요. 그룹 채팅을 허용하면 그룹의 모든 구성원이 명령을 낼 수 있으니 개인 채팅을 권장합니다.

DPAPI 암호화는 config.json의 백업·복사본에 평문 토큰이 남는 것을 막습니다. 이 PC에서 파일을 읽을 수 있는 로컬 프로세스의 복호화까지 막지는 못합니다.

5. 서명된 업데이트

자동 업데이트는 ed25519 서명 매니페스트를 내장 공개키로 검증한 뒤에만 진행하고, 받은 exe는 실행 전에 SHA-256·크기를 대조합니다. GitHub 계정이나 릴리스 자산이 탈취되어도 서명 키 없이는 앱을 업데이트시킬 수 없습니다. 자세한 흐름은 자동 업데이트와 서명.

6. 실행 권한

프로세스 계정 하는 일
서비스 LocalSystem 명령 수신·실행, API, 텔레그램, 방화벽 규칙
데스크톱 앱 로그인 사용자 설정 편집(API 경유), 토스트, 트레이. HKCU만 건드림
승격 도우미 관리자(UAC) install, uninstall, 서비스 시작, 업데이트 교체 — 필요할 때만

서비스는 유예 토스트를 위해 로그인된 사용자 세션에서 트레이 앱을 띄울 수 있으며, 이때 띄우는 것은 자기 자신의 exe뿐입니다.

7. 체크리스트

  • 시크릿 설정(길고 무작위), SmartThings 장치 설정에도 같은 값
  • 5001을 인터넷에 포트포워딩하지 않음
  • 필요하면 허용 허브에 지금 쓰는 허브만 등록
  • WebUI 브라우저 접속은 필요할 때만, 신뢰하는 LAN에서만
  • 텔레그램 제어는 개인 채팅 Chat ID로만 허용
  • 보안 알림 5종 켬 + 조용한 시간대의 "보안 알림은 예외" 켬
  • exe는 Program Files 아래에 설치
  • 업데이트는 앱의 [지금 업데이트] 또는 공식 Releases에서만

Clone this wiki locally