13년차의 서버실

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

[태그:] 스마트 홈 보안

  • [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] Frigate AI NVR로 홈랩 CCTV 오탐 줄인 객체 감지 최적화 사례

    [HomeLabs] Frigate AI NVR로 홈랩 CCTV 오탐 줄인 객체 감지 최적화 사례

    Frigate AI NVR로 홈랩 CCTV 오탐 줄인 객체 감지 최적화 사례

    홈랩 CCTV를 오래 굴리다 보면 제일 먼저 지치는 게 저장공간이 아니라 오탐(false positive, 잘못된 감지)입니다. 바람에 흔들리는 나뭇잎, 새벽 벌레, 비 오는 날 헤드라이트 반사까지 전부 이벤트로 찍히면, 정작 봐야 할 장면은 묻혀버리거든요. 저도 처음엔 알림이 많이 오면 좋은 줄 알았습니다. 근데 실제로 써보니까 너무 많이 울리는 시스템은 결국 안 보게 되더라고요. 그래서 이번 글에서는 Frigate AI NVR를 기준으로, 홈랩 CCTV 환경에서 객체 감지 정확도를 높이고 오탐 감소에 집중했던 과정을 사례 연구 형태로 정리해보겠습니다.

    특히 이 글은 “무조건 최신 장비를 사면 해결된다”가 아니라, 이미 가지고 있는 보안 카메라 최적화와 설정 조정만으로 어디까지 개선되는지에 초점을 맞췄습니다. 혹시 지금 홈랩 CCTV 알림 때문에 피곤하신 분이라면, 꽤 공감되실 겁니다.

    Frigate AI NVR가 카메라 스트림을 받아 객체를 감지하고 이벤트를 기록하는 전체 흐름을 보여주는 개요 이미지입니다.

    1. Frigate AI NVR가 왜 홈랩 CCTV에 잘 맞는가

    쉽게 말해 Frigate AI NVR는 카메라 영상을 받아서 사람이 직접 보기 전에, 먼저 객체를 구분해 주는 NVR(Network Video Recorder, 네트워크 비디오 레코더)입니다. 단순히 녹화만 하는 장비가 아니라, 사람이 지나갔는지 차량이 들어왔는지 같은 이벤트를 기준으로 영상을 정리해 주는 쪽에 가깝습니다.

    여기서 핵심은 모션 감지(motion detection)와 객체 감지(object detection)를 분리해서 생각하는 겁니다. 모션 감지는 픽셀 변화만 보고 움직임을 잡아내기 때문에 비, 그림자, 벌레에도 민감합니다. 반면 객체 감지는 “이게 사람인지, 차량인지”를 구분하려고 시도합니다. 물론 완벽하진 않지만, 방향이 다르죠.

    구분 모션 감지 객체 감지
    기준 화면 변화 사람, 차량 등 대상 식별
    장점 가볍고 빠름 의미 있는 이벤트 분류 가능
    단점 오탐이 많음 설정이 잘못되면 놓침 발생
    홈랩 활용 보조 지표 주 이벤트 기준

    제가 직접 해보니, 오탐 감소의 출발점은 모델이나 하드웨어보다도 카메라 구도, 감지 영역, 프레임 수, 객체 필터였습니다. 이 네 가지를 안 잡고 나머지만 만지면, 정말 삽질이 길어집니다.

    2. 오탐이 생기는 진짜 이유

    처음엔 저도 “감지 엔진이 별로인가?” 싶었는데, 실제 원인은 꽤 현실적이었습니다.

    • 야간 적외선(IR, 적외선 조명)에서 벌레가 렌즈 가까이 지나감
    • 차량 헤드라이트가 벽면에 반사되면서 큰 움직임처럼 보임
    • 현관 앞 화분이나 나뭇가지가 바람에 흔들림
    • 너무 넓은 화각으로 도로와 인도까지 같이 잡음
    • RTSP 스트림 해상도와 감지 해상도가 맞지 않아 형태가 흐려짐

    여기서 중요한 포인트가 있습니다. 오탐 감소는 AI 모델만의 문제가 아니라 입력 품질의 문제이기도 하다는 점입니다. 카메라가 쓸데없는 영역을 너무 많이 보고 있으면, Frigate AI NVR가 아무리 열심히 판단해도 헷갈릴 수밖에 없거든요.

    3. 제가 적용한 홈랩 CCTV 객체 감지 최적화 순서

    실제로는 이것저것 한 번에 건드리면 뭐가 효과 있었는지 모르게 됩니다. 그래서 저는 아래 순서로 정리했습니다.

    1. 카메라별 감시 목적 정의: 현관, 주차, 창고처럼 역할을 나눴습니다.
    2. 프레임 구도 조정: 필요 없는 도로, 하늘, 나무 영역을 최대한 빼냈습니다.
    3. 감지 해상도와 FPS(Frame Per Second, 초당 프레임 수) 조정
    4. 객체 종류 제한: 사람과 차량만 먼저 추적했습니다.
    5. 영역(Zone, 존) 기반 필터 적용
    6. 며칠 로그를 보고 다시 미세 조정

    이 순서가 중요한 이유는, 나중 단계로 갈수록 앞선 입력 품질에 의존하기 때문입니다. 예를 들어 존 설정을 정교하게 해도 카메라가 가로등 반사광을 계속 크게 잡으면 의미가 반감됩니다.

    4. 실전 구현: Docker와 Frigate 기본 구성

    제 홈랩에서는 Docker Compose로 올려서 운영하는 편이 관리가 편했습니다. 아래 예시는 구조를 이해하기 위한 기본 예시입니다. RTSP URL이나 저장 경로는 환경에 맞게 바꾸셔야 합니다.

    services:
      frigate:
        container_name: frigate
        image: ghcr.io/blakeblackshear/frigate:stable
        restart: unless-stopped
        privileged: true
        shm_size: "512mb"
        ports:
          - "5000:5000"
          - "8554:8554"
        volumes:
          - ./config:/config
          - ./media:/media/frigate
          - /etc/localtime:/etc/localtime:ro

    실행은 단순합니다.

    docker compose up -d
    docker compose logs -f frigate

    기본 설정 파일은 이런 식으로 시작했습니다.

    mqtt:
      enabled: false
    
    cameras:
      front_door:
        ffmpeg:
          inputs:
            - path: rtsp://USER:[email protected]:554/stream1
              roles:
                - detect
        detect:
          width: 1280
          height: 720
          fps: 5
        objects:
          track:
            - person
            - car
        snapshots:
          enabled: true
    
      parking:
        ffmpeg:
          inputs:
            - path: rtsp://USER:[email protected]:554/stream1
              roles:
                - detect
        detect:
          width: 1280
          height: 720
          fps: 5
        objects:
          track:
            - person
            - car

    처음엔 이것만으로도 굴러갑니다. 그런데 여기서 만족하면 오탐 감소는 반쯤밖에 안 됩니다. 진짜 차이는 다음 단계에서 나더라고요.

    Frigate AI NVR 설정과 홈랩 CCTV 감지 영역 구성 화면

    카메라별 detect 해상도, FPS, 추적 객체, 영역 설정을 조정하는 실전 구성 이미지를 넣는 자리입니다.

    5. 오탐 감소 핵심: 영역 제한과 객체 필터

    제가 가장 큰 효과를 본 건 zone(존, 감지 영역)과 track(추적 객체) 정리였습니다. 예를 들어 현관 카메라에서 굳이 고양이나 새까지 추적할 필요가 없었거든요. 사람만 제대로 잡으면 되는 환경이라면, 범위를 좁히는 게 훨씬 낫습니다.

    cameras:
      front_door:
        ffmpeg:
          inputs:
            - path: rtsp://USER:[email protected]:554/stream1
              roles:
                - detect
        detect:
          width: 1280
          height: 720
          fps: 5
        objects:
          track:
            - person
        zones:
          porch:
            coordinates: 220,720,420,420,980,420,1180,720

    이렇게 하면 화면 전체가 아니라, 실제로 사람이 서거나 지나가는 구역에 더 집중하게 됩니다. 물론 좌표는 직접 화면 보고 잡아야 해서 약간 귀찮습니다. 저도 처음엔 점 몇 개 찍는 게 뭐가 어렵나 했는데, 은근히 감각이 필요합니다. 너무 빡빡하게 잡으면 사람이 프레임 가장자리로 들어올 때 이벤트를 놓칠 수 있거든요.

    또 하나는 FPS입니다. 많은 분이 높을수록 좋다고 생각하시는데, 홈랩 CCTV 객체 감지 목적이라면 무조건 그렇진 않습니다. 오히려 감지용 스트림은 적절한 수준으로 낮춰서 안정적으로 분석하게 하는 편이 나았습니다. 특히 CPU가 빠듯한 미니 PC나 홈서버에서는 더 체감됐습니다.

    실무 느낌으로 정리한 튜닝 우선순위

    • 1순위: 카메라 각도와 불필요한 배경 제거
    • 2순위: 사람/차량처럼 필요한 객체만 추적
    • 3순위: 현관, 주차 구역 등 존 설정
    • 4순위: detect 해상도와 FPS 조정
    • 5순위: 이벤트 로그 보고 재조정

    6. ⚠️ 실제로 겪은 트러블슈팅

    이 부분은 정말 중요합니다. 설정 예시만 복붙하면 끝날 것 같지만, 현실은 늘 다르거든요. 제가 삽질했던 지점들을 정리해보겠습니다.

    1) 밤에 벌레가 사람처럼 잡히는 문제

    적외선 조명이 강한 카메라는 렌즈 앞 벌레가 크게 부각됩니다. 이 경우 소프트웨어만으로 100% 해결은 어렵습니다. 저는 카메라 위치를 조금 옮기고, 조명이 벽을 과하게 비추지 않게 조정하니 확실히 줄었습니다. 보안 카메라 최적화는 설정 파일 안에서만 일어나지 않더라고요.

    2) 비 오는 날 반사광 이벤트 폭증

    주차장 바닥이 젖으면 차량 불빛이 넓게 퍼집니다. 이때 화면 하단 반사 구역을 존 밖으로 빼거나, 실제 진입 경로만 존으로 남겨두는 식으로 정리했습니다. 이건 예상보다 효과가 컸습니다.

    3) RTSP 스트림 품질이 들쭉날쭉한 문제

    와이파이 구간이 불안정하면 감지 자체가 흔들립니다. 처음엔 객체 감지 모델을 의심했는데, 결국 네트워크 품질 이슈였습니다. 가능하면 고정 배선이나 안정적인 AP 구성이 먼저입니다.

    4) 화면은 넓은데 정작 대상은 너무 작게 나오는 문제

    한 화면에 마당 전체, 담장, 도로까지 다 넣으면 보기엔 시원합니다. 그런데 감지 정확도는 떨어질 수 있습니다. 사람 객체가 너무 작게 잡히면 분류가 불리해지거든요. 저는 차라리 카메라 역할을 나눠서 넓게 보는 카메라와 좁게 보는 카메라를 분리했습니다.

    문제 증상 해결 방향
    벌레 오탐 야간에 작은 물체가 크게 감지됨 카메라 위치, IR 반사, 구도 조정
    반사광 비 오는 날 이벤트 급증 존 축소, 반사 영역 제외
    불안정한 스트림 감지 누락, 프레임 깨짐 네트워크 안정화
    너무 넓은 화각 대상이 작아져 분류 어려움 카메라 역할 분리

    7. 검증: 어떤 기준으로 결과를 확인했는가

    최적화는 느낌으로 하면 끝이 없습니다. 저는 최소 3일 이상 로그를 보고, 같은 시간대 기준으로 비교했습니다. 예를 들어 새벽 1시부터 5시까지 이벤트 수가 얼마나 줄었는지, 실제 사람 방문 이벤트는 놓치지 않았는지를 같이 봤습니다.

    1. 최적화 전 이벤트 수를 대략 기록합니다.
    2. 존과 객체 필터를 바꾼 뒤 2~3일 관찰합니다.
    3. 오탐과 실제 이벤트를 분리해서 확인합니다.
    4. 놓친 감지가 있으면 구도 또는 존을 다시 완화합니다.

    제가 직접 해보니 가장 좋은 결과는 “이벤트 수가 적은 상태”가 아니라 의미 없는 이벤트는 줄고, 확인해야 할 이벤트는 남는 상태였습니다. 이 균형이 정말 중요합니다. 오탐 감소만 너무 밀어붙이면 진짜 사람이 지나갔는데도 안 잡히는 상황이 생길 수 있습니다.

    Frigate AI NVR 최적화 전후 오탐 감소 결과 대시보드

    최적화 전후의 이벤트 분포, 시간대별 감지 빈도, 실제 유효 이벤트 비율을 비교하는 결과 시각화 이미지입니다.

    docker logs frigate --tail 100
    curl http://localhost:5000/

    로그를 볼 때는 에러만 찾지 말고, 감지가 몰리는 시간대와 카메라를 함께 보는 게 좋습니다. 특정 카메라만 유독 시끄럽다면 소프트웨어보다 설치 위치 문제일 가능성이 큽니다.

    8. 정리와 다음 단계

    Frigate AI NVR를 홈랩 CCTV에 붙여서 오탐 감소를 시도해 보면, 결국 답은 거창한 데 있지 않았습니다. 카메라가 무엇을 보고 있는지, 어떤 객체만 추적할지, 어느 구역만 의미 있게 볼지. 이 세 가지를 정리하니 체감이 확 오더라고요. 드디어 됐다! 싶은 순간이 있었습니다.

    정리하면 이렇습니다.

    • Frigate AI NVR는 모션 감지보다 의미 있는 이벤트 정리에 강점이 있습니다.
    • 홈랩 CCTV에서는 카메라 각도와 존 설정이 오탐 감소에 가장 큰 영향을 줍니다.
    • 객체 감지는 많이 잡는 것보다, 필요한 것만 정확히 잡게 만드는 쪽이 중요합니다.
    • 보안 카메라 최적화는 소프트웨어와 설치 환경을 같이 봐야 효과가 납니다.

    혹시 지금 알림 피로가 심한 상태라면, 제일 먼저 카메라 한 대만 골라서 테스트해 보세요. 전체를 한 번에 손대면 금방 복잡해집니다. 다음 글에서는 Frigate AI NVR와 Home Assistant 연동, 그리고 이벤트 자동화 흐름도 다뤄볼 예정입니다. 이전 글에서 홈랩 네트워크 분리와 저장소 구성 얘기를 보셨다면, 이번 최적화와 연결해서 보시면 더 이해가 쉬우실 겁니다.

    Frigate AI NVR 오탐 감소 체크리스트와 최적화 요약 인포그래픽

    카메라 각도, 존 설정, 객체 필터, 네트워크 안정화 등 핵심 체크포인트를 한 장으로 정리한 요약 이미지입니다.

    자주 묻는 질문

    Frigate AI NVR를 쓰면 오탐이 완전히 없어지나요?

    아닙니다. 다만 의미 없는 이벤트를 줄이고, 확인할 가치가 있는 이벤트 비율을 높이는 데 큰 도움이 됩니다.

    객체 감지는 무조건 많은 클래스를 켜는 게 좋나요?

    아닙니다. 목적이 현관 감시라면 사람 중심으로, 주차 감시라면 차량 중심으로 좁히는 편이 관리가 쉽습니다.

    설정만 만지면 해결되나요?

    경험상 절반만 맞습니다. 카메라 위치, 조명, 반사, 네트워크 상태까지 같이 봐야 제대로 정리됩니다.