컨텍스트라 시스템 아키텍처 및 통신구조 정의서 컨텍스트라 시스템 아키텍처 및 통신구조 정의서 1전체 시스템 구성도 2구성 요소별 기능 3시스템 간 통신 구조 4전체 흐름 요약 설정 변경과 그룹 소속 정책 [h1] 컨텍스트라 시스템 아키텍처 및 통신구조 정의서 Version 2.0시스템 아키텍처통신 구조 [h2] 전체 시스템 구성도1 Web Server는 물리적으로 하나의 사이트다. Client 계정으로 로그인하면 그 계정의 permission에 따라 화면이 갈린다 — admin은 CCTV·계정 등록을 포함한 관리 페이지로, user는 등록·배정 같은 관리 기능이 빠진 관제 페이지(실시간 관제, 녹화 재생, 내보내기, AI 이벤트 검색은 그대로 포함)로 진입한다. 별도의 관제 전용 서버·관리 전용 서버로 나누지 않는다. Web Server는 인증, 계정, CCTV 관리, 이벤트, 로그를 중앙 관리한다. Client는 검색과 제어를 모두 Web Server를 통해 요청하고, Web Server에서 받은 URL로 영상만 Media Server 및 AI Server에서 직접 받는다. [h2] 구성 요소별 기능2 각 서버가 맡는 범위와, 맡지 않는 범위다. 책임 경계를 넘는 구현은 두지 않는다. | 서버 | 책임 | 하지 말아야 할 것 | Web Server | 로그인, 계정·권한 DB, Opaque Token 발급·폐기·유효성 검사, CCTV 관리(접속 설정 원본 보관), Media Server / AI 서버 계정 등록, Client 조회 중계, Rule Engine, AI Event DB | 영상 파일 저장, RTSP ingest, GPU 추론 | Media Server | RTSP ingest, 녹화, video storage, timeline index, Client에 WebRTC, AI에 RTSP, HLS/MP4 녹화재생, 스트림 시간 기준 제공, 토큰 검증. 제어 채널만 HTTPS/WSS이고 영상 전송은 별도 포트의 평문이다. | 권한 정책 결정, 계정 관리, 토큰 발급, AI 추론 | AI 서버 | Media Server RTSP 수신, decode, inference, AnchorBox 생성, AI 이벤트를 Web Server DB로 전송, 이벤트 영상 저장 및 재생 제공, Client에 AnchorBox WSS 전송 | 장기 녹화 저장, 권한 정책 결정, 토큰 발급 | Client | Web Server 로그인, 관제 화면 표시, 영상·AnchorBox 수신 및 시간 동기화 | 자격증명 보관, 서버 간 중계 [h3] Web Server2-1 [h4] 웹 · 인증 웹 페이지는 하나다. Client 계정 로그인 시 permission으로 관리 페이지(admin)와 관제 페이지(user)를 가른다. 엔드포인트별 허용 범위는 Web Server API 명세서 6.2를 따른다. 최초 기동 시 기본 관리자 계정(admin / admin)으로만 로그인할 수 있으며, 비밀번호를 변경하기 전에는 계정 등록을 포함한 다른 기능을 차단한다. Opaque Token 발급·검증 서버 Opaque Token 상태·권한·폐기 관리 토큰 유효성 검사(Introspection) API 제공 토큰 폐기 시 Media Server / AI에 폐기 통지 전송 [h4] 데이터 · 관리 전체 관리 DB 계정 관리: MEDIA / AI / Client 세 유형에 admin · user 권한을 부여한다. permission으로 실제 기능이 갈리는 것은 Client뿐이라 MEDIA·AI는 admin만 쓰고, Web Server 운영자는 Client admin이다. 권한 제한이 걸리는 것은 Client뿐이다. 기준은 "실시간 vs 과거"가 아니라 "관제 기능 vs 관리 기능"다 — admin은 시스템 고정 관리자 그룹에 속하며 배정과 무관하게 모든 카메라의 실시간·녹화 재생·내보내기·PTZ·AI 이벤트를 쓸 수 있고, user는 소속 운영자 그룹에 배정된 카메라에 한해서만 쓸 수 있다. 배정된 카메라라도 실시간을 뺀 나머지(녹화 재생·내보내기·PTZ·AI 이벤트)는 소속된 운영자 그룹에 그 기능이 허용돼 있어야 한다 — 이 기능 권한은 카메라별도 계정별도 아니라 운영자 그룹 하나에 한 세트이며, 그 그룹에 속한 모든 운영자와 그 그룹에 배정된 모든 카메라에 동일하게 적용된다(운영자 계정은 그룹 하나에만 속한다). 볼 수 있는 카메라도 계정이 아니라 운영자 그룹에 배정하며, 어느 그룹에도 속하지 않은 운영자는 볼 수 있는 카메라가 없다. admin만 계정·서버 등록, CCTV·그룹 등록·배정, 운영자 그룹의 카메라 배정과 권한 설정, 운영자 그룹 등록, AI Rule 설정 같은 관리 기능을 쓸 수 있다. Client 관리자는 최초 한 계정으로 고정하며 추가·승격·교체하지 않는다. 추가 Client 계정은 운영자만 허용한다. 권한 검사는 Web Server가 수행하며, Media Server·AI는 권한으로 호출을 거르지 않는다. 모든 계정은 전역 고유 accountId와 비밀번호로 로그인한다. 등록 시 유형별 serverId(MEDIA-01 / AI-01 / Client-01, 각 01~99)를 별도로 발급하며, 로그인 응답에서 토큰과 함께 전달한다. Media Server와 AI는 로그인 시 controlPort를 함께 보고한다. accountId(로그인 ID), serverId(actor별 영구 식별자), connectionId(연결 1건)를 구분한다. accountId와 serverId는 변경·재사용하지 않고, 삭제·비활성화 시 토큰 폐기 통지를 먼저 보낸다. Media Server / AI 서버 등록 및 관리 CCTV 및 AI Rule 관리. CCTV 등록(카탈로그 생성)은 관리자(Web Server UI) 전용이며 Media Server는 신규 CCTV를 만들 수 없다. 그룹은 전역이다 — 관리자가 공통 그룹을 한 번 만들고 카메라를 그 그룹에 소속시키면, 운영자 그룹·MEDIA·AI에는 그중 필요한 카메라만 배정한다(같은 그룹을 공유하고 배정된 카메라 목록만 다르다). 그룹 식별자는 Web Server가 한 번만 발급하며, Media Server는 자기 담당 카메라가 속한 그룹만 받아 알 뿐 스스로 번호를 만들지 않는다. CCTV 접속 설정(주소·포트·스트림 경로·자격증명)의 원본은 Web Server가 보관한다. Media Server가 DB를 잃어도 Web Server 값으로 복원할 수 있어야 하며, 비밀번호는 DB 암호화를 적용해 저장하고 복원 요청에만 반환한다. 중앙에서는 cameraId 하나로 CCTV를 식별하고, 어느 Media Server가 녹화하고 어느 AI가 분석할지는 별도의 배정(assignment)으로 관리한다 — 같은 CCTV를 여러 MEDIA·여러 AI에 중복 배정할 수 있으며, 배정된 MEDIA마다 독립적으로 수신·녹화한다. CCTV 배정도 등록과 마찬가지로 Web Server UI에서 관리자가 한다. Media Server는 배정을 스스로 요청할 수 없고, 관리자가 배정한 결과를 WSS push로 받아 반영만 한다. AI 이벤트 정보를 DB에 저장 및 조회 녹화 구간 검색, 녹화재생 세션 생성, 내보내기 요청을 Media Server 제어 채널로 중계하고 결과 URL을 Client에 전달 Media Server / AI 설정 관리 Media Server / AI 상태 관리. 두 서버 모두 Web Server가 유지하는 제어 채널 연결 유지 여부로 생존을 판단한다 Media Server / AI 로그와 장애 정보 수집. 이력 저장과 별도로 미해소 장애 목록을 관리한다. [h4] 서버 구성 HTTPS Web · API 서버 (REST) HTTPS: 로그인, 설정, 목록 및 이벤트 검색 [h3] Media Server2-2 [h4] 영상 수신 · 송출 CCTV RTSP/RTP 수신 Client에 WebRTC 실시간 영상 제공 AI에 RTSP 스트림 제공 [h4] 녹화 · 재생 녹화 파일 저장 및 관리 녹화 구간 검색 API 제공 녹화영상 HLS 또는 MP4 녹화재생 제공 [h4] 스트림 및 시간 기준 API Stream ID RTP timestamp 0에 대응하는 스트리밍 엔진 wall 시각 RTP Clock Rate [h4] ONVIF 제어 CCTV의 ONVIF 기능(검색, 기능별 지원 여부 조회, PTZ, 주야간·포커스)을 Media Server 내부의 ONVIF 처리 모듈이 담당한다. 카메라와 어떤 프로토콜·SDK로 통신하는지는 내부 구현이며 API에 드러나지 않는다 카메라마다 켜고 끄는 스위치는 없다 — 등록된 모든 카메라에 자동으로 ONVIF 연결을 시도하며, 서비스 주소·미디어 프로필은 Media Server가 내부적으로 확인·보관한다. 연결·인증에 실패해도 RTSP 수신·녹화는 그대로 진행되고, 지원 여부는 성공적으로 확인되기 전까지 unknown으로 남는다(실패를 미지원으로 단정하지 않는다) 같은 CCTV가 여러 Media Server에 배정된 경우 각 Media Server가 독립적으로 제어할 수 있다 — 배정 간 상호 배제나 중앙 잠금은 두지 않는다 Web Server API의 PTZ는 연속 이동만 중계한다 — 프리셋·홈 포지션은 MEDIA 확장 action만 있고(Media Server API 8.4) Web 중계 API는 아직 없으며, 위치 조회는 두지 않는다 기능 지원 여부·현재 상태는 조회 응답으로만 제공한다. 상태가 바뀌는 시점의 오류는 기존 로그 전송 경로로 남긴다(4-2 참고) 화질(영상 품질) 조정과 외부 VMS 연동용 ONVIF 서버 제공은 이 범위에서 다루지 않는다 [h4] 관리 · 연동 CCTV 및 스트림 상태 관리 WSS 제어 채널 서버 운영. Web Server와 AI가 client로 접속하며, CCTV 관리·녹화·송출 제어와 녹화재생·내보내기 요청을 이 채널로 받는다 운영 모드는 standalone과 managed 둘이다. managed는 Web Server에 로그인해 제어 채널을 토큰으로 보호하고, standalone은 Web Server 없이 단독 동작하며 제어 채널을 무인증으로 연다. 내부망 배포와 방화벽 제한을 전제로 한다 Web Server 설정 동기화 주요 로그를 Web Server로 전송. 현재 상태값은 push하지 않고 Web Server 조회에 응답한다 Web Server 토큰 유효성 검사 API 연동 토큰 검증 결과 캐시 및 폐기 통지 처리 [h3] AI Server2-3 [h4] 영상 수신 · 분석 Web Server에서 담당 CCTV와 Media Server 접속 정보 조회(/servers/{serverId}/analysis-assignments/fetch, Web Server_API 9.4) — 로그인 직후와 주기적으로 다시 조회한다 Opaque Token으로 Media Server StreamInfo API 호출 Media Server에서 RTSP 스트림 수신 Media Server 시간 기준으로 영상 시각 계산 AI 분석 및 AnchorBox 생성 [h4] 이벤트 처리 AI 이벤트 생성 AI 이벤트 정보를 Web Server DB로 전송 AI 이벤트 영상 파일을 AI Server에 저장 Client에 저장된 이벤트 영상 재생 API 제공 Client에 AnchorBox를 WSS로 전송 (AI가 WSS 서버) [h4] 관리 · 연동 WSS 제어 채널 서버 운영. Web Server가 client로 접속해 설정 변경과 토큰 폐기 통지를 전달하며, Client는 AnchorBox 수신용으로 접속한다 주요 로그와 AI 이벤트를 Web Server로 전송. 현재 상태값은 push하지 않는다 Web Server 토큰 유효성 검사 API 연동 토큰 검증 결과 캐시 및 폐기 통지 처리 [h3] Client2-4 [h4] 인증 · 페이지 Web Server 로그인 및 Opaque Token 발급 Web Server 로그인 시 permission에 따라 관리 페이지 또는 관제 페이지 수신 (2-1 참조) CCTV 목록과 Media Server / AI 접속 정보 조회. Web Server가 중계한 완성 URL만 받으며 계정 자격증명은 포함하지 않는다 [h4] 실시간 관제 Media Server에 직접 접속하여 WebRTC 실시간 영상 수신 (스트리밍 경로는 별도 로그인 없음) AI 서버에서 WSS로 AnchorBox 수신 프레임별 RTP timestamp로 영상과 AnchorBox 시간 동기화 시간 기준 조회는 Web Server를 통해 수행하며, RTP 감소만으로 wrap을 확정하지 않는다. Client는 Media Server 제어 채널에 접근하지 않으므로 Web Server가 대신 조회해 전달한다 [h4] 조회 · 녹화재생 아래 기능은 admin·user 둘 다 쓸 수 있지만, user는 소속 운영자 그룹에 배정된 카메라로, 그리고 그 그룹에 그 기능이 허용된 경우로 범위가 제한된다(2-1 참조). user에게 막히는 건 소속 그룹에 없는 기능 권한뿐 아니라 계정·서버·CCTV·그룹 등록·배정 같은 관리 기능도 포함한다 Web Server에서 일반 녹화 및 AI 이벤트 검색 Web Server를 통해 녹화영상 내보내기 요청 및 진행률 조회 Media Server에서 일반 녹화영상 직접 녹화재생 AI Server에서 AI 이벤트 영상 직접 재생 [h2] 시스템 간 통신 구조3 [h3] 인증 · 관리 통신3-1 | 송신 | 수신 | 방식 | 용도 | Media Server / AI / Client | Web Server | HTTPS | 로그인 및 Opaque Token 발급 | Media Server | Web Server | HTTPS | 담당 CCTV 설정 조회 | AI | Web Server | HTTPS | 담당 CCTV · Media Server 주소 · AI Rule 조회 | Web Server | DB | DB 연결 | 계정 · 설정 · 이벤트 · 상태 정보 저장 및 조회 | Media Server / AI | Web Server | HTTPS | 토큰 유효성 조회 | Web Server | Media Server / AI | WSS 제어 채널 | 설정·CCTV 정보 push, 토큰 폐기 통지 (캐시 제거), 상태 조회 [h3] 영상 · AI 데이터 통신3-2 | 송신 | 수신 | 방식 | 용도 | AI | Media Server | WSS + Token | StreamInfo · 시간 기준 조회 (제어 채널) | Media Server | AI | RTSP/RTP + 스트리밍 토큰 | AI 분석용 영상 전송. 계정 자격증명은 검증하지 않고 접속 id만 기록한다. | Client | Media Server | WebRTC (HTTP signaling) + 스트리밍 토큰 | 실시간 영상 수신. signaling은 스트리밍 엔진 포트의 평문 HTTP이며 별도 로그인이 없다. | Client | AI | WSS + Token | 실시간 AnchorBox 수신. AI가 WSS 서버이며 Web Server 제어 채널과 같은 서버의 다른 용도 연결이다 [h3] 녹화 · 이벤트 · 로그 통신3-3 | 송신 | 수신 | 방식 | 용도 | Client | Media Server | HTTP | Web Server에서 받은 URL로 HLS/MP4 녹화재생. 녹화재생 경로는 별도 포트의 평문 HTTP이며 녹화재생 세션 토큰으로만 통제한다. 녹화 구간 검색은 Web Server를 경유한다. | Client | AI | HTTPS + Token | AI 이벤트 영상 조회 및 재생 | AI | Web Server | HTTPS | AI 이벤트 정보 저장 | Media Server / AI | Web Server | HTTPS | 주요 로그·장애·감사 로그 push (배치 전송, 재전송 시 중복 가능) [h2] 전체 흐름 요약4 [h3] 중앙 관리 및 인증4-1 Web Server는 계정, 권한, Media Server / AI 등록, CCTV 설정, AI Rule, 이벤트 정보 및 전체 DB를 중앙 관리한다. Media Server, AI, Client는 Web Server에서 각각 서로 다른 Opaque Bearer Token을 발급받는다. Media Server와 AI 간 API 통신은 Web Server가 발급한 Opaque Token으로 인증한다. 토큰은 암호학적 난수로 생성한 Opaque Bearer Token이며, 토큰 자체에는 계정·권한 정보가 없고 Web Server DB에 토큰 해시와 활성 상태를 저장한다. Media Server / AI / Web Server 자신의 서비스 토큰은 무제한 유효기간이다. 사람이 쓰는 세션(Web Server 운영자 웹 UI, Client)은 만료를 두며, 이 토큰들은 제어 채널에 사용하지 않으므로 Media Server의 영구 캐시 모델에 영향을 주지 않는다. Media Server와 AI는 토큰을 받은 최초 요청에만 Web Server의 토큰 유효성 검사 API를 호출하고, 이후에는 캐시한 결과를 사용한다. Web Server에서 토큰을 폐기하거나 계정을 비활성화해도, 이미 검증되어 캐시된 토큰은 캐시가 지워지기 전까지 계속 통과한다. 즉시 반영하려면 Web Server가 Media Server / AI에 폐기 통지를 보내 캐시 항목을 제거하고 해당 연결을 닫게 한다. 대상을 특정하기 어려우면 캐시 전체 삭제를 요청한다. Web Server 재시작 후에도 기존 토큰을 유지하도록 토큰 상태를 DB에 영구 저장한다. Web Server DB에는 Web Server만 직접 접근한다. [h3] Media Server 및 AI 초기 설정4-2 Media Server는 Web Server 로그인 후 담당 CCTV 목록을 조회해 로컬 DB를 맞춘다. 이후 변경은 Web Server가 제어 채널로 push하며, 주기적 조회로 누락을 보정한다. AI는 Web Server 로그인 후 담당 CCTV·Media Server 주소를 조회한다(/servers/{serverId}/analysis-assignments/fetch, Web Server_API 9.4). AI Rule(탐지 규칙) 저장·조회 API는 아직 정의되지 않았다 — 관리자의 규칙 등록 화면과 AI의 규칙 조회 계약은 별도로 설계해야 한다. Media Server와 AI가 Web Server를 호출할 때는 항상 자신이 여는 HTTPS 연결을 쓴다. 로그인, 토큰 유효성 검사, 목록 조회, 로그 전송이 여기에 해당한다. Web Server 서버 인증서를 검증하지 않는다. 자체서명 인증서를 쓰는 내부망 배포를 전제로 한다. Web Server 주소와 서버 계정은 설치 시 로컬 설정으로 주입한다. 스트리밍 송출 IP는 Media Server가 로그인 요청에 후보를 실어 보내고 Web Server가 확정한다. Web Server가 관측한 접속 IP는 여기에 쓰지 않는다. 라우터·NAT·VPN을 지나면 실제 NIC 주소와 다르기 때문이다. 제어 채널 접속 주소(controlIp)도 로그인 요청에 실어 보내는 declared 값이다 — Web Server는 그 값을 그대로 저장해 되접속에 쓰며, 관측한 상대 IP로 덮어쓰지 않는다. Media Server와 Web Server는 같은 망에 있는 것을 전제로 하므로 둘 사이의 NAT는 다루지 않는다. Media Server와 AI는 현재 상태값을 Web Server로 push하지 않는다. 상태는 Web Server가 필요할 때 조회 API를 호출한다. 다만 상태가 바뀌는 시점의 장애·감사 로그는 로그 수집 API로 push한다. 조회는 현재값, 로그는 전이 시점으로 역할을 나눈다. 로그는 전송 실패 시 로컬 버퍼에 보관했다 재전송하므로 같은 로그가 두 번 이상 도착할 수 있다. Web Server는 요청 토큰의 해시와 seq로 중복을 제거한다. 토큰은 로그인마다 새로 발급되므로 재부팅·재로그인 범위가 자동으로 갈린다. Media Server와 AI는 Web Server로 Heartbeat를 보내지 않는다. 두 서버 모두 WSS 제어 채널 서버이고 Web Server가 client로 접속하므로, 그 연결의 유지 여부가 곧 생존 신호다. Web Server는 두 서버의 제어 채널에 각각 접속을 유지하며, 끊기면 지수 backoff로 재접속한다. 재접속 시 CCTV 목록과 설정을 다시 맞춘다. [h3] AI 분석 영상 흐름4-3 AI는 Media Server의 StreamInfo API에서 RTSP 주소와 시간 기준 정보를 조회한다. AI는 Media Server의 RTSP 스트림을 직접 수신하여 분석한다. AI가 Media Server API를 호출할 때 자신의 Opaque Token을 전달하고, Media Server는 Web Server의 토큰 유효성 검사 API로 활성 상태를 확인한다. Media Server와 AI가 Web Server를 호출할 때 쓰는 토큰은 자기 계정으로 발급받은 것이며, 남이 제시한 토큰을 검증하는 흐름과는 별개다. [h3] 시간 동기화4-4 전체 영상 시간의 기준은 Media Server다. Media Server는 압축 영상의 전달 순서와 원본 PTS 시간 간격을 유지하며 이 시간 처리 과정에서 디코딩·재인코딩하지 않는다. 필요한 DTS 시간값만 보완한다. Media Server는 Stream ID, startWallTimeMs, rtpClockRate를 제공한다. 기준 시각은 동일한 기준 프레임의 Plus 수신 시각에서 송출 RTP 시간을 미리 뺀 값이며, 수신측은 각 프레임의 RTP 시간을 더한다. 첫 RTP는 0으로 강제하지 않는다. RTSP·WebRTC에서 같은 프레임이 같은 시간으로 계산되는지 검증해야 한다. AI는 실제 분석한 디코딩 프레임에 연결된 RTP timestamp를 사용하고, Client는 WebRTC 표시 프레임의 requestVideoFrameCallback 메타데이터를 사용한다. RTP 감소만으로 wrap을 확정하지 않는다. wrap·재연결 전후 프레임에 적용할 기준을 구분하는 계약은 미확정이며, 최신 기준 재조회만으로 해결됐다고 보장하지 않는다(Media Server API 7장). AI는 Media Server에 직접 조회하고 Client는 Web Server를 통해 조회한다. AI는 Media Server 시간 기준으로 AnchorBox 시각, 이벤트 발생 시각 및 이벤트 영상 저장 시각을 계산한다. Client는 동일한 시간 기준으로 영상과 AnchorBox를 동기화한다. 저장 규칙: 동기화 기준값(detectedAtWallMs 등)은 BIGINT epoch milliseconds 원본을 그대로 저장한다. DATETIME(6)은 화면 조회용 보조 컬럼이며 UTC로만 저장하고, DB 세션 timezone을 +00:00으로 고정한다. API 입출력은 epoch milliseconds로 통일하고 밀리초 미만은 버린다. timezone 설정이 틀리면 변환만으로 9시간 오차가 생긴다. [h3] 실시간 관제4-5 Client는 Web Server에 로그인하고 관제 Web 페이지, CCTV 목록 및 Media Server / AI 접속 정보를 받는다. Client는 Web Server에서 받은 URL로 Media Server에 직접 WebRTC 연결하여 실시간 영상을 수신한다. 스트리밍 경로는 제어 채널과 다른 포트에서 평문 HTTP로 서비스하며 별도 로그인을 요구하지 않는다. 실시간 스트림 URL에는 스트리밍 엔진이 기동 시 발급한 스트리밍 토큰이 쿼리 파라미터로 붙는다. 계정과 무관한 서버 단위 값이며, 스트리밍 엔진이 재시작하면 새로 발급되고 이전 URL은 무효가 된다. 소비자는 401을 받으면 URL을 재조회한다. 스트리밍 토큰은 스트림 주소 무단 열거를 막는 용도이며 계정 단위 통제는 아니다. 내부망 배포를 전제로 하므로 TLS와 계정 단위 인증은 적용하지 않는다. Client는 AI 서버에 직접 WSS로 연결하여 AnchorBox와 AI 분석 정보를 수신한다. Client가 서버와 다른 망에서 접속하면 Web Server가 내려주는 Media Server·AI 서버 URL의 접속 주소를 그 Client 계정의 외부 접속 주소(externalAccess)로 바꿔 준다. 설정이 없으면 내부 주소 그대로이며, 서버 쪽 API와 설정은 바뀌지 않는다. [h3] 일반 녹화영상 조회4-6 일반 녹화 영상은 Media Server에 저장한다. Client는 Web Server 로그인으로 발급받은 사용자 Token으로 Web Server에 녹화 구간 검색과 녹화재생을 요청한다. Web Server가 토큰을 검증한 뒤 자신의 서비스 토큰으로 Media Server의 제어 채널(recordings.ranges.get, recplay-sessions.create)을 호출하고, 받은 결과와 녹화재생 URL을 Client에 전달한다. Client는 Media Server의 제어 채널에 직접 접근하지 않는다. 전달받은 URL로 녹화재생 엔진 포트의 HLS 또는 MP4를 녹화재생한다. 녹화재생 경로에는 TLS를 적용하지 않는다. 브라우저 Client에는 RTSP를 직접 제공하지 않는다. [h3] AI 이벤트 조회4-7 AI 이벤트 정보는 Web Server DB에 저장한다. 실제 AI 이벤트 영상 파일은 AI Server에 저장한다. Client는 Web Server에서 AI 이벤트 목록을 검색한다. 선택한 이벤트 영상은 해당 AI Server의 HTTPS 재생 API를 직접 호출하여 재생한다. [h3] 녹화영상 내보내기4-8 Client는 Web Server 로그인으로 발급받은 사용자 Token으로 Web Server에 내보내기를 요청한다. Web Server가 토큰을 검증하고 요청한 CCTV가 그 계정의 소속 운영자 그룹에 배정돼 있는지 확인한다. Web Server가 자신의 서비스 토큰으로 Media Server의 recexports.estimate / recexports.create를 호출하며, 요청한 사용자 식별자를 requestedBy로 함께 전달한다. Media Server는 requestedBy를 감사 기록에만 사용하고 권한 판단은 하지 않는다. 한 번에 요청할 수 있는 구간은 최대 5분, CCTV는 최대 4대다. 초과하면 나누어 요청한다. 진행률 조회와 취소도 Web Server를 통해서만 수행한다. Client는 제어 채널에 직접 접근하지 않는다. 완료된 파일의 다운로드 주소는 추측이 어려운 downloadToken 경로이며 만료 시간이 있다. Web Server는 권한을 확인한 사용자에게만 이 주소를 전달한다. 녹화재생 경로는 무인증이므로 다운로드 주소가 한 번 전달되면 Web Server가 중간에 회수할 수 없다. 통제 수단은 주소를 전달할지 여부와 만료 시간 두 가지다. [h2] 설정 변경과 그룹 소속 정책 매니저 모드에서 다음 설정은 Web Server의 Client admin만 변경한다. Plus 화면은 조회만 제공하며 MEDIA 계정으로 변경을 요청하는 경로도 허용하지 않는다. 그룹 등록·이름 수정·삭제, 카메라 등록·접속정보 수정·삭제·그룹 이동, MEDIA·AI 배정. 스트리밍 서버 켜기·끄기, streamingBindIp·RTSP/HTTP/RTC 포트, RTSP 평문·암호화 출력 방식. 카메라별 메인·서브 송출 켜기·끄기, 녹화 스케줄·녹화 모드. bootstrap·주기 동기화·WSS 설정 반영과 저장된 설정에 따른 자동 기동은 계속 수행한다. 적용 실패 시 웹의 desired 설정을 유지하고 실제 실행 상태·오류를 별도로 보고하며 재연결·주기 동기화에서 재시도한다. MEDIA가 이전 값이나 enabled: false를 웹에 저장해 desired 설정을 덮어쓰지 않는다. 실시간 보기·녹화 조회·재생·내보내기와 장비 로컬 설정(녹화 저장 경로·보관 기간·파일 분할·최소 여유 공간, WSS/Media 서버 사용 여부·포트·인증서)은 이 제한 대상이 아니다. 로컬 모드에서는 기존 직접 설정을 유지하며 그룹 삭제 시 소속 카메라 설정도 함께 삭제한다. 기존 녹화파일은 별도로 보존 정책을 따른다. 그룹과 카메라는 별도로 등록하되 카메라 등록에는 기존 그룹 ID가 필수다. 카메라 수정은 부분 수정이며 groupId 생략 시 기존 그룹을 유지하고 null은 거절한다. 웹에서 그룹을 삭제하려면 소속 카메라를 다른 그룹으로 먼저 옮겨야 한다. 소속 카메라가 있으면 GROUP_HAS_CAMERAS이며 카메라를 함께 삭제하지 않는다.