-
Notifications
You must be signed in to change notification settings - Fork 0
Protomothis edited this page Sep 28, 2026
·
2 revisions
이 서비스는 LAN의 HTTP 요청으로 PC를 끄거나 재시작할 수 있는 도구입니다. 그래서 기본값은 노출을 줄이는 쪽입니다 — WebUI 꺼짐, 텔레그램 제어 꺼짐, 로컬 API는 localhost만.
| 항목 | 내용 |
|---|---|
| 역할 | SmartThings 드라이버 인증(X-PC-Secret 헤더)과 앱·WebUI 로그인의 공용 비밀 |
| 비어 있으면 | 같은 네트워크의 누구나 명령을 보낼 수 있고 로컬 API도 인증 없이 열립니다. 서비스 로그와 드라이버가 경고합니다 |
| 권장 | 20자 이상 무작위 문자열. /, ?, #, 공백은 피하세요 |
| 저장 |
config.json에 평문. exe 폴더(Program Files)의 권한으로 보호됩니다. status 명령도 평문으로 출력합니다 |
| 전송 | 허브 ↔ PC는 평문 HTTP입니다. LAN을 신뢰할 수 있어야 하며, 5001을 인터넷에 포트포워딩하지 마세요 |
| 틀렸을 때 | 401 + 로그(시크릿은 ***로 가림) + "잘못된 시크릿 요청" 보안 알림(출처별 5분 집계) |
-
허용 허브(
smartthings.allowed_hubs)를 채우면 목록 밖 출처는 시크릿이 맞아도403입니다. 앱 네트워크 탭의 [현재 허브를 허용 목록에 추가]로 지금 연결된 허브만 허용할 수 있습니다. - 출처 IP별 초당 10회 레이트 리밋이 있습니다.
- 푸시 콜백은 요청을 보낸 허브의 사설 주소로만 등록됩니다.
- 인증 없이 열려 있는 것은 SSDP 응답과
/st/v1/description뿐이며,machine_id·호스트 이름·버전·포트·시크릿 설정 여부만 알려 줍니다. - 세션 정보(잠금·유휴·사용자 이름)는 기본 꺼짐이며, 켠 경우에만 드라이버로 갑니다.
- 기본 비활성: 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) + "로그인 실패 제한" 알림. 데스크톱 앱의 로그인도 같은 제한을 받습니다.
| 장치 | 내용 |
|---|---|
| 기본 꺼짐 | 제어를 켜지 않으면 봇은 명령을 받지 않습니다(폴링 자체를 안 함) |
| 허용 목록 | 허용 Chat ID(비면 Chat ID)의 채팅만 처리. 그 밖은 무시 + 보안 알림 |
| 확인 단계 | 전원 명령은 [확인] 버튼이나 분 지정이 필요 |
| 시간 제한 | 서비스 시작 전에 쌓인 메시지는 폐기, 10분 넘은 메시지는 실행하지 않음 |
| 토큰 | DPAPI 머신 범위로 암호화 저장, 앱·API에는 ****1234만 노출, 로그에 기록하지 않음 |
Chat ID는 위장할 수 없지만 봇 토큰을 가진 사람은 명령을 가로채거나 가짜 알림을 보낼 수 있습니다. 유출이 의심되면 BotFather /revoke 후 새 토큰을 넣으세요. 그룹 채팅을 허용하면 그룹의 모든 구성원이 명령을 낼 수 있으니 개인 채팅을 권장합니다.
DPAPI 암호화는 config.json의 백업·복사본에 평문 토큰이 남는 것을 막습니다. 이 PC에서 파일을 읽을 수 있는 로컬 프로세스의 복호화까지 막지는 못합니다.
자동 업데이트는 ed25519 서명 매니페스트를 내장 공개키로 검증한 뒤에만 진행하고, 받은 exe는 실행 전에 SHA-256·크기를 대조합니다. GitHub 계정이나 릴리스 자산이 탈취되어도 서명 키 없이는 앱을 업데이트시킬 수 없습니다. 자세한 흐름은 자동 업데이트와 서명.
| 프로세스 | 계정 | 하는 일 |
|---|---|---|
| 서비스 | LocalSystem | 명령 수신·실행, API, 텔레그램, 방화벽 규칙 |
| 데스크톱 앱 | 로그인 사용자 | 설정 편집(API 경유), 토스트, 트레이. HKCU만 건드림 |
| 승격 도우미 | 관리자(UAC) |
install, uninstall, 서비스 시작, 업데이트 교체 — 필요할 때만 |
서비스는 유예 토스트를 위해 로그인된 사용자 세션에서 트레이 앱을 띄울 수 있으며, 이때 띄우는 것은 자기 자신의 exe뿐입니다.
- 시크릿 설정(길고 무작위), SmartThings 장치 설정에도 같은 값
- 5001을 인터넷에 포트포워딩하지 않음
- 필요하면 허용 허브에 지금 쓰는 허브만 등록
- WebUI 브라우저 접속은 필요할 때만, 신뢰하는 LAN에서만
- 텔레그램 제어는 개인 채팅 Chat ID로만 허용
- 보안 알림 5종 켬 + 조용한 시간대의 "보안 알림은 예외" 켬
- exe는
Program Files아래에 설치 - 업데이트는 앱의 [지금 업데이트] 또는 공식 Releases에서만