13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] ONVIF

  • [HomeLabs] Home Assistant IP 카메라 보안 체크리스트: 홈랩 연동 모범 사례

    [HomeLabs] Home Assistant IP 카메라 보안 체크리스트: 홈랩 연동 모범 사례

    Home Assistant IP 카메라 보안 체크리스트

    Home Assistant IP 카메라 조합은 생각보다 빨리 복잡해집니다. 화면만 뜨면 끝이라고 보기 쉬운데, 실제 운영에서 발목을 잡는 건 대개 영상 품질보다 권한, 네트워크 경계, 로그 품질이거든요. 저도 홈랩에서 몇 번 다시 깔아보니, ONVIF로 장치가 잡히고 스트림이 재생되는 순간보다 그다음 몇 주가 더 중요하더라고요.

    지금은 기준을 하나로 잡습니다. 카메라는 신뢰하는 장비가 아니라, 필요한 범위 안에서만 일하게 만드는 장비로 보는 겁니다. 이 관점으로 보면 설계가 훨씬 단순해집니다. 카메라는 영상을 보내고, Home Assistant는 상태와 자동화를 묶고, 외부 접근은 VPN이나 엄격한 리버스 프록시로만 받습니다. 이번 글은 그 기준으로 정리한 Home Assistant IP 카메라 보안 실전 체크리스트입니다.

    Home Assistant IP 카메라 분리 네트워크 아키텍처 이미지

    Home Assistant 서버, 카메라 전용 네트워크, 관리용 단말, VPN 경로를 한눈에 보여주는 개요 이미지입니다.

    1. 왜 Home Assistant IP 카메라 연동이 보안 이슈로 이어질까

    IP 카메라는 단순한 영상 소스가 아닙니다. 스트림 서버이자 웹 관리 장비이고, 경우에 따라 이벤트 발행자이기도 합니다. Home Assistant는 그 위에 자동화를 얹는 오케스트레이션 레이어에 가깝고요. 여기서 자주 놓치는 건, Home Assistant에 붙였다고 해서 카메라 자체의 공격면이 자동으로 줄어드는 건 아니라는 점입니다.

    제가 현장에서 제일 자주 본 실패는 세 가지였습니다.

    • 노출 실패: RTSP, 웹 관리 포트, ONVIF 포트가 의도치 않게 다른 VLAN이나 인터넷 쪽에서 보입니다.
    • 권한 실패: Home Assistant 연동 계정이 관리자 권한이라 PTZ, 사용자 관리, 설정 변경까지 다 열려 있습니다.
    • 가시성 실패: 프록시, 카메라, Home Assistant 시간이 어긋나거나 원본 접속 정보를 교차 확인할 로그가 부족해 사고 분석이 어려워집니다.

    이 셋이 겹치면 꽤 번거로워집니다. 예를 들어 현관 카메라가 외부에 노출돼 있고, 관리자 계정으로 ONVIF를 붙여놨고, 프록시 access log 없이 Home Assistant 로그만 본다고 해보겠습니다. 그러면 누가 어디서 접근했는지 추적이 흐려지고, 연동 편의 때문에 열어둔 기능이 오히려 리스크를 키웁니다. 제 경험상 홈랩 감시 시스템은 “잘 나오느냐”보다 잘 제한돼 있느냐를 먼저 봐야 나중이 편합니다.

    2. Home Assistant IP 카메라 연동의 핵심 개념: ONVIF, RTSP, 네트워크 분리

    처음엔 ONVIF와 RTSP를 한 묶음으로 보기 쉬운데, 운영 관점에서는 역할을 분리해서 봐야 판단이 빨라집니다. ONVIF는 장치 발견, 프로필 조회, 이벤트, PTZ 같은 제어 채널에 가깝고, RTSP는 영상 전달 채널입니다. 참고로 Home Assistant의 ONVIF 통합은 현재 기준으로 ONVIF Profile S 호환 장치를 대상으로 하며, 영상 처리를 위해 FFmpeg 통합이 필요합니다.

    구성 방식 언제 쓰는지 장점 주의점 제가 권하는 판단
    RTSP만 사용 라이브 뷰나 NVR 쪽 스트림만 필요할 때 공격면이 비교적 단순함 이벤트, PTZ, 장치 메타데이터 연동이 줄어듦 움직임 감지는 별도 센서나 NVR이 맡는 구조면 이쪽이 더 깔끔합니다.
    ONVIF 중심 사용 장치 검색과 이벤트 연동이 핵심일 때 초기 통합은 편함 권한 과다 부여가 흔하고, 영상 경로 검증은 별도로 필요함 화면보다 이벤트가 중요할 때만 제한적으로 권합니다.
    ONVIF + RTSP 병행 이벤트와 라이브 뷰를 둘 다 쓸 때 기능은 가장 풍부함 권한, 포트, 디버깅 포인트가 늘어남 대부분 여기로 가지만, 계정과 네트워크 분리를 같이 하지 않으면 금방 지저분해집니다.
    카메라 전용 VLAN/서브넷 카메라 수가 2대 이상이거나 장기 운영할 때 격리, 룰 관리, 문제 분리가 쉬움 초기 라우팅과 방화벽 정책 설계가 필요함 하나만 먼저 하라면 저는 이걸 고릅니다.

    네트워크 분리는 단순히 “분리했다”에서 끝나지 않습니다. 누가 누구에게 먼저 말을 걸 수 있는지를 줄이는 작업에 가깝습니다. 카메라는 Home Assistant에 필요한 포트만 열고, 관리용 PC는 관리 페이지에만 접근하고, 인터넷으로 직접 나가는 경로는 기본 차단하는 식이죠. 이 구조를 먼저 잡아두면 카메라가 늘어나도 판단 기준이 흔들리지 않습니다.

    3. 제가 쓰는 연동 전 체크리스트

    1. 펌웨어부터 확인: 최신 안정 버전으로 맞추고, 업데이트 직후 ONVIF 프로필과 RTSP 경로가 바뀌지 않았는지 같이 봅니다.
    2. 기본 계정 정리: 기본 admin 계정은 비활성화하거나 강한 비밀번호로 바꾸고, Home Assistant용 계정은 별도로 만듭니다.
    3. 권한 최소화: Home Assistant 계정에는 영상 조회와 필요한 이벤트 권한만 주고, 사용자 관리나 네트워크 설정 권한은 빼둡니다.
    4. 관리 평면 분리: 카메라 웹 UI는 관리 단말 또는 관리 VLAN에서만 열리게 하고, 일반 사용자 대역에서는 막습니다.
    5. 시간 동기화: 카메라, Home Assistant, 리버스 프록시, NVR이 있다면 그 장비까지 NTP 기준을 맞춥니다.
    6. 스트림 전략 결정: 대시보드에는 서브 스트림, 녹화나 분석은 메인 스트림처럼 역할을 나눕니다.
    7. 외부 접속 원칙 결정: 직접 포트포워딩은 피하고, VPN 또는 인증이 명확한 프록시 경로 중 하나만 표준으로 정합니다.
    8. 검증 경로 준비: nmap, ffprobe, 패킷 캡처, Home Assistant 로그 확인 순서를 미리 정해둡니다.

    여기서 특히 많이 놓치는 게 시간 동기화입니다. 연동은 되는데 이벤트 타임라인이 엇갈리고, 녹화 파일 시각과 자동화 시각이 다르면 원인 찾는 속도가 확 떨어집니다. “움직임 감지됐다는데 왜 같은 시각 로그가 없지?” 하고 헤매는 경우가 은근 많더라고요. 저는 카메라 세팅 끝내면 NTP부터 꼭 확인합니다.

    4. 실전 구현 1: 네트워크와 포트부터 줄입니다

    실전에서는 카메라가 노출한 서비스부터 확인합니다. 제 기준은 간단합니다. 예상한 포트만 열려 있어야 하고, 예상한 대상에게만 닿아야 합니다. 카메라가 Home Assistant에 스트림을 제공하는 건 괜찮지만, 외부 DNS나 제조사 클라우드 주소로 계속 통신하고 있으면 다시 봐야 합니다. P2P 기능이 숨어 있는 장비도 생각보다 많았습니다.

    제가 보통 먼저 돌리는 확인 명령은 아래 순서입니다.

    # 1) 카메라가 실제로 어떤 TCP 포트를 열고 있는지 확인
    nmap -Pn -sT -sV -p- 192.168.30.10
    
    # 2) RTSP 스트림이 정상인지 Home Assistant 바깥에서 먼저 검증
    ffprobe -v error -rtsp_transport tcp \
      -show_entries stream=index,codec_name,codec_type,width,height \
      -show_entries format=format_name \
      -of default=noprint_wrappers=1 \
      "rtsp://ha_viewer:[email protected]:554/stream1"
    
    # 3) 카메라가 예상 밖 목적지와 통신하는지 관찰
    sudo tcpdump -ni any host 192.168.30.10

    이 세 개만 제대로 봐도 원인 분리가 꽤 빨라집니다. 코드 블록은 예시라서, 실제 환경에서는 IP와 계정명, RTSP 경로를 장비에 맞게 바꿔서 확인하시면 됩니다.

    • nmap에서 웹 관리 포트, ONVIF 포트, RTSP 외에 낯선 서비스가 보이면 먼저 정리합니다.
    • ffprobe가 여기서 실패하면 Home Assistant 문제가 아니라 스트림 URL, 계정 권한, 코덱, 네트워크 경로 문제일 확률이 높습니다.
    • tcpdump에서 카메라가 Home Assistant 말고 다른 내부 장비나 외부 공인 IP와 자주 대화하면, 의도한 경로인지부터 따져봐야 합니다.

    방화벽은 장비마다 문법이 다르니 원칙을 먼저 잡는 게 낫습니다. 저는 보통 이렇게 나눕니다.

    • 카메라 VLAN -> Home Assistant: RTSP와 필요한 이벤트 포트만 허용
    • 관리 VLAN -> 카메라: 웹 UI 등 관리 포트만 허용
    • 카메라 VLAN -> 인터넷: 기본 거부
    • 일반 사용자 VLAN -> 카메라: 기본 거부

    리눅스 기반 방화벽이라면 아래처럼 시작하는 편이 이해가 쉽습니다. 인터페이스명과 IP는 환경에 맞게 바꿔야 하지만, 논리는 그대로 가져가면 됩니다.

    # nftables 예시: 기본은 막고, 필요한 경로만 허용
    sudo nft add table inet camfilter
    sudo nft 'add chain inet camfilter forward { type filter hook forward priority 0; policy drop; }'
    sudo nft add rule inet camfilter forward ct state established,related accept
    sudo nft add rule inet camfilter forward iifname "vlan30_cam" ip daddr 192.168.10.20 tcp dport { 554 } accept
    sudo nft add rule inet camfilter forward iifname "vlan10_mgmt" ip daddr 192.168.30.0/24 tcp dport { 80, 443 } accept

    제가 이 단계에서 중요하게 보는 건 “열어둘 포트 목록”보다 “닫아둘 기본 방향”입니다. 카메라는 업데이트할 때만 잠깐 인터넷이 필요할 수 있습니다. 그래서 상시 허용보다 일시 허용 후 다시 차단이 운영이 훨씬 편하더라고요.

    Home Assistant IP 카메라 방화벽 정책 흐름 이미지

    카메라 전용 대역에서 Home Assistant로만 제한적으로 접근하도록 설계한 예시입니다.

    5. 실전 구현 2: Home Assistant 쪽 설정도 같이 잠급니다

    카메라만 분리해도 절반은 정리되지만, Home Assistant가 느슨하면 사고 기록이 흐려집니다. 특히 리버스 프록시를 거치는 환경에서는 Trust X-Forwarded-For, Trusted proxies, 로그인 차단 정책을 같이 봐야 합니다. 다만 2026년 현재 Home Assistant의 HTTP 서버 설정은 보통 Settings > System > Network에서 관리하므로, 예전처럼 configuration.yaml의 http: 블록만 기준으로 보면 오히려 헷갈릴 수 있습니다.

    실전 점검 포인트는 이렇습니다.

    • Trusted proxies에는 실제 앞단 프록시 IP나 정확한 CIDR만 넣습니다. 대충 넓게 잡으면 나중에 해석이 꼬입니다.
    • Enable IP banning과 로그인 시도 제한은 켜두되, 먼저 프록시를 신뢰하는 방식이 맞는지 확인합니다.
    • CORS allowed origins는 필요한 도메인만 넣습니다. 편하다고 넓게 열어두면 괜히 문제만 늘어납니다.
    • SSL profile은 특별한 호환성 문제가 있을 때만 조정합니다. 기본값을 괜히 건드릴 필요는 거의 없었습니다.

    하나 더 짚고 갈 부분이 있습니다. 로그인 실패나 차단 로그는 환경에 따라 프록시 주소 위주로 보일 수 있어서, Home Assistant 로그만으로 원본 IP를 항상 정확히 복원할 수 있다고 기대하면 안 됩니다. 이럴 때는 프록시 access log와 같이 봐야 훨씬 정확합니다. 이거 한 번 이해해두면, 나중에 분석할 때 진짜 편합니다.

    카메라 통합 계정도 저는 분리합니다. 공식 ONVIF 문서도 Home Assistant 전용 사용자를 따로 만들고, 현재 기능 범위에서는 표준 사용자 권한이면 충분하다고 안내합니다. PTZ를 안 쓰면 PTZ 권한을 안 주고, 이벤트를 안 쓰면 ONVIF 자체를 줄이거나 끄는 편이 낫습니다. 연동 편의와 공격면은 거의 항상 같이 움직입니다.

    # automations.yaml
    - id: camera_motion_notification
      alias: Front Door Motion Notification
      triggers:
        - trigger: state
          entity_id: binary_sensor.front_door_motion
          to: "on"
      conditions:
        - condition: state
          entity_id: input_boolean.alerts_enabled
          state: "on"
      actions:
        - action: notify.mobile_app_phone
          data:
            title: "Front Door Motion"
            message: "현관 카메라 이벤트가 감지됐습니다."
      mode: single

    이 자동화 예시는 현재 Home Assistant YAML 문법 기준에도 맞는 형태입니다. 자동화는 결국 이벤트를 만든 주체와, 알림을 보낸 주체를 분리해서 추적할 수 있게 짜두는 게 핵심입니다.

    외부 접속 방식은 이렇게 고릅니다

    방식 장점 주의점 추천 상황
    직접 포트포워딩 당장 붙이기는 쉬움 관리 포트와 인증 표면이 인터넷에 그대로 노출될 수 있음 사실상 비추천
    VPN 내부망 기준으로 통제하기 쉬움 초기 설정, 기기별 접속 경로 관리가 필요함 개인 홈랩, 소규모 운영, 보안 우선 환경
    리버스 프록시 + 접근 통제 서비스별 정책 분리, 인증 연동이 쉬움 프록시 신뢰 범위, 원본 IP 전달, 인증 체계 설계가 중요함 여러 내부 서비스를 함께 운영할 때

    제 추천은 분명합니다. 혼자 운영하는 홈랩이면 VPN이 먼저입니다. 반대로 Home Assistant 외에도 여러 웹 서비스를 묶어 외부에 내보내야 하고, 접근 제어를 한 곳에서 관리해야 한다면 리버스 프록시 + 엄격한 trusted proxy 설정이 더 맞습니다. 직접 포트포워딩은 임시 테스트에서도 습관이 되면 별로더라고요.

    Home Assistant IP 카메라 ONVIF 연동 설정 이미지

    Home Assistant에서 카메라 통합을 추가하고 이벤트 자동화를 연결하는 흐름을 설명하는 이미지입니다.

    6. 자주 겪는 문제와 해결법

    이 구간은 제가 실제로 가장 많이 손댄 부분입니다. “아예 안 됨”보다 “가끔 됨”이 더 어렵습니다. 그래서 증상보다 근본 원인으로 묶어보는 편이 훨씬 낫습니다.

    1) ONVIF는 잡히는데 영상이 안 나오는 경우

    이건 보통 제어 채널과 스트림 채널이 분리돼 있을 때 생깁니다. 장치 정보는 읽히는데, 실제 스트림 URL이나 코덱 지원이 표시 경로와 안 맞는 겁니다.

    • 근본 원인: ONVIF 프로필 조회는 성공했지만 RTSP 경로가 다르거나 인증 정보가 다릅니다.
    • 근본 원인: 카메라 기본 스트림이 H.265 위주인데, 표시 경로나 중간 구성요소가 기대대로 처리하지 못합니다.
    • 해결 순서: ffprobe로 스트림 자체 검증 -> VLC 등 별도 플레이어 검증 -> Home Assistant 통합 문제 확인 순으로 나눕니다.

    2) 로그인 실패 차단이 정상 사용자에게 걸리는 경우

    이건 거의 항상 프록시 신뢰 설정이나 앱 URL 설정 문제였습니다. Home Assistant가 실제 사용자 흐름을 충분히 구분하지 못하면, 여러 사용자의 실패 시도가 한 지점에 뭉쳐 보일 수 있습니다.

    # Home Assistant OS/SSH 애드온 환경에서 로그 보기
    ha core logs
    
    # 컨테이너 배포라면
    docker logs -f homeassistant
    
    # 프록시가 있다면 access log에서도 실제 전달 흐름 확인
    sudo tail -f /var/log/nginx/access.log
    • 같은 프록시 주소만 반복되면 프록시 로그와 Home Assistant 설정을 같이 확인합니다.
    • 짧은 시간에 여러 계정 실패가 보이면 외부 스캔인지, 비밀번호 관리자 자동 재시도인지 먼저 분리합니다.
    • 특정 모바일 앱만 반복 실패하면 저장된 이전 세션이나 잘못된 내부 URL을 물고 있는 경우가 많습니다.

    3) 홈랩 감시 시스템이 느려지는 경우

    이때 Home Assistant를 범인으로 단정하면 해결이 늦습니다. 병목은 대개 스트림 디코딩, 저장소 I/O, 데이터베이스 기록, 네트워크 재전송 중 하나에서 납니다.

    • 라이브 뷰가 느리다: 메인 스트림 대신 서브 스트림을 대시보드에 붙입니다.
    • 자동화는 되는데 화면이 버벅인다: 영상 처리와 상태 자동화를 같은 계층에서 무리하게 같이 하고 있지 않은지 봅니다.
    • DB가 커진다: recorder 범위를 줄여 카메라 관련 부수 이벤트까지 전부 기록하지 않게 합니다.
    • 가끔만 끊긴다: 무선 구간, 케이블, 스위치 상태를 보기 전에 tcpdump나 스위치 통계로 재전송 징후를 확인합니다.

    저는 보통 이렇게 결정합니다. 대시보드용 영상은 보기 편한 서브 스트림, 분석이나 녹화는 별도 구성요소, Home Assistant는 상태와 자동화 중심. 이렇게 역할을 나누면 성능 이슈가 생겨도 어디를 손봐야 할지 금방 좁혀집니다.

    7. 검증은 이렇게 합니다: 연결 성공보다 중요한 확인 포인트

    연동이 끝난 직후보다, 하루 지나고 일주일 지나도 같은 상태가 유지되는지가 더 중요합니다. 저는 아래 항목을 통과해야 “붙였다”고 봅니다.

    1. 외부 노출 검증: 외부 네트워크에서 카메라 RTSP와 웹 관리 포트가 직접 보이지 않는지 확인합니다.
    2. 권한 검증: Home Assistant용 계정으로 카메라 설정 변경, 사용자 추가, 네트워크 변경이 안 되는지 확인합니다.
    3. 이벤트 검증: 실제 움직임을 만들어 엔티티 상태 변화, 알림, 로그 타임스탬프가 이어지는지 봅니다.
    4. 재부팅 복구 검증: 카메라 재부팅 후 스트림 재연결과 자동화 복구가 되는지 확인합니다.
    5. 로그 품질 검증: 프록시 로그, Home Assistant 로그, 카메라 로그에서 시간과 출발지 정보가 어떻게 남는지 교차 확인합니다.

    판단 기준도 애매하게 두지 않는 게 좋습니다. 저는 이렇게 봅니다. 엔티티 상태가 안 바뀌면 이벤트 수집 문제, 상태는 바뀌는데 알림이 안 오면 자동화 문제, 알림은 오는데 영상만 안 보이면 스트림 문제입니다. 이 순서로 자르면 디버깅 시간이 꽤 줄어듭니다.

    Home Assistant IP 카메라 대시보드 검증 이미지

    연동 후 검증해야 할 대시보드 요소와 이벤트 이력을 보여주는 결과 예시입니다.

    8. 운영하면서 지키면 좋은 습관

    • 카메라별 정책 분리: 실내 카메라와 실외 카메라를 같은 권한, 같은 노출 정책으로 묶지 않습니다.
    • 문서화: 카메라 모델, IP, 스트림 URL, Home Assistant 계정, 관리 계정 위치를 남겨둡니다.
    • 변경 이력 관리: 펌웨어 업데이트 뒤 RTSP 경로, ONVIF 동작, 이벤트 엔티티 이름이 바뀌었는지 확인합니다.
    • 정기 점검: 포트 스캔, 계정 점검, 방화벽 정책, 외부 노출 여부를 주기적으로 다시 봅니다.
    • 백업 분리: Home Assistant 설정 백업과 카메라 설정 백업을 같은 위치에만 두지 않습니다.

    운영 습관에서 제일 체감이 컸던 건 문서화였습니다. 카메라가 1대일 때는 기억으로 버티지만, 3대만 넘어가도 “이 스트림이 메인인가 서브인가”, “이 계정이 관리자였나 읽기 전용이었나” 금방 헷갈립니다. 그때부터는 문제 해결보다 기억 복구에 시간을 더 쓰게 되더라고요.

    같이 읽으면 좋은 글도 내부 링크로 묶어두세요. 예를 들어 Home Assistant 관련 가이드나 네트워크 분리, 리버스 프록시 설정 글을 함께 연결해두면 검색 유입 후 체류 시간이 확실히 좋아집니다.

    9. FAQ와 마지막 권고

    Q. Home Assistant에서 카메라만 보이면 끝 아닌가요?

    아닙니다. 보이는 건 기능 확인일 뿐이고, 보안 확인은 따로 해야 합니다. 관리 포트 노출, 계정 권한, 외부 접근 경로, 로그 품질까지 같이 봐야 실제 운영 기준을 통과합니다.

    Q. ONVIF를 끄고 RTSP만 쓰는 게 더 안전한가요?

    PTZ나 카메라 이벤트가 필요 없으면 공격면을 줄이는 데 도움이 됩니다. 반대로 이벤트 연동이 필요하면 ONVIF를 쓰되, 관리자 계정 대신 최소 권한 계정으로 붙이는 편이 훨씬 현실적입니다.

    Q. 가장 먼저 하나만 하라면 뭘 하시겠어요?

    카메라 네트워크 분리입니다. 그다음이 Home Assistant 전용 읽기 계정, 마지막이 외부 접근 경로 정리입니다. 이 순서가 체감 효과가 제일 컸습니다.

    제 권고는 명확합니다. 집에서 소규모로 운영하고, 실사용 안정성이 더 중요하다면 VPN + 카메라 전용 네트워크 + Home Assistant 전용 읽기 계정으로 가세요. 반대로 여러 내부 서비스를 함께 공개해야 하고 인증과 접근 제어를 중앙에서 관리해야 한다면 리버스 프록시 + 좁게 잡은 trusted proxy + 로그 검증 체계가 맞습니다. 직접 포트포워딩은 편한 시작처럼 보여도 운영 부채가 큽니다. 저는 이제 카메라가 잘 뜨는지보다, 몇 달 뒤에도 조용히 제한된 상태로 잘 도는지를 더 중요하게 봅니다.

    Home Assistant IP 카메라 보안 체크리스트 요약 이미지

    네트워크 분리, 계정 최소 권한, 외부 접속 방식 선택을 한 장으로 정리한 요약 이미지입니다.

  • [HomeLabs] UniFi Protect 비용 vs DIY NVR, 장기 운영비까지 비교

    [HomeLabs] UniFi Protect 비용 vs DIY NVR, 장기 운영비까지 비교

    UniFi Protect 비용 vs DIY NVR, 오래 굴리면 뭐가 남을까

    집이나 소규모 사무실에 카메라를 붙이기 시작하면 결국 UniFi Protect 비용 이야기를 피하기 어렵습니다. 처음엔 본체와 카메라 가격만 보게 되는데, 막상 운영에 들어가면 저장소, PoE 스위치, UPS, 원격 접속, 디스크 교체, 장애 대응 시간까지 전부 비용으로 돌아오거든요. 저도 홈랩에서 DIY NVR을 오래 굴려봤고, 반대로 관리 포인트가 적은 어플라이언스형 구성도 써봤는데, 오래 남는 차이는 감가상각보다 운영 피로도였습니다.

    이번 글은 특정 브랜드를 밀려는 글이 아닙니다. 보안 카메라 시스템 비용을 왜 자꾸 잘못 계산하게 되는지, 그리고 홈랩 기준으로 어떤 선택이 덜 후회되는지 실무 관점으로 정리해 보려는 글입니다. UniFi Protect는 지원되는 UniFi Console과 전용 앱 경험을 중심으로 운영 복잡도를 줄이는 방식에 가깝고, DIY NVR은 Frigate, ZoneMinder, Shinobi 같은 조합으로 하드웨어 자유도를 얻는 대신 운영 책임을 직접 져야 합니다. 여기서는 최근 문서와 실제 구축 예시가 풍부한 Frigate 기준 DIY NVR을 예로 들겠습니다.

    UniFi Protect 비용 비교를 위한 전체 아키텍처 다이어그램

    UniFi Protect 전용 콘솔 구조와 DIY NVR의 서버, 스토리지, PoE 스위치, 카메라 연결 흐름을 한눈에 보여주는 비교 아키텍처입니다.

    UniFi Protect 비용 계산이 자꾸 틀어지는 이유

    NVR은 한 번 설치하고 끝나는 가전이 아니라, 계속 쓰기 부하를 받는 기록 시스템입니다. 그래서 구매 시점에는 안 보이던 비용이 운영 3개월차쯤부터 슬슬 드러납니다. 특히 아래 네 가지를 빠뜨리면 계산이 거의 항상 틀어지더라고요.

    • 전력과 발열: 24시간 켜 두는 시스템이라 전기요금보다 발열, 팬 소음, 먼지 축적, 쓰로틀링이 먼저 문제를 만드는 경우가 많습니다.
    • 디스크 수명: 영상 저장은 읽기보다 쓰기가 훨씬 많습니다. 운영체제 디스크와 녹화 디스크를 섞어 두면 성능 문제와 장애 복구가 같이 옵니다.
    • 장애 대응 시간: 로그를 읽고 원인을 좁히는 데 드는 시간이 실제 비용입니다. 홈랩에서는 이 항목이 숫자로 안 보여서 더 과소평가됩니다.
    • 가족 사용성: 나만 보는 시스템이면 DIY의 불편함을 버틸 수 있어도, 가족이나 동료가 같이 쓰면 앱 품질과 재생 일관성이 바로 비용으로 체감됩니다.

    이 지점에서 Protect와 DIY의 성격 차이가 또렷해집니다. Protect는 비용이 앞단에 몰려 있고, DIY는 비용이 뒷단에 퍼집니다. 전자는 지갑이 먼저 아프고, 후자는 시간이 먼저 아픕니다.

    UniFi Protect vs DIY NVR, 개념부터 다릅니다

    Protect는 용도 고정형 장비에 가깝고, DIY는 조합형 플랫폼에 가깝습니다. 이 차이는 단순 취향 문제가 아니라 장애 범위와 책임 소재를 바꿉니다.

    UniFi Protect 쪽

    Protect를 쓰면 콘솔, 저장소, 앱, 카메라 동작 방식이 한 생태계 안에서 맞물립니다. 게다가 현재는 ONVIF 호환 서드파티 카메라도 일부 연동할 수 있어서, 예전보다 선택 폭이 넓어졌습니다. 다만 고급 AI 기능은 UniFi 카메라나 별도 AI 액세서리 쪽이 더 유리한 편이라, 가장 매끄러운 경험은 여전히 UniFi 중심 구성에서 나옵니다.

    이 구조의 장점은 분명합니다. 문제가 생겨도 의심해야 할 층이 적습니다. 저장소 상태가 안 좋은지, 콘솔이 과부하인지, 카메라 링크가 흔들리는지 정도로 범위를 좁히기 쉬워요. 다시 말해 비용의 예측 가능성이 높습니다. 장기 운영에서는 이게 생각보다 크게 느껴집니다.

    DIY NVR 쪽

    DIY는 RTSP나 ONVIF 기반 카메라를 섞어 쓸 수 있고, 이미 가지고 있는 미니 PC나 NAS, 서버를 재활용할 수 있습니다. 문제는 자유도만큼 변수도 늘어난다는 점입니다. 같은 “영상이 끊긴다”는 증상도 실제 원인은 제각각입니다. 카메라 서브스트림 미설정일 수도 있고, ffmpeg 재연결 루프일 수도 있고, 디스크 await 증가일 수도 있고, 하드웨어 디코딩이 빠져 CPU가 포화된 것일 수도 있습니다.

    제 경험상 DIY NVR의 진짜 난점은 기능 부족이 아닙니다. 문제가 생겼을 때 어디부터 의심해야 하는지 초기에 감이 잘 안 잡힌다는 점이 더 큽니다. 이게 쌓이면 비용보다 피로도가 먼저 올라갑니다.

    UniFi Protect 비용은 이렇게 나눠 봐야 덜 속습니다

    UniFi Protect 비용을 제대로 보려면 초기 구매비만이 아니라 운영 구조까지 같이 봐야 합니다. 아래 표는 실제 비교할 때 꽤 유용한 프레임입니다. 가격표보다 나은 이유는, 어떤 항목이 장기 TCO를 밀어 올리는지 바로 보이기 때문입니다.

    항목 UniFi Protect DIY NVR 실무 판단 기준
    초기 장비 콘솔과 카메라 조합이 사실상 세트에 가깝습니다 기존 서버, NAS, 미니 PC 재활용이 가능합니다 남는 장비가 없으면 체감 격차가 줄고, 남는 장비가 많으면 DIY가 훨씬 유리해집니다
    설치 난이도 초기 설정이 짧고 시행착오가 적습니다 스트림, 저장소, 권한, 가속 설정을 직접 맞춰야 합니다 첫 주말 안에 끝내고 싶다면 Protect 쪽이 더 안전합니다
    카메라 선택권 UniFi 중심일 때 가장 매끄럽고, 일부 ONVIF 카메라도 연동 가능합니다 RTSP/ONVIF 카메라를 폭넓게 섞을 수 있습니다 기존 카메라를 최대한 살려야 하면 DIY가 더 현실적입니다
    저장소 설계 구조가 단순하고 예상이 쉽습니다 OS 디스크, 녹화 디스크, 보존 정책을 직접 설계합니다 영상 보존 일수와 I/O 패턴을 이해하지 않으면 DIY에서 먼저 문제 납니다
    장애 범위 원인 추적 범위가 좁습니다 네트워크, 컨테이너, ffmpeg, 디코딩, 파일시스템까지 넓습니다 운영 경험이 적을수록 Protect의 시간 절약 효과가 커집니다
    확장 시 비용 예측은 쉽지만 생태계 안에서 확장해야 합니다 부품 단위로 늘릴 수 있지만 병목도 함께 늘어납니다 카메라 수가 늘수록 DIY는 설계 품질 차이가 크게 납니다
    가족/동료 사용성 앱 경험이 균일하고 인계가 쉽습니다 UI와 알림 품질이 조합에 따라 편차가 큽니다 공용 인프라라면 사용성 저하가 곧 숨은 비용입니다
    장기 TCO 돈을 먼저 쓰고 운영 공수를 줄이는 구조입니다 돈을 아끼는 대신 운영 공수를 나중에 지불하는 구조입니다 취미인지 생활 인프라인지 먼저 구분하면 선택이 쉬워집니다

    제가 실제로 후회했던 판단은 “일단 싸게 시작해 보고, 문제 생기면 고치자”는 접근이었습니다. NVR은 그렇게 가면 거의 항상 저장소와 알림 신뢰도에서 발목이 잡힙니다. 반대로 처음부터 완성형 장비를 샀는데 내가 결국 손대는 걸 즐기는 타입이라면, 그때는 Protect가 꽤 폐쇄적으로 느껴질 수도 있습니다. 결국 비용은 숫자만의 문제가 아니라 내가 어떤 문제를 즐기고, 어떤 문제를 싫어하는가의 문제이기도 합니다.

    실전 구현: DIY NVR을 Frigate로 올릴 때 최소 구성

    DIY를 비용 효율적으로 굴리려면 “싼 부품”보다 “역할 분리”가 더 중요합니다. 제가 최소 기준으로 보는 건 세 가지입니다. 첫째, 감지 스트림과 녹화 스트림을 분리할 것. 둘째, 운영체제 디스크와 녹화 데이터를 분리할 것. 셋째, 가능하면 하드웨어 디코딩을 붙일 것. 이 세 가지를 빼면 초기 절감 효과가 운영 중 병목으로 다시 청구됩니다.

    아래 Compose 예시는 Frigate를 올릴 때 기본 뼈대로 쓰기 괜찮습니다. 최근 공식 가이드 기준으로 웹 UI 기본 포트는 8971이고, 하드웨어 가속 장치는 호스트 환경에 따라 /dev/dri/renderD128처럼 더 구체적으로 잡는 편이 안전합니다. 핵심은 /config와 /media/frigate를 분리하고, 임시 캐시와 녹화 저장소를 구분하는 데 있습니다.

    1. 카메라에서 메인스트림과 서브스트림이 각각 살아 있는지 먼저 확인합니다.
    2. 감지는 저해상도 서브스트림, 녹화는 메인스트림으로 분리합니다.
    3. 녹화 볼륨은 OS가 설치된 디스크와 분리합니다.
    4. 컨테이너가 재부팅 후 자동 복구되는지 먼저 확인한 다음 세부 튜닝으로 들어갑니다.
    services:
      frigate:
        container_name: frigate
        image: ghcr.io/blakeblackshear/frigate:stable
        restart: unless-stopped
        stop_grace_period: 30s
        shm_size: "512mb"
        ports:
          - "8971:8971"
          - "8554:8554"
          - "8555:8555/tcp"
          - "8555:8555/udp"
        volumes:
          - ./frigate/config:/config
          - ./frigate/media:/media/frigate
          - type: tmpfs
            target: /tmp/cache
            tmpfs:
              size: 1000000000
          - /etc/localtime:/etc/localtime:ro
        devices:
          - /dev/dri/renderD128:/dev/dri/renderD128

    컨테이너만 띄운다고 끝나지 않습니다. 실제 안정성은 설정 파일에서 갈립니다. 처음 구성할 때는 아래 네 가지를 꼭 봅니다. mqtt.enabled를 안 쓸 거면 명시적으로 끌 것, record.enabled를 켤 것, ffmpeg.hwaccel_args를 하드웨어에 맞출 것, 카메라 입력에 roles를 분리할 것. 특히 마지막은 성능 차이가 바로 납니다.

    Frigate 컨테이너, RTSP 입력, 감지용 서브스트림, 녹화용 메인스트림, 스토리지 볼륨이 어떻게 연결되는지 보여주는 구성도입니다.

    mqtt:
      enabled: false
    
    ffmpeg:
      hwaccel_args: preset-vaapi
    
    record:
      enabled: true
    
    snapshots:
      enabled: true
    
    cameras:
      front_door:
        ffmpeg:
          inputs:
            - path: rtsp://viewer:{FRIGATE_RTSP_PASSWORD}@192.168.10.20:554/cam/realmonitor?channel=1&subtype=2
              roles:
                - detect
            - path: rtsp://viewer:{FRIGATE_RTSP_PASSWORD}@192.168.10.20:554/cam/realmonitor?channel=1&subtype=0
              roles:
                - record
        detect:
          width: 1280
          height: 720
          fps: 5

    이 구성이 중요한 이유는 간단합니다. 객체 감지는 높은 해상도보다 안정적인 프레임 공급이 더 중요하고, 녹화는 반대로 디테일 보존이 중요합니다. 둘을 한 스트림에 몰아넣으면 CPU와 I/O가 함께 흔들립니다. 저도 예전에 메인스트림 하나에 감지와 녹화를 같이 태웠다가, 겉으론 녹화가 되는데 이벤트 감지가 듬성듬성 빠지는 문제를 겪었습니다. 이거 처음엔 소프트웨어 버그처럼 보여서 더 헷갈리더라고요.

    스트림이 제대로 열리는지 먼저 확인하고 싶을 때는 웹 UI보다 ffprobe가 빠릅니다. 아래처럼 카메라가 내보내는 영상 특성을 먼저 확인해 두면, 나중에 detect 해상도와 fps를 조정할 때 헛손질이 줄어듭니다.

    ffprobe -hide_banner "rtsp://viewer:[email protected]:554/cam/realmonitor?channel=1&subtype=2"
    ffprobe -hide_banner "rtsp://viewer:[email protected]:554/cam/realmonitor?channel=1&subtype=0"

    UniFi Protect 비용을 안정적으로 만드는 요소

    UniFi Protect 대안을 찾는 분들이 많지만, Protect가 반복해서 선택되는 이유는 기능 수보다 운영 구조에 있습니다.

    • 원인 범위가 좁습니다: 장애 시 네트워크, 저장소, 콘솔 상태 중심으로 문제를 좁히기 쉽습니다.
    • 앱 경험이 일정합니다: 타임라인 탐색과 원격 재생에서 사용자 교육 비용이 적습니다.
    • 용량 계획이 단순합니다: 콘솔과 저장소를 중심으로 증설 판단을 하게 되니 sizing이 단순합니다.
    • 운영 시간을 아낍니다: 로그를 덜 읽어도 되는 시스템은 생각보다 값어치를 크게 합니다.

    물론 단점도 분명합니다. 기존 RTSP/ONVIF 카메라를 최대한 살리고 싶은 분에게는 여전히 제약이 느껴질 수 있고, 하드웨어 자유도도 좁습니다. 그러니 Protect는 기능 확장 플랫폼이라기보다 실패 확률을 낮추는 비용 구조라고 보는 편이 더 정확합니다. 홈랩 장난감으로 접근하면 비싸게 느껴지고, 생활 인프라로 보면 오히려 합리적으로 느껴지는 이유가 여기 있습니다.

    ⚠️ 실제로 자주 부딪히는 문제와 해결법

    여기서는 제가 실제로 여러 번 본 시나리오를 하나 적어보겠습니다. 미니 PC에 Frigate를 올리고, 감지와 녹화를 동시에 켠 상태에서 처음 며칠은 멀쩡합니다. 그런데 시간이 지나면 알림이 늦고, 이벤트 썸네일이 비거나, 특정 시간대 재생이 버벅입니다. 이때 많은 분이 “컨테이너가 불안정하다”고 생각하시는데, 실제로는 아래 세 가지가 원인인 경우가 많습니다.

    1. 서브스트림 미사용: detect가 과한 해상도를 먹으면서 디코딩 부하가 누적됩니다.
    2. 저장소 혼용: OS와 녹화가 같은 디스크를 두드리면서 await가 길어집니다.
    3. 하드웨어 가속 누락: CPU가 ffmpeg를 오래 끌고 가다가 재연결 빈도가 올라갑니다.

    이 문제는 갑자기 터지기보다 서서히 드러납니다. 그래서 더 위험합니다. 타임라인은 열리는데 탐색이 늦고, 감지는 되는데 누락이 섞이고, 로그에는 가끔씩만 재연결이 찍히는 식이죠. 이런 상태가 바로 DIY NVR의 전형적인 성능 저하 패턴입니다.

    1. 카메라에서 저해상도 서브스트림을 활성화합니다.
    2. Frigate에서 detect는 서브스트림, record는 메인스트림으로 분리합니다.
    3. 운영체제 디스크와 녹화 디스크를 분리합니다.
    4. 가능하면 하드웨어 디코딩 경로를 노출합니다.
    5. 증상이 보이면 로그만 보지 말고 디스크 지표를 먼저 확인합니다. 영상 시스템은 CPU보다 I/O가 먼저 병목 나는 경우가 꽤 많습니다.

    운영 중에는 아래 명령어를 자주 씁니다. 이 네 개만 익숙해져도 “문제가 소프트웨어인지, 저장소인지, 카메라인지”를 꽤 빠르게 가를 수 있습니다.

    docker compose up -d
    docker logs frigate --tail 100
    iostat -x 1
    smartctl -a /dev/sdb

    해석 기준도 같이 봐야 합니다.

    • docker logs frigate --tail 100에서 ffmpeg 재연결 메시지가 반복되면, 컨테이너 자체보다 RTSP 품질이나 카메라 측 스트림 안정성을 먼저 의심하는 편이 맞습니다.
    • iostat -x 1에서 특정 디스크의 await가 길게 유지되거나 %util이 계속 높으면 녹화 쓰기가 저장소를 막고 있을 수 있습니다.
    • CPU가 높아도 바로 CPU 업그레이드로 가기보다, 먼저 detect 해상도와 fps를 낮추고 서브스트림 분리를 확인하는 게 순서입니다.
    • smartctl -a에서 디스크 건강 경고나 재할당 섹터가 보이면 설정 튜닝보다 저장장치 교체가 먼저입니다.

    한 가지 더 말씀드리면, DIY에서는 “로그가 조용하니 괜찮다”가 잘 안 통합니다. 로그는 조용한데 타임라인 체감 성능이 나빠지는 경우가 꽤 있어요. 그래서 저는 홈랩 NVR을 볼 때 항상 로그와 함께 재생 UX를 같이 봅니다. 사용자가 느끼는 품질은 로그보다 UI에서 먼저 무너질 때가 많습니다.

    검증: 잘 돌아가는지 확인하는 기준

    설치가 끝났다고 바로 성공은 아닙니다. 실제 운영에서 보면 아래 네 가지가 꽤 중요합니다. 이 네 항목이 안정적이면, 대체로 그 시스템은 한동안 손이 덜 갑니다.

    보안 카메라 시스템 비용 운영 상태를 확인하는 대시보드 이미지

    CPU, 디스크 I/O, 녹화 보존 기간, 카메라 이벤트 타임라인을 함께 확인하는 운영 대시보드 예시입니다.

    1. 녹화 보존 기간: 의도한 일수만큼 파일이 실제로 유지되는지 확인합니다.
    2. 이벤트 탐색 속도: 특정 시간대로 이동할 때 UI가 버벅이지 않는지 봅니다.
    3. 알림 신뢰도: 사람이 지나갈 때 누락이 없는지, 반대로 오탐이 과한지 봅니다.
    4. 재부팅 복구력: 호스트 재시작 뒤 스트림과 녹화가 자동 복구되는지 꼭 확인합니다.
    df -h /media/frigate
    du -sh ./frigate/media
    journalctl --since "1 hour ago" | grep -Ei "docker|frigate|i/o error"

    여기서 df -h는 사용 가능한 공간을 보는 명령이고, du -sh는 실제 영상 데이터가 얼마나 쌓였는지 보는 명령입니다. 둘이 예상과 다르면 보존 정책이나 녹화 조건이 생각과 다르게 잡혀 있을 수 있습니다. journalctl에서 I/O error가 보이면 설정을 건드리기 전에 디스크, 케이블, 외장 스토리지 연결 상태부터 확인하는 편이 맞습니다.

    제가 권하는 검증 루틴도 있습니다. 카메라 한 대만 붙인 상태에서 먼저 하루를 봅니다. 그다음 카메라 수를 늘리고, 마지막에 알림과 녹화를 같이 켭니다. 처음부터 모든 기능을 한 번에 켜면 병목 원인을 분리하기 어렵습니다. 이 절차는 Protect보다 DIY NVR에서 훨씬 중요합니다.

    누구에게 어떤 선택이 맞을까

    UniFi Protect 비용이 아깝지 않은 경우는 생각보다 분명합니다. 카메라 수가 늘어날 가능성이 있고, 가족이나 동료가 같이 쓰며, 장애가 났을 때 제가 직접 ffmpeg 로그를 들여다보고 싶지 않다면 Protect 쪽이 맞습니다. 특히 보안 카메라를 취미가 아니라 생활 인프라로 보는 분이라면, 예측 가능한 비용과 낮은 운영 스트레스가 장기적으로 이깁니다.

    반대로 이미 괜찮은 서버가 있고, RTSP 카메라를 꼭 살리고 싶고, 로그 분석과 튜닝을 번거로움보다 재미로 느끼신다면 DIY NVR이 더 낫습니다. 다만 조건은 있습니다. 저장소 분리, 전원 안정성, 보존 정책, 하드웨어 디코딩까지 같이 설계할 준비가 되어 있어야 합니다. 오픈소스라서 공짜인 거지, 운영이 자동으로 쉬워지는 건 아니더라고요.

    실제로 추천 기준은 아래처럼 단순합니다.

    • 생활 인프라로 쓸 거면: Protect를 권합니다. 돈을 더 쓰더라도 시간을 덜 씁니다.
    • 홈랩 실험이 목적이면: DIY가 맞습니다. 남는 장비를 잘 활용할 수 있고 배울 것도 많습니다.
    • 기존 카메라를 반드시 살려야 하면: DIY가 더 현실적입니다.
    • 가족 사용성과 앱 완성도가 중요하면: Protect가 덜 피곤합니다.
    • 문제 해결 과정을 즐긴다면: DIY의 운영 공수 자체가 취미가 될 수 있습니다.
    • 문제가 생기면 바로 복구돼야 한다면: Protect처럼 관리 포인트가 적은 구조가 낫습니다.

    제 개인적인 판단을 한 줄로 줄이면 이렇습니다. DIY는 장비를 아끼는 방식이고, Protect는 시간을 아끼는 방식입니다. 둘 중 어느 쪽이 더 비싼지는 가격표보다 사용자의 성향이 더 크게 좌우합니다.

    UniFi Protect 비용과 DIY NVR 비용 요소 비교 인포그래픽

    초기 장비, 운영 공수, 저장소, 확장성, 장애 대응 시간을 기준으로 두 방식을 요약 비교한 인포그래픽입니다.

    짧은 FAQ

    UniFi Protect 비용은 왜 체감상 높게 느껴질까요?

    카메라만이 아니라 콘솔, 저장소, PoE, 운영 단순성까지 함께 사는 구조라서 그렇습니다. 대신 그 안에는 시행착오를 줄이는 값도 들어 있습니다.

    DIY NVR이 무조건 싸진 않나요?

    남는 장비가 있으면 시작은 저렴해 보일 수 있습니다. 하지만 디스크 교체, 장애 대응 시간, 전력, 저장소 병목 대응까지 넣으면 얘기가 꽤 달라집니다.

    홈랩 NVR로 처음 시작할 때 가장 먼저 챙길 것은 뭔가요?

    카메라를 많이 사기 전에 스트림 분리부터 하시는 게 좋습니다. 감지용 서브스트림과 녹화용 메인스트림을 나누는 것만으로도 안정성이 크게 달라집니다.

    Protect와 DIY 중 하나를 고르기 애매하면 어떤 질문을 던져야 하나요?

    “장애가 났을 때 제가 직접 만질 건가요, 아니면 바로 복구되길 원하나요?” 이 질문 하나로 방향이 꽤 명확해집니다. 전자면 DIY, 후자면 Protect가 더 잘 맞습니다.

    참고 자료

    관련해서 다음 글에서는 홈랩 NVR의 저장소 보존 기간을 실제로 어떻게 계산하는지, 그리고 PoE 스위치와 VLAN 분리를 어디까지 해야 운영이 편해지는지 이어서 다뤄보겠습니다. 이 글과 함께 읽으면 비용 계산이 훨씬 또렷해집니다.

  • [홈랩] IP 카메라 시스템 비용 분석: 클라우드 vs 온프레미스 TCO 비교

    [홈랩] IP 카메라 시스템 비용 분석: 클라우드 vs 온프레미스 TCO 비교

    [홈랩] IP 카메라 시스템 비용 분석: 클라우드 NVR vs 온프레미스 TCO

    집이나 사무실에 카메라 몇 대만 달면 끝일 줄 알았는데, 막상 계산해보면 IP 카메라 시스템 비용은 장비값보다 운영 방식에서 더 크게 갈리더라고요. 저도 처음엔 CCTV 자가 설치만 잘하면 예산이 끝나는 줄 알았습니다. 그런데 실제로 홈랩에서 굴려보니, 카메라 본체보다 클라우드 NVR(Cloud NVR, 클라우드 기반 녹화 저장 장치) 구독료, 온프레미스 NVR(On-premise NVR, 현장 설치형 녹화 장치)의 스토리지 증설, 장애 대응 시간 같은 숨은 비용이 꽤 컸습니다. 그래서 이번 글에서는 제품 홍보식 비교가 아니라, 13년차 인프라 엔지니어 관점에서 총 소유 비용, 즉 TCO(Total Cost of Ownership, 총 소유 비용)를 어떻게 봐야 하는지 정리해보겠습니다.

    특히 보안 카메라 예산을 처음 짜는 분들, 매달 나가는 비용이 부담스러운 분들, NAS나 미니 PC로 자가 구축을 고민하는 분들께 도움이 될 겁니다. 여기서 중요한 포인트는 단순히 초기 구매가가 아니라, 3년 정도 운영했을 때 누가 더 덜 피곤하고 덜 비싼가입니다.

    IP 카메라 시스템 비용 비교를 위한 클라우드 NVR와 온프레미스 NVR 아키텍처 이미지

    클라우드 녹화와 로컬 녹화의 데이터 흐름, 비용 발생 지점을 한눈에 보여주는 개요 이미지입니다.

    1. 왜 IP 카메라 시스템 비용은 생각보다 복잡할까요?

    쉽게 말해 카메라는 끝이 아니라 시작입니다. 카메라가 영상을 찍으면 그다음부터는 저장, 검색, 알림, 백업, 네트워크, 전원까지 다 돈이거든요. 제가 직접 해보니 같은 4대 구성이라도 어떤 집은 월 구독형이 편하고, 어떤 집은 온프레미스가 훨씬 이득이었습니다.

    • 초기 비용(CAPEX, Capital Expenditure): 카메라, PoE 스위치, 저장 장치, 케이블, UPS
    • 운영 비용(OPEX, Operating Expenditure): 구독료, 전기, 디스크 교체, 인터넷 업로드 부담
    • 관리 비용: 장애 대응 시간, 펌웨어 업데이트, 저장 정책 조정
    • 리스크 비용: 인터넷 장애, 디스크 장애, 계정 잠금, 벤더 종속성

    혹시 이런 경험 있으신가요? 처음엔 2대만 달았다가 사각지대 때문에 2대를 더 붙이고, 그다음엔 녹화 보관일이 부족해서 저장 공간을 늘리게 되는 패턴이요. 보통 여기서 예산이 깨집니다. 그래서 IP 카메라 시스템 비용은 반드시 확장 가능성까지 보고 잡아야 합니다.

    2. 클라우드 NVR vs 온프레미스 NVR, 개념부터 정리해보겠습니다

    클라우드 NVR이란?

    클라우드 NVR은 카메라 영상이나 이벤트 영상을 제조사 또는 서비스 사업자의 클라우드에 저장하는 방식입니다. 사용자는 앱에서 바로 보고, 저장 기간도 요금제에 따라 관리하죠. 설치는 편합니다. 정말 편해요. 대신 월 비용이 누적됩니다.

    온프레미스 NVR이란?

    온프레미스 NVR은 집이나 사무실 안에 NVR 장비, NAS, 또는 미니 PC를 두고 직접 녹화를 저장하는 방식입니다. RTSP(Real Time Streaming Protocol, 실시간 스트리밍 프로토콜)나 ONVIF(Open Network Video Interface Forum, 카메라 상호운용 표준)를 지원하는 장비를 많이 씁니다. 초기 구성은 조금 번거롭지만, 장기 운영에서는 비용 구조를 내가 통제할 수 있다는 장점이 있습니다.

    항목 클라우드 NVR 온프레미스 NVR
    초기 설치 난이도 낮음 중간~높음
    초기 장비 비용 상대적으로 낮을 수 있음 저장 장치 포함 시 높아질 수 있음
    월 고정비 발생 가능성이 큼 보통 낮음
    인터넷 의존성 높음 낮음
    확장성 요금제 의존 디스크/서버 증설로 대응
    운영 자유도 제한적 높음

    결론부터 아주 짧게 말하면 이렇습니다. 카메라 수가 적고 관리 시간을 아끼고 싶으면 클라우드 NVR, 카메라 수가 늘어나고 장기 운영비를 줄이고 싶으면 온프레미스 NVR 쪽으로 기웁니다.

    3. TCO 계산할 때 꼭 넣어야 하는 항목

    여기서 많이들 놓치는 게 있습니다. 장비값만 넣고 끝내면 안 됩니다. 저도 처음 견적 짤 때 저장용 디스크 교체 주기를 빼먹어서 다시 계산했었거든요. 삽질 좀 했습니다 ㅎㅎ

    1. 카메라 수량: 2대인지 8대인지에 따라 경제성이 완전히 달라집니다.
    2. 보관 기간: 7일, 14일, 30일 중 무엇이 필요한지부터 정해야 합니다.
    3. 녹화 방식: 상시 녹화(continuous recording)인지, 이벤트 기반 녹화(event recording)인지 확인합니다.
    4. 스토리지 중복성: RAID(Redundant Array of Independent Disks, 디스크 이중화) 여부를 넣어야 합니다.
    5. 전력 비용: 24시간 켜두는 장비는 생각보다 누적 전력비가 있습니다.
    6. 운영 인건비: 자가 구축은 내 시간이 공짜가 아닙니다.
    7. 장애 대응 리스크: 인터넷이 끊겼을 때도 녹화가 유지되는지 봐야 합니다.

    제가 실무에서 자주 쓰는 방식은 3년 기준으로 계산하는 겁니다. 이유는 간단합니다. 저장장치 수명, 카메라 추가, 요금제 누적 비용이 그쯤 되면 차이가 확 드러나거든요.

    3년 TCO = 초기 장비비 + (월 구독료 x 36) + 전력비 + 유지보수비 + 예비 부품/디스크 비용 + 운영 시간 비용

    이 공식이 엄청 정교한 건 아니지만, 실제 의사결정에는 꽤 유용합니다. 특히 총 소유 비용을 비교할 때 감으로 판단하는 걸 막아주더라고요.

    4. 실전 예시: 홈랩 기준 온프레미스 NVR 예산 잡는 방법

    제가 홈랩에서 자주 보는 구성은 이렇습니다. PoE 스위치로 전원과 네트워크를 같이 보내고, 미니 PC나 NAS에 컨테이너 기반 NVR 소프트웨어를 올리는 방식이죠. 여기서는 특정 가격을 찍기보다, 어떤 부품이 비용을 만드는지에 집중해보겠습니다.

    • IP 카메라 4대
    • PoE 스위치 1대
    • 미니 PC 또는 NAS 1대
    • 감시용 HDD 또는 SSD 캐시 + HDD 조합
    • UPS(무정전 전원 장치) 1대
    • Cat6 케이블, 커넥터, 브라켓

    여기서 중요한 포인트! 카메라 가격만 보고 들어가면 안 됩니다. 실제로는 저장장치와 전원 안정화 비용이 뒤늦게 붙습니다. 특히 정전이 잦거나 네트워크 품질이 불안정한 환경이면 UPS를 빼면 안 되겠더라고요.

    예시 구성 파일

    아래는 Docker Compose(Docker Compose, 컨테이너 묶음 실행 도구)와 YAML 예시입니다. 특정 제품 강매가 아니라, 온프레미스 NVR 흐름을 이해하기 위한 샘플로 보시면 됩니다.

    services:
      nvr:
        image: ghcr.io/blakeblackshear/frigate:stable
        container_name: frigate
        privileged: true
        restart: unless-stopped
        shm_size: "256mb"
        ports:
          - "5000:5000"
          - "8554:8554"
        volumes:
          - /etc/localtime:/etc/localtime:ro
          - ./config:/config
          - ./media:/media/frigate
        environment:
          FRIGATE_RTSP_PASSWORD: "change-me"
    mqtt:
      enabled: false
    
    cameras:
      front_door:
        ffmpeg:
          inputs:
            - path: rtsp://user:{FRIGATE_RTSP_PASSWORD}@192.168.10.21:554/stream1
              roles:
                - record
        record:
          enabled: true
          retain:
            days: 7
            mode: motion

    이런 식으로 구성하면 이벤트 위주 녹화로 저장 공간을 아낄 수 있습니다. 상시 녹화보다 검색은 조금 덜 촘촘할 수 있지만, 홈 환경에서는 꽤 현실적인 타협점입니다.

    미니 PC, PoE 스위치, 카메라, 스토리지 연결 구조를 보여주는 구성 이미지입니다.

    5. 실전 구현: 네트워크와 저장 정책은 이렇게 잡으면 덜 후회합니다

    처음엔 저도 카메라만 붙이면 되는 줄 알았는데, 실제로 써보니까 네트워크 분리와 저장 정책이 운영 난이도를 거의 결정하더라고요.

    1. 카메라 전용 VLAN을 분리합니다. VLAN(Virtual LAN, 가상 랜)으로 관리망과 분리하면 보안상 훨씬 낫습니다.
    2. 고정 IP를 할당합니다. DHCP 예약도 괜찮지만 장비가 늘면 표로 정리하는 게 편합니다.
    3. 녹화 정책을 먼저 정합니다. 현관은 이벤트 기반, 외곽은 상시 녹화처럼 나누면 저장 효율이 좋아집니다.
    4. 보관 기간을 현실적으로 잡습니다. 무조건 길게가 답은 아니더라고요.
    5. 원격 접근은 VPN(Virtual Private Network, 가상 사설망) 우선으로 잡습니다.
    # RTSP 스트림 확인 예시
    ffprobe rtsp://user:[email protected]:554/stream1
    
    # 녹화 저장 경로 용량 확인 예시
    df -h /media/frigate
    
    # 컨테이너 로그 확인 예시
    docker logs -f frigate

    클라우드 NVR 쪽은 구현이 더 단순합니다. 대신 업로드 대역폭이 변수입니다. 여러 대가 동시에 이벤트를 밀기 시작하면 인터넷 환경에 따라 체감이 꽤 달라집니다. 특히 업로드가 좁은 회선에서는 라이브 뷰 지연이 생각보다 거슬릴 수 있어요.

    6. ⚠️ 트러블슈팅: 제가 실제로 부딪힌 문제들

    이 섹션은 꼭 넣고 싶었습니다. 이론대로만 하면 세상 모든 시스템이 잘 돌아가야 하는데, 현실은 그렇지 않더라고요.

    문제 1. 저장 공간이 예상보다 빨리 찼습니다

    원인은 보통 해상도, 프레임레이트, 이벤트 민감도 설정입니다. 처음엔 “좋은 화질이 최고지” 하고 높게 잡았다가 며칠 만에 디스크가 훅 줄어드는 걸 보고 정신이 번쩍 들었습니다.

    • 이벤트 기반 녹화로 전환
    • 필요 없는 서브스트림 저장 제외
    • 민감도 구역(zone) 재조정

    문제 2. 밤에 벌레랑 빗방울 때문에 이벤트가 폭증했습니다

    이거 진짜 자주 겪습니다. IR(적외선) 반사와 외부 조명 때문에 오탐(false positive)이 많아지거든요. 해결은 카메라 각도 조정, 조명 위치 변경, 탐지 영역 제한이었습니다. 소프트웨어만 만지다 보면 끝이 안 납니다. 물리 배치가 더 중요할 때가 많아요.

    문제 3. 원격 접속을 편하게 하려다 보안이 약해질 뻔했습니다

    포트 포워딩으로 바로 열어두면 편하긴 한데, 장기적으로는 권장하지 않습니다. 가능하면 VPN이나 리버스 프록시(reverse proxy, 역방향 프록시) + 인증을 쓰는 게 낫습니다. 보안 카메라 예산을 줄이려다 보안 자체를 약하게 만들면 안 되니까요.

    문제 4. 디스크 장애를 너무 늦게 알았습니다

    SMART 모니터링이나 알림 설정이 없으면 진짜 늦게 알게 됩니다. 그래서 저는 디스크 상태 알림과 저장 용량 임계치 알림은 무조건 켜두는 편입니다. 드디어 됐다 싶었는데 녹화가 비어 있으면 그 허탈함이 꽤 큽니다.

    IP 카메라 시스템 비용 운영 중 발생하는 트러블슈팅 대시보드 이미지

    실제 운영에서 자주 만나는 경고 상황과 점검 포인트를 시각화한 이미지입니다.

    7. 검증: 어떤 경우에 누가 더 유리했나

    제가 여러 번 계산해보고 운영해본 결론은 꽤 단순합니다. 카메라 수가 적고, 관리 시간을 비용으로 크게 보는 환경에서는 클라우드 NVR이 편합니다. 반대로 카메라가 늘어나고, 장기 보관과 로컬 통제가 중요하면 온프레미스 NVR이 유리해집니다. 특히 IP 카메라 시스템 비용을 3년 기준으로 보면 이 차이가 더 또렷해집니다.

    환경 추천 방식 이유
    원룸/소형 매장, 카메라 1~2대 클라우드 NVR 설치와 운영이 단순하고 초기 진입 장벽이 낮음
    단독주택/사무실, 카메라 4대 이상 온프레미스 NVR 구독 누적 비용보다 로컬 저장이 유리해질 가능성 큼
    인터넷 불안정 환경 온프레미스 NVR 망 장애 시에도 로컬 녹화 지속 가능
    관리 인력이 거의 없는 환경 클라우드 NVR 장애 대응과 앱 접근성이 상대적으로 쉬움

    검증할 때는 아래 항목을 체크해보시면 됩니다.

    1. 7일, 14일, 30일 보관 기준으로 저장 여유가 있는가
    2. 인터넷이 끊겨도 최소 녹화 요구사항을 만족하는가
    3. 카메라 2대를 추가해도 예산 구조가 유지되는가
    4. 앱 알림, 검색, 내보내기(export) 과정이 실제로 편한가

    이전 글에서 다룬 홈 네트워크 분리 이야기를 이미 보신 분이라면, 이번 구성에서 VLAN과 VPN이 왜 중요한지 더 빠르게 이해되실 겁니다. 다음 글에서는 CCTV 자가 설치 시 카메라 위치 선정과 PoE 배선 팁도 정리해보겠습니다.

    3년 기준 IP 카메라 시스템 비용과 총 소유 비용 비교 인포그래픽

    3년 운영 기준으로 무엇을 비교해야 하는지 보여주는 결과 요약 이미지입니다.

    8. 정리 + 자주 묻는 질문

    IP 카메라 시스템 비용은 카메라 가격표만 봐서는 절대 감이 안 옵니다. 저장 방식, 운영 기간, 인터넷 품질, 보관 정책, 내 시간까지 넣어야 진짜 숫자가 보입니다. 저도 처음엔 장비 스펙만 보고 골랐었는데, 결국 오래 남는 건 운영 편의성과 유지비였습니다. 사실 이게 인프라 일도 똑같거든요. 초기 구축보다 운영이 더 깁니다.

    FAQ 1. CCTV 자가 설치가 무조건 더 저렴한가요?

    무조건은 아닙니다. 소규모 구성에서는 클라우드 구독형이 시간 비용까지 포함하면 더 합리적일 수 있습니다.

    FAQ 2. 온프레미스 NVR은 NAS가 꼭 필요한가요?

    꼭 그렇진 않습니다. 미니 PC + 외장 또는 내부 저장장치 조합으로도 가능합니다. 다만 백업과 장애 대응은 더 신경 써야 합니다.

    FAQ 3. 보안 카메라 예산을 줄이려면 어디서 아껴야 하나요?

    카메라 대수와 보관 정책부터 조정하는 게 효과적입니다. 반대로 전원 안정화나 저장장치 신뢰성을 과하게 줄이면 나중에 더 비싸집니다.

    FAQ 4. 초보자는 어떤 방향이 무난한가요?

    처음이라면 2대 정도는 클라우드 NVR로 경험을 쌓고, 확장 시 온프레미스로 넘어가는 방식도 괜찮습니다. 저도 이런 식으로 단계적으로 접근하는 걸 추천합니다.

    마지막으로 한 줄 정리해보겠습니다. 편의성 우선이면 클라우드 NVR, 장기 TCO 우선이면 온프레미스 NVR입니다. 숫자보다 운영 습관과 장애 대응 성향이 더 중요할 때도 많으니, 꼭 본인 환경에 맞춰 계산해보세요.

    초기 비용, 운영 비용, 관리 난이도를 한 번에 정리한 마무리 요약 이미지입니다.