개발/영상통화

[언택트 기술 시리즈]webrtc 서버 구축 1편 -기초

키드 뮤지션 2021. 9. 3. 21:22

아자르, 스무디, 행아웃


 

언택트 시대하면 위 서비스들을 한번쯤은 들어보거나 사용해봤을 것이다. 맞다. 위 서비스들은 webrtc로 만들어진 서비스 들이다. 'webrtc = 영상통화,화상회의'라고 말할수는 없지만 영상통화 또는 화상회의 서비스를 만들기 위해선 꼭 알아야 하는 기술이 바로 webrtc이다.

(zoom은 webrtc가 아니라 자체기술이라고 한다. 갓 zoom....)

 

 


WebRTC (Web Real-Time Communication)는 웹 브라우저 간에 플러그인의 도움 없이 서로 통신할 수 있도록 설계된 API이다. W3C 에서 제시된 초안이며, 음성 통화, 영상 통화, P2P 파일 공유 등으로 활용될 수 있다.
-위키 백과사전-

 

 

필자는 영상통화 서비스를 만들기 위해서 해당 기술을 공부했다.

만약 영상통화 서비스(또는 화상회의) 를 만들고 싶다면 해당 시리즈를 읽으면 많이 도움이 될것이다. 많은 블로그를 찾아봤지만 이정도 디테일을 풀어낼 시리즈는 없을 것이라 확신한다.

 

 

우선 webrtc 종류에 대해서 알아보자.

 

 

1. mesh특징

특징

  • 미디어 정보를 직접 peer끼리 connection을 맺어 주고 받는다.
  • 서버가 필요없다고 생각할수도 있지만 peer끼리 connection을 맺기 위한 시그널 정보를 주고 받기 위한 시그널 서버가 필요하다. 
  • 시그널링 서버 구축을 위해 websocket, socket.io 와 같은 양방향 통신을 지원하는 기술을 사용해야만 한다.
  • peer에서 직접 미디어 정보를 주고 받기 때문에 peer(클라이언트)에 부하가에 생길수 있다. 
  • 1:1 구조에 적합하다. 물론 1:N 또는 N:M도 가능하지만 휴대폰이 제법 많이 뜨거워지고,빠데리가 빠르게 소진된다.

2.sfu

- peer의 부하는 mesh에 비해서 줄어들지만, 그만큼 서버의 부하가 있다.

- 1개의 upstream과 N개의 downstream을 갖는 구조이다. 

- 미디어 서버가 필요하다.

- 대규모 연결에 적합하다.

 

 

3. mcu

- peer의 부하가 가장 적다. 

- 서버의 부하는 가장 크다.

- 1개의 upstream과 1개의 downstream을 갖는 구조이다.

- 서버에서 peer의 스트림을 모아 인코딩하도 디코딩을 하기 때문에, 서버에 큰 compute power가 필요하다.

- 미디어 서버가 필요하다.

 

그럼 종류 설명을 여기 까지 하고, 본격적으로 서버 구축을 위해 달려보자.

webrtc 서버 구축을 위해선 기본적으로 4가지의 서버가 필요하다.

 

 

1. 시그널링 서버

2. stun 서버 

3. turn 서버

3. 미디어 서버

 

4개의 서버를 만들어야 하다니..... 하고 너무 어려운거 아니야? 하고 겁먹을 필요 없다. 차근차근 시리즈에서 다 풀어낼것이다. 

 

 

1. 시그널링 서버 (약속잡기 서버)

사람과 사람이 만난다고 생각해보자. 무엇부터 해야 할까? 그렇다. 약속부터 잡아야 한다. 시그널링 서버는 바로 약속을 위한 서버라고 할수 있다. 시그널링 서버는 약속을 잡기 위해서, sdp라는 프로토콜과 ice 라는 프로토콜을 사용한다. sdp와 ice 프로토콜을 서로 주고 받으며, 양방향 통신을 해야 하기 떄문에 websocket이나 socket.io등 양방향 통신 기술을 사용해야만 한다. 아마 위에 설명한 mesh를 개발중이라면 시그널링 서버에 가장 많은 시간을 할애하게 될것이다. 

 

 

2. stun 서버(약속잡기 서버2) 

stun 서버도 약속을 잡는 서버이다. 비유를 하자면 시그널링 서버는 '만나서 머할까?' 와 같은 약속을 잡는 서버이고, stun 서버는 '어디서 만날래?' 같은 약속을 잡는 서버이다. 즉, ip를 알아바주는 서버인것이다. 

stun 서버 매커니즘

'stun server 어떻게 만들지?' 하고 겁먹지 말자. 이미 만들어진 서버이다. 그냥 우리는 요청만 하면 된다. 'stun server list' 라고 인터넷에 검색해보자 수많은 strun server list 들이 있다.

 

3. turn 서버(우리만에 비밀 장소)

엄마가 나와 여친의 사이를 반대한다고 생각해보자. 그러면 어떻게 할까? 우리만의 비밀 장소에서 만날것이다. 우리만의 비밀장소 그게 바로 turn 서버이다. 

여기서 엄마는 인터넷 상의 nat이라고 할수 있다. public ip를 private ip와 매칭 시켜주는 곳인데, nat의 종류 또는 설정에 따라 접근을 허용하지 않을때도 이싸. 그래서 연결을 위해서는 nat을 우회해야만 하는데, 그 우회를 turn 서버가 해준다고 보면 된다. 하지만 비밀장소는 언제나 돈이 들어가는 법이다. 그렇기에 mesh를 개발하게 되면 가장 큰 비용을 차지하는 서버이기도 하다. turn 서버 구축이 가장 어려울것 같지만 사실 구글에서 coturn이라고 하는 turn 서버를 오픈소스로 제공해주기 때문에 해당 서버를 다운 받아서 설치하면 된다. 

 

3. 미디어 서버 

mesh를 개발한다면 사실 필요없지만, sfu와 mcu를 개발하게 된다면 꼭 필요한 서버이다. 실제로 media 정보를 주고 받아야 하기 떄문에, 많은 트래픽 비용을 발생한다. mcu의 경우에는 인코딩과 디코딩도 해야 하기 때문에 아주 큰 compute power가 들어간다. 물론 media 정보를 직접 주고 받는 서버이기에 돈도 많이 든다. 단연히 개발 난이도도 높다. 

 

 

위에서 설명을 했지만 우리는 4개의 모든 서버를 개발하지 않아도 된다. 우리는 실제로 2개의 서버만 개발 하면 된다.

 

시그널링 서버

미디어 서버

 

하지만 mesh를 개발할것이라면 미디어 서버도 필요하지 않다. 단지 시그널링 서버만 만들면 된다. 단지라고 말을 했지만 시그널링 서버를 만들떄 처리해줘야 할것들이 많다. 분산처리, 보안, 다자간 통화 연결 등...

다음 시간에는 mesh를 위한 시그널링 서버 구축에 대해서 이야기 해볼 예정이다.

 

그럼 1편은 여기서 이만~~

 

코드 우랑무탄

시크

 

 

 

참고문헌

https://developer.mozilla.org/ko/docs/Web/API/WebRTC_API