KMS 동작 방식 (Heartbeat Lease Renewal)
클라이언트 프로그램 실행 시 최초 1회 /api/kms/activate로 대여 토큰을 받은 뒤, 24시간마다 백그라운드 스레드에서 /api/kms/renew로 대여 기간을 연장합니다. 관리자가 대시보드에서 키를 정지하거나 기기를 회수하면 다음 갱신 시 즉시 프로그램이 차단됩니다.
1. KMS Node.js 클라이언트 연동 (Heartbeat 백그라운드 자동 갱신)
// Node.js 내장 fetch & os 모듈 사용 (별도 npm 패키지 설치 불필요)
const os = require("os");
const SERVER = "https://168-107-5-83.sslip.io";
const KEY = "HS-XXXX-XXXX-XXXX";
const HWID = "hwid-" + os.hostname();
async function initKms() {
// 1. 최초 KMS 활성화 (7일 대여 토큰 발급)
const res = await fetch(`${SERVER}/api/kms/activate`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ key: KEY, hwid: HWID, hostname: os.hostname() })
});
const data = await res.json();
if (!data.valid) {
console.error("KMS 활성화 실패:", data.message);
process.exit(1);
}
const leaseToken = data.lease_token;
console.log("KMS 활성화 완료! 대여 만료:", data.lease_expires_at);
// 2. 24시간마다 주기적 Heartbeat 대여 갱신 (원격 킬스위치 감지)
setInterval(async () => {
try {
const r = await fetch(`${SERVER}/api/kms/renew`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ key: KEY, hwid: HWID, lease_token: leaseToken })
});
const renewData = await r.json();
if (!renewData.valid) {
console.error("라이선스 회수됨:", renewData.message);
process.exit(1); // 즉시 프로그램 강제 종료
}
console.log("대여 연장 성공:", renewData.lease_expires_at);
} catch (err) {
console.warn("Heartbeat 일시 오류 (7일 내 재시도):", err.message);
}
}, 24 * 60 * 60 * 1000).unref();
}
initKms().then(() => {
console.log("메인 프로그램 정상 가동 시작...");
});
2. Node.js 1회성 인증 검증 (단순 Verify)
const os = require("os");
async function verifyLicense() {
const res = await fetch("https://168-107-5-83.sslip.io/api/verify", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
key: "HS-XXXX-XXXX-XXXX",
hwid: "hwid-" + os.hostname()
})
});
const result = await res.json();
if (!result.valid) {
console.error("인증 실패:", result.message);
process.exit(1);
}
console.log("인증 성공:", result.data);
}
verifyLicense();