smart_ims/docs/IMPLEMENTATION_DETAILS.md
2026-01-22 23:42:55 +09:00

4.2 KiB

구현 계획 - 모듈(라이선스) 관리

이 시스템의 목표는 관리자가 "라이선스 관리" 페이지를 통해 특정 모듈(자산, 생산, CCTV)을 활성화/비활성화할 수 있도록 하는 것이며, 활성화를 위해서는 유효한 라이선스 키가 필수입니다.

라이선스 시스템 아키텍처

서명된 토큰(Signed Token) 방식(JWT 또는 AES 암호화와 유사)을 사용합니다.

  • 발급 (개발자): 생성 도구(CLI 스크립트)를 사용하여 키를 생성합니다.
    • 데이터: { module: 'cctv', type: 'demo', created: '2024-01-01', days: 30 }
    • 출력: U2FsdGVkX1... (암호화된 문자열)
  • 활성화 (사용자): 사용자가 이 문자열을 입력합니다. 서버는 비밀 키(Secret Key)로 이를 복호화하고 날짜를 검증합니다.

사용자 검토 사항

Important

라이선스 관리: 보안을 위해 숨겨진 관리자 생성기(CLI 스크립트)를 사용하여 키를 발급합니다. 만료 처리: 시스템은 데이터베이스에 저장된 expiry_date를 확인하여 만료 여부를 판별합니다.

변경 제안 사항

데이터베이스 및 서버

[신규] system_modules 테이블

  • code (VARCHAR, PK): 'asset', 'production', 'monitoring'
  • is_active (BOOLEAN)
  • license_key (TEXT): 원본 키 문자열.
  • license_type (VARCHAR): 'dev', 'sub', 'demo'
  • expiry_date (DATETIME): 'dev'(영구)인 경우 NULL.

[신규] server/utils/licenseManager.js

  • generateLicense(module, type): 암호화된 문자열 반환.
  • verifyLicense(key): 복호화하여 유효성 및 만료일 반환.

[신규] server/routes/system.js

  • POST /activate: 키 입력 -> 복호화 -> DB 업데이트.
  • GET /modules: 모듈 상태 및 만료 정보 반환.

프론트엔드

[신규] src/system/pages/LicensePage.tsx

  • 모듈 목록: 활성/비활성 스위치, 만료일 표시.
  • 활성화 모달: 키 입력 필드 제공.
  • (숨김) 생성기 탭: 보안상 이유로 삭제됨, CLI로 대체.

[수정] src/widgets/layout/MainLayout.tsx

  • 모듈 활성화 상태에 따라 사이드바 메뉴 조건부 렌더링.

검증 계획

  1. 키 발급: 생성기(CLI)를 사용하여 'Demo' 키(30일)와 'Dev' 키를 생성합니다.
  2. 활성화: Demo 키를 적용합니다. 30일 후 만료되는지 확인합니다.
  3. UI 확인: 'CCTV' 메뉴가 사이드바에 나타나는지 확인합니다.

[신규] tools/license_manager.cjs

  • 통합 CLI: 오프라인 키 관리 및 온라인 DB 상태 관리.
  • 명령어:
    • list: DB의 모든 모듈 상태 조회.
    • generate <module> <type>: 새로운 서명된 라이선스 키 생성.
    • decode <key>: 라이선스 키 내용 확인 (복호화).
    • activate <key>: 키를 사용하여 DB에 직접 활성화 적용.
    • delete <module>: DB에서 모듈 비활성화/삭제.
  • 삭제됨: 기존 issue_license.cjs (이 도구로 통합됨).

고급 카메라 설정 구현

1. 데이터베이스 스키마 확장

camera_settings 테이블에 다음 컬럼을 추가하여 설정을 저장합니다.

  • transport_mode: ENUM('tcp', 'udp', 'auto') - RTSP 전송 프로토콜 제어.
  • rtsp_encoding: BOOLEAN - 비밀번호 특수문자 URL 인코딩 여부.
  • quality: ENUM('low', 'medium', 'original') - 스트리밍 해상도 및 비트레이트 제어.

2. 백엔드 스트림 엔진 (streamRelay.js)

  • FFmpeg 튜닝: JSMpeg(소프트웨어 디코더)의 안정성을 위해 비트레이트를 제한하고 키프레임 주기를 조정했습니다.
    • -maxrate, -bufsize: 네트워크 버스트 방지.
    • -g 30: 1초마다 키프레임 전송 (화면 깨짐 시 1초 내 자동 복구).
  • 심리스 리로드 (Seamless Reload):
    • 사용자 설정 변경(PUT) 시, 클라이언트(브라우저)와의 WebSocket 연결은 유지한 채 백그라운드의 FFmpeg 프로세스만 교체합니다.
    • stopStream 대신 reloadStream을 사용하여 끊김 없는 화질 변경 경험을 제공합니다.

3. 프론트엔드 UI

  • CameraModal: 고급 설정 섹션을 추가하여 사용자가 기술적인 설정(TCP/UDP, 해상도)을 직관적으로 제어할 수 있도록 폼을 개선했습니다.