공공 영상회의 표준 연계 아키텍처

강정우·2026년 6월 25일

프로젝트

목록 보기
12/13

공공 영상회의 표준 연계 아키텍처

작성 목적: 행정안전부 고시 「행정·공공기관 영상회의시스템 상호연계 기술 표준규격」 인증 대응을 위한 기술 분석 및 구현 계획 정리
현재 스택: 8x8 JaaS / lib-jitsi-meet (SFU) · Django/DRF · NHN Cloud


1. 배경 — 표준 규격이란

행정안전부는 기관마다 제각각 구축된 영상회의 시스템 간 상호 통화·회의를 가능하게 하기 위해 「행정·공공기관 영상회의시스템 상호연계 기술 표준규격」 을 고시로 제정했다. 가장 최근 개정은 2021년 12월 13일이다.

공공조달 사업 참여 또는 지자체·행정기관 네트워크 연계 시 아래 5개 요건 충족이 요구된다.


2. 5개 인증 요건 — 현황 분석

요건내용JaaS 현재 상태
H.264영상 코덱✅ WebRTC 기본 지원
SIP 연동SIP(RFC 3261) 시그널링❌ 미지원 — Jigasi 필요
콘텐츠 공유H.239 또는 BFCP(RFC 4582)❌ 미지원 — BFCP 브리지 필요
연계 GW 연동범정부 SIP/TLS trunk 등록❌ 미지원 — Asterisk 필요
E.164 번호국제 전화번호 체계 다이얼인❌ 미지원 — 번호 레지스트리 필요

왜 JaaS만으로는 부족한가

JaaS / lib-jitsi-meet는 순수 WebRTC 스택이다. 행정기관 영상회의 인프라는 SIP(RFC 3261) 또는 H.323 기반 전용 장비 중심으로 구성되어 있어, 두 세계 사이를 잇는 별도 게이트웨이 레이어가 없으면 연결이 불가능하다.


3. 전체 아키텍처

┌─────────────────────────────────────────────────────────────┐
│                        행정기관 측                            │
│  H.323 단말 ──┐                                              │
│  SIP 소프트폰 ─┼── SIP/TLS or H.323 ──→ [ sip-gw 인스턴스 ] │
│  범정부 GW ───┘                                              │
└─────────────────────────────────────────────────────────────┘
                                │
                    ┌───────────▼───────────┐
                    │   sip-gw (신규 VM)   │
                    │ sip-gw.도메인        │
                    │                     │
                    │  Asterisk           │
                    │    ↓                │
                    │  Jigasi             │
                    │    ↓                │
                    │  E.164 레지스트리     │
                    │  (Redis 캐시)        │
                    │    ↓                │
                    │  BFCP 브리지         │
                    └───────────┬───────────┘
                                │  WebRTC (JaaS 참여자로 join)
                    ┌───────────▼───────────┐
                    │    8x8 JaaS 클라우드  │
                    │  Jitsi Videobridge   │
                    │  (SFU · 변경 없음)    │
                    └───────────┬───────────┘
                                │  WebRTC (기존 그대로)
                    ┌───────────▼───────────┐
                    │   기존 클라이언트     │
                    │  Electron 스튜디오   │
                    │  웹 클라이언트(경로당) │
                    └───────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  Django 백엔드 (icsc-platform)                          │
│  기존: 룸·JWT 관리  |  추가: E.164 API  |  추가: Jigasi 웹훅 │
└─────────────────────────────────────────────────────────────┘

핵심 원칙

  • JaaS는 변경하지 않는다. Jigasi가 WebRTC 참여자로 JaaS 룸에 join하므로 JaaS 입장에서는 클라이언트 한 명이다.
  • 기존 서버(icsc-platform, mch-media)는 건드리지 않는다. 신규 VM 1대만 추가한다.
  • 경로당 클라이언트 영향 없음. 행정기관 연계 트래픽만 sip-gw를 경유한다.

4. sip-gw 인스턴스 상세

4-1. Asterisk

SIP 세계의 교환기 역할. 인스턴스에서 가장 먼저 외부 트래픽을 수신한다.

주요 역할

  • 행정기관 SIP 단말로부터 SIP/TLS 콜 수신 (포트 5061)
  • H.323 단말 인입 시 H.323 → SIP 변환 (chan_h323 또는 외부 GW 연동)
  • Django E.164 API(또는 Redis 캐시)를 조회해 목적지 룸 ID 확인
  • 범정부 연계 GW에 SIP trunk로 등록 — 행안부 GW 입장에서 스마트실버가 SIP 서버 한 대로 인식됨
  • 내부에서 Jigasi로 콜 전달

보안 구성

구간프로토콜
외부 (행정기관 ↔ Asterisk)SIP/TLS (포트 5061) + SRTP
내부 (Asterisk ↔ Jigasi)SIP (포트 5060)

4-2. Jigasi

이 아키텍처의 핵심 브리지. SIP 콜을 WebRTC로 변환해 JaaS 룸에 참여시킨다.

동작 흐름

Asterisk → [SIP 콜 전달]
  → Jigasi: Django 웹훅에 JWT 발급 요청
  → JWT 수신
  → JaaS 룸에 WebRTC 참여자로 join
  → 미디어 브리징 시작

미디어 처리

방향처리 내용
오디오G.711 / G.722 ↔ Opus 실시간 트랜스코딩
영상H.264 pass-through (가능 시) / 불가 시 트랜스코딩

Jigasi는 Jitsi 프로젝트의 공식 컴포넌트로, JaaS 연동 레퍼런스가 공식 문서에 정리되어 있다.


4-3. E.164 레지스트리 (Redis 캐시)

Django가 원본 번호 매핑 데이터를 관리하지만, Asterisk가 콜마다 Django를 직접 호출하면 지연이 발생한다. sip-gw 내부에 Redis로 번호 매핑 테이블을 캐싱한다.

Django (원본 DB)
  → 번호 변경 시 Redis 갱신 or Asterisk reload 신호
  ↓
Redis on sip-gw (캐시)
  ← Asterisk 조회 (콜 수신 시)

번호 매핑 예시:

+82-2-XXXX-1234  →  room-id: smartsilver-gyeongrodang-42
+82-2-XXXX-1235  →  room-id: smartsilver-gyeongrodang-15

4-4. BFCP 브리지

5개 요건 중 구현 난이도가 가장 높다.

BFCP란? RFC 4582. SIP 환경에서 화면 공유 권한(floor)을 협상하는 프로토콜. H.323 환경에서는 H.239가 동일 역할을 한다.

문제: JaaS의 화면 공유는 WebRTC getDisplayMedia() 기반이며 BFCP/H.239 시그널링을 전혀 사용하지 않는다.

구현 방식 (커스텀)

SIP 단말 → BFCP floor request 수신
  → BFCP 브리지가 floor 승인
  → 헤드리스 브라우저(Puppeteer 등)가 JaaS 룸에서 화면 공유 세션 시작
  → SIP 단말의 H.239 콘텐츠 스트림을 두 번째 비디오 트랙으로 JaaS에 publish

표준 구현체가 없어 직접 개발이 필요하다. 인증 심사에서 이 요건을 어느 수준까지 검증하는지 먼저 확인하고 작업 범위를 결정하는 것을 권장한다.


4-5. 포트 정리

포트프로토콜방향용도
5060SIP UDP/TCP내부Asterisk ↔ Jigasi
5061SIP TLS외부 인바운드행정기관, 범정부 GW
10000–20000RTP/SRTP UDP양방향미디어 스트림
2855BFCP TCP외부 인바운드화면 공유 floor control
6379Redis TCP내부E.164 캐시

5. Django 추가 API

기존 icsc-platform에 엔드포인트 2개만 추가한다. 기존 룸·JWT 관리 로직은 변경하지 않는다.

5-1. E.164 번호 ↔ 룸 매핑 CRUD API

GET    /api/sip/numbers/              # 전체 번호 매핑 목록
POST   /api/sip/numbers/              # 번호 등록
PATCH  /api/sip/numbers/{number}/     # 매핑 수정
DELETE /api/sip/numbers/{number}/     # 번호 삭제

Asterisk가 콜 수신 시 이 API(또는 Redis 캐시)를 조회해 목적지 룸 ID를 얻는다. 번호 변경 시 Redis 갱신 신호도 여기서 발송한다.

5-2. Jigasi 웹훅 (JWT 발급)

POST /api/sip/jwt/
Body: { "room_id": "smartsilver-gyeongrodang-42" }
Response: { "jwt": "<JaaS JWT token>" }

Jigasi가 JaaS 룸에 join하려면 유효한 JWT가 필요하다. Jigasi가 이 엔드포인트를 호출하면 Django가 기존 JWT 발급 로직을 재사용해 토큰을 돌려준다. 기존 코드를 감싸는 얇은 레이어다.


6. 서버 구성 요약

서버역할변경 여부
icsc-platformDjango 백엔드API 2개 추가
mch-medianginx-rtmp / HLS변경 없음
sip-gw (신규)Asterisk + Jigasi + BFCP 브리지신규 생성
8x8 JaaS (클라우드)Videobridge / Jicofo변경 없음

7. 구현 우선순위

난이도와 의존성을 고려한 권장 순서다.

1단계  Asterisk 설치 + SIP 수신 기본 동작 확인
         ↓
2단계  Jigasi 설치 + JaaS 룸 join 연동 검증
         ↓
3단계  Django E.164 API + Redis 캐시 구성
         ↓
4단계  범정부 연계 GW에 SIP trunk 등록
         ↓
5단계  BFCP 브리지 (심사 요건 수준 확인 후 범위 결정)

1~4단계가 완료되면 SIP 연동·연계 GW·E.164 세 가지 요건이 충족된다. H.264는 JaaS가 이미 지원하므로 4개 요건이 동시에 해결된다. BFCP는 별도 단계로 분리 진행한다.


8. 참고 자료

profile
智(지)! 德(덕)! 體(체)!

0개의 댓글