줌,구글미트는 어떻게 동작할까? 실시간 통신과 WebRTC
줌이나 구글미트 링크 하나만 누르면 노트북과 카메라가 알아서 회의실로 들어갑니다. 한 번도 만난 적 없는 사람과 화면을 사이에 두고 거의 끊김 없이 대화가 오갑니다. 이게 가능해진 것이 그리 오래된 일이 아닙니다. 10년 전만 해도 화상회의는 별도의 프로그램을 깔고, 카메라 설정을 만지고, 그래도 끊기는 일이 흔했습니다.
이번 글에서는 화상회의가 그 짧은 클릭 뒤에서 어떤 일을 하는지, 그리고 그 일을 표준화한 WebRTC가 무엇인지를 코드 없이 정리하겠습니다.
화상회의가 하는 세 가지 일 #
화상회의 도구는 결국 세 가지 일을 동시에 처리합니다. 카메라와 마이크에서 영상,소리를 잡아내는 캡처, 그 신호를 네트워크로 보낼 수 있게 잘게 부수고 압축하는 인코딩, 그리고 그 결과를 상대방까지 빠르게 보내는 전송입니다.
카메라가 보낸 원본 영상은 한 장이 수십 MB에 달해서 그대로 보내면 1초도 안 돼 인터넷이 막혀 버립니다. 그래서 영상은 H.264,VP9,AV1 같은 코덱으로 압축돼 원본의 수백 분의 1 크기까지 줄어들고, 그 작은 토막이 1초에 30번 정도 상대방에게 전달됩니다.
실시간이 어려운 이유 #
화상회의에서 가장 까다로운 조건은 화질이나 음질이 아니라 지연입니다. 영화는 1분 늦게 도착해도 처음부터 천천히 보면 되지만, 회의는 상대방의 입 모양과 소리가 1초만 어긋나도 대화가 깨집니다. 보통 100~200ms 안쪽이면 사람이 어색함을 거의 못 느끼고, 400ms를 넘기면 서로 말이 자주 겹치기 시작합니다.
이 짧은 시간 안에 카메라가 영상 한 장을 잡고, 인코더가 압축하고, 인터넷을 가로질러 반대편에 도착해, 디코더가 풀고 화면에 그려 내야 합니다. 그래서 화상회의 코덱은 화질이 좀 떨어지더라도 빠르게 압축,해제할 수 있는 쪽을 택합니다. 영화 코덱은 그와 반대의 균형을 잡습니다.
WebRTC — 브라우저끼리 직접 잇는 약속 #
오랫동안 화상회의는 별도의 프로그램을 깔아야 했습니다. 지금은 브라우저에서 줌이나 구글미트 링크를 누르면 그대로 회의에 들어갈 수 있는데, 그 뒤에서 WebRTC라는 표준이 일을 합니다. WebRTC는 “브라우저끼리 영상,음성,데이터를 직접 주고받게 하는 약속” 정도로 이해하면 충분합니다. 카메라 권한을 받고, 영상을 잡아 압축하고, 상대 브라우저로 보내는 데까지 필요한 부품을 묶어 하나의 표준으로 제공한다는 뜻입니다.
WebRTC가 등장하기 전에는 화상회의 회사마다 자기 프로토콜과 자기 클라이언트를 깔게 만들었습니다. 그래서 줌과 미트가 서로 직접 통화할 수 없었고, 지금도 그렇습니다. WebRTC는 적어도 브라우저 안에서는 같은 부품을 쓰게 만들었습니다.
전송 도중 영상과 음성은 자동으로 암호화돼 도청을 막습니다. 같은 발상의 암호화가 웹 전반에서 어떻게 동작하는지는 주소창의 자물쇠는 무엇을 지키는가에 풀어 두었습니다.
서버는 왜 여전히 필요한가 #
“브라우저끼리 직접 연결한다"고 하면 서버 없이 동작할 것 같지만 실제로는 그렇지 않습니다. 그냥 인터넷에 노트북을 띄워 두면 같은 와이파이 안의 다른 기기는 바로 보이지만, 회사 와이파이 너머의 친구 노트북은 서로의 주소가 보이지 않습니다. 공유기 뒤에 가려져 있기 때문입니다. 그래서 회의가 시작되기 전에 둘이 같은 방에 들어왔다는 사실을 알리고, 서로의 주소를 알려 주는 중계가 필요합니다. 이 역할을 시그널링 서버가 맡습니다.
그다음에는 STUN과 TURN이라는 서버가 등장합니다. STUN은 “당신은 인터넷에서 어떤 주소로 보이고 있다"를 알려 주는 거울 역할이고, TURN은 끝내 두 브라우저가 직접 연결되지 못할 때 영상을 자기를 거쳐 우회시켜 주는 중계 역할입니다. 회사 방화벽이 까다로운 환경에서는 TURN을 통한 우회 비율이 의외로 높습니다.
인원이 늘면 구조가 달라진다 #
1:1 통화라면 둘이 직접 연결하면 끝입니다. 그런데 회의에 다섯 명이 들어오면 이야기가 달라집니다. 각자가 다른 네 명에게 자기 영상을 모두 보내야 하므로 한 사람의 업로드 부담이 인원에 비례해 늘어납니다. 8명, 10명만 되어도 일반 가정 인터넷으로는 감당이 어려워집니다.
그래서 대부분의 회의 서비스는 SFU라는 미디어 서버를 가운데에 둡니다. 각자는 자기 영상을 SFU에 한 번만 올리고, SFU가 그것을 나머지 참가자에게 적절히 골라 뿌립니다. 카메라가 꺼진 사람의 영상은 보내지 않고, 화면에 작게 표시되는 사람에게는 낮은 화질로만 보내는 식으로 데이터를 아낍니다. 줌,구글미트,팀즈 모두 결국 SFU 구조 위에 자기 클라이언트와 회의 기능을 얹어 서비스하는 셈입니다.
보이지 않는 협력 #
링크 한 번에 회의가 시작되는 짧은 순간 뒤에는 카메라,코덱,시그널링,STUN,TURN,SFU가 차례로 손을 잡습니다. 사용자 입장에서는 클릭 한 번이 전부지만, 그 한 번을 위해 여러 종류의 서버와 표준이 차곡차곡 협력하고 있는 셈입니다. 다음에 회의가 끊기거나 화질이 떨어진다면 카메라 문제만 의심하지 말고, 이 사슬 어딘가에 좁아진 길이 생긴 것은 아닐지 한 번쯤 떠올려 봐도 좋습니다.