실버케어 플랫폼 프로젝트

[AWS]WebRTC를 통한 1:1화상 통화 구현-4(TURN 서버 구축)

삼록이 2025. 5. 8. 23:40

이전 글에서 개념~백엔드 코드까지 1:1 화상채팅을 하고 난 뒤 배포까지 진행하니 한 가지 문제가 발생했다.

두 사람이 같은 로컬네트워크 환경에서는(ex.같은 와이파이 네트워크 망을 쓴다고 한다던지) 화상채팅이 잘 되는데 떨어져있는 상태면 화상채팅이 되질 않았다.

개념편에서 복잡한 네트워크 환경에서는 STUN서버를 이용해도 연결이 불가할 경우에는 TURN 서버라는게 있다고 간단히 언급하고 넘어가고 코드도 STUN 서버까지만 이용하는 것으로 구현했었는데. 

이게 원인이었다.

(STUN 서버만 이용해도 충분하다고 들었는데, 전혀 그렇지 않았다. TURN서버까지도 이용하는 게 맞는 것 같다)

 

그렇다면 우리가 무료로 구글의 STUN서버를 이용했듯이, TURN서버도 유료로 임대하는 방식도 있다고는 하나,

여기서는 그냥 AWS의 EC2를 임대해 전용 TURN 서버를 구축하려고한다.

Coturn이라는 턴 서버를 구축할 수 있게 해주는 오픈소스가 있어 정말 쉽게 구축할 수 있다.

 


 

1. AWS에서 서버 임대하기.

나는 테스트용이므로 아래처럼 제일 낮은 사양으로  EC2 한 대를 임대 했다.

 

2. PowerShell(터미널)창을 열고 키 페어가 위치한 폴더로 이동하여 아래 ssh 접속 명령어를 복사하여 EC2에 원격 접속한다.

먼저 sudo apt update 명령어를 통해 apt 를 업데이트 한다.

(apt는 리눅스 우분투의 패키지 관리자.로 필요한 소프트웨어를 설치/업데이트/삭제할 수 있는 툴. 이걸 업데이트 해야 가장 최신의 coturn을 다운받을 수 있으니까.)

그런 다음 apt install coturn -y 명령어로 EC2 서버에 coturn을 설치한다. 

 

3. 이젠 coturn이 실행되도록 설정해야한다.

sudo nano /etc/default/coturn 로 설정파일을 실행한다.

/etc/default/coturn은 coturn의 실행여부를 설정하는 파일이다.

파일에서 TRUNSERVER_ENABLED 라고 적혀있는 부분을 찾아 yes로 입력함으로써 실행하게 한다.

Ctrl+o(알파벳 O)를 눌러 저장하고 나간다.

 

4.그런 다음 아래 두 명령어를 입력한다.

sudo systemctl restart coturn(coturn을 재시작하게 하는 것. 설정 파일 수정했으니 변경사항 적용을 위해 재시작)

sudo systemctl enable coturn(시스템이 부팅될 때 coturn 서비스를 자동으로 시작하도록 설정하는 것)

 

5.coturn의 실제 동작 설정 파일에 접속한다.

사실 여기가 실제적으로 가장 중요한 부분이다. 앞서 /etc/default/coturn 은 coturn 서비스의 실행 여부를 설정하는 파일이라면,

/etc/turnserver.conf 파일은 실제동작(포트,인증 등)에 대한 설정파일이다.

접속하면 어마어마한 양의 줄이 있는데 Ctrl+k 로 그냥 일일이 다 지운다.

그런 다음 아래 내용을 복붙한다.

이때 외부에서 접속 할 수 있는 공인 IP부분에만 본인 EC2의 ip주소를 입력하면 된다.(aws의 콘솔창에서 쉽게 확인 가능하다)

# 기본 포트 설정
listening-port=3478

# 모든 IP로 리스닝 (외부 요청 수용)
listening-ip=0.0.0.0

# 외부에서 접속할 수 있는 공인 IP(EC2 퍼블릭 IPv4주소 넣으세요)
external-ip=3.35.xx.xxx

# TURN 인증 (WebRTC에서 사용할 사용자 정보)
user=turnuser:turnpassword
lt-cred-mech

# 포트 범위 제한 (모바일 NAT 환경 대응)
min-port=49152
max-port=65535

# WebRTC 기본 보안 설정
fingerprint
realm=mycompany.org
stale-nonce

# 디버깅용 로그 (원하면 꺼도 됨)
verbose

 

->여기서 listening-port는  TURN서버의 기본 통신 포트로 WebRTC 클라이언트가 이 서버에 접속할 때 사용하는 포트다.

그리고 sudo systemctl restart coturn을 통해 다시 한번 coturn을 재실행.

 

6. 마지막으로 EC2의 보안 규칙을 설정한다.

 

여기서 중요한 부분은 3478포트에대해 UDP와 TCP 두가지 방식으로 열어줘야 하고, 49152~65335포트에 대해서도  열어준 부분이다.

 

먼저 3478번 포트는 coturn의 리스닝 포트이니까 당연히 접근 할 수 있도록 EC2에서도 허용해주어야 하고 UDP프로토콜로 열어주어야한다. 그런데 일부 환경에서는 UDP가 차단되어있을 수 있고 그런 곳에서는 TCP프로토콜로 전송할 수 가 있는데 그것까지 고려하여 TCP프로토콜에 대해서도 허용해준다.


49152-65335포트에 대해서도 허용해준다.

이 범위의 포트는 TURN 서버가 미디어 데이터를 중계할 때 사용하는 포트들이다.

WebRTC는 오디오/비디오 데이터를 중계할 때 랜덤포트를 잡아쓰는 특성이 있어 이 범위의 포트가 필요하다고 한다.

 


그런 다음 이전 프론트 코드에서 

stun서버까지만 정보를 넣어두었던 거를 turn서버에 대한 정보까지 입력하면 완료다.

  try{
           // 0. RTCPeerConnection객체의 생성자에 들어갈 옵션객체 정의로, key가 iceServers고 value가 배열인 형태임
        // iceServers는 NAT뒤에 있는 클라이언트끼리 연결 할 수 있도록 STUN/TURN서버 정보를 넣어줌. 구글의 STUN서버 사용
        const configuration ={
          iceServers:[
            {urls: 'stun:stun.1.google.com.19302'},
            //내가 ec2에 구축한 turn서버
            {
              urls: 'turn:3.35.xx.xxx:3478',
              username: 'turnuser',
              credential: 'turnpassword'
            }
          ]
        }

 

그러면 이렇게 완료..!

728x90