Back to Blog

GoLang을 사용하여 아고라 애플리케이션용 토큰 서버를 구축하는 방법

How to Build a Token Server for Agora Applications using GoLang

현재 화상 채팅 애플리케이션 내 보안은 뜨거운 화두입니다. 원격 근무와 가상 이벤트가 점점 더 많아짐에 따라 보안에 대한 필요성은 더욱 커질 것입니다.

아고라 플랫폼의 보안 계층 중 하나는 토큰 인증의 형태로 제공됩니다. 잘 모르시는 분들을 위해 설명하자면, 토큰은 주어진 입력 세트를 사용하여 생성되는 동적 키입니다. 아고라 플랫폼은 토큰을 사용하여 사용자를 인증합니다.

아고라는 RTC와 RTM SDK 모두에 토큰 보안을 제공합니다. 이 가이드에서는 Golang과 Gin 프레임워크를 사용하여 간단한 마이크로서비스를 구축하여 아고라 RTC 및 RTM 토큰을 생성하는 방법을 설명합니다.

전제 조건

  • Golang에 대한 기본적인 이해(최소한의 지식 필요)
  • 웹 서버의 작동 방식에 대한 이해(최소한의 지식 필요)
  • 아고라 개발자 계정(참조: 아고라 시작하기)

프로젝트 설정

시작하려면 터미널을 열고 프로젝트를 위한 새 폴더를 만든 다음 그 안에 CD를 복사해 보겠습니다.

mkdir agora-token-server cd agora-token-server

이제 프로젝트가 생성되었으므로 프로젝트의 Go 모듈을 초기화해 보겠습니다.

go mod init agora-token-server

마지막으로 go get을 사용하여 Gin 및 Agora 종속성을 추가하겠습니다.

go get github.com/gin-gonic/gin go get github.com/AgoraIO-Community/go-tokenbuilder

Gin 웹 서버 구축

이제 프로젝트가 설정되었으므로 즐겨 사용하는 코드 편집기에서 폴더를 열고 main.go 파일을 만듭니다.

Coding interface

main.go 내에서 패키지를 선언하고 메인 함수를 추가하는 것으로 시작하겠습니다.

package main

func main() {

}

다음으로 Gin 프레임워크를 가져오고, Gin 앱을 만들고, 간단한 GET 엔드포인트를 설정하고, 로컬 호스트 포트 8080에서 수신 대기 및 서비스하도록 설정하겠습니다. 간단한 엔드포인트의 경우 요청 컨텍스트를 가져와 200 상태 헤더가 포함된 JSON 응답을 반환하도록 설정하겠습니다.

서버를 테스트할 준비가 되었습니다. 터미널 창으로 돌아가서 실행합니다:

go run main.go

Coding interface

엔드포인트를 테스트하려면 웹 브라우저를 열고 방문하세요:

localhost:8080/ping

서버가 예상대로 응답하는 것을 볼 수 있습니다.

{"message":"pong"}

엔드포인트가 작동하는 것을 확인한 후 터미널 창으로 돌아가서 키보드 명령 ctrl c를 사용하여 프로세스를 종료합니다.

아고라 토큰 생성

이제 Gin 서버 설정이 완료되었으므로 RTC 및 RTM 토큰을 생성하는 기능을 추가할 준비가 되었습니다.

토큰을 생성하기 전에 앱ID와 앱인증서를 추가해야 합니다. 글로벌 범위에서 앱ID와 앱인증서를 문자열로 선언하겠습니다. 이 가이드에서는 프로젝트 자격 증명을 저장하기 위해 환경 변수를 사용하므로 이를 검색해야 합니다. main()에서 os.LookupEnv를 사용하여 환경 변수를 검색하겠습니다. os.LookupEnv는 환경 변수에 대한 문자열과 변수 존재 여부에 대한 부울을 반환합니다. 후자의 반환 값을 사용하여 환경이 올바르게 구성되었는지 확인합니다. 환경이 올바르게 구성되었다면 환경 변수 값을 각각 글로벌 appID 및 AppCertificate 변수에 할당할 수 있습니다.

다음으로 3개의 엔드포인트를 추가할 것인데, 하나는 RTC 토큰용, 다른 하나는 RTM 토큰용, 다른 하나는 두 토큰을 모두 반환하는 엔드포인트입니다.

RTC 토큰에는 채널 이름, UID, 사용자 역할, 문자열과 정수 기반 UID를 구분하기 위한 토큰 유형, 마지막으로 만료 시간이 필요합니다. RTM 엔드포인트에는 UID와 만료 시간만 필요합니다. 이중 토큰 엔드포인트는 RTC 토큰 엔드포인트와 동일한 구조를 수용해야 합니다.

api.GET("rtc/:channelName/:role/:tokentype/:uid/", getRtcToken)
api.GET("rtm/:uid/", getRtmToken)
api.GET("rte/:channelName/:role/:tokentype/:uid/", getBothTokens)

반복되는 코드의 양을 최소화하기 위해 getRtcToken, getRtmToken, getBothTokens의 세 함수는 각 엔드포인트에 전달된 값의 유효성을 검사하고 추출하기 위해 별도의 함수(parseRtcParams/parseRtmParams)를 호출합니다. 그런 다음 각 함수는 반환된 값을 사용하여 토큰을 생성하고 응답 본문에서 JSON으로 반환합니다.

RTC 토큰은 두 가지 유형의 UID(uint/string)를 사용하여 생성할 수 있으므로 함수(generateRtcToken)를 사용하여 아고라 RTC 토큰 빌더 함수인 BuildTokenWithUserAccount/BuildTokenWithUID를 래핑하겠습니다.

아래는 토큰 서버의 기본 템플릿입니다. 각 기능을 살펴보며 빈칸을 채우겠습니다.

RTC 토큰 빌드

getRtcToken부터 시작하겠습니다. 이 함수는 gin.Context에 대한 참조를 가져와 이를 사용하여 필요한 값을 추출하는 parseRtcParams를 호출합니다. 그런 다음 반환된 값을 사용하여 generateRtcToken을 호출하여 토큰 문자열을 생성합니다. 그 과정에서 문제가 없는지 확인하기 위해 몇 가지 오류 검사도 포함할 것입니다. 마지막으로 응답을 빌드합니다.

다음으로 parseRtcParams를 작성해 보겠습니다. 이 함수는 매개 변수를 추출하고 반환하는 데 사용할 gin.Context에 대한 참조도 받습니다. 문제가 발생할 경우 오류 메시지를 반환할 수 있도록 parseRtcParams도 오류를 반환하는 것을 알 수 있습니다.

마지막으로 generateRtcToken 함수를 작성합니다. 이 함수는 채널 이름, 문자열로 UID, 토큰 유형(uid 또는 userAccount), 역할, 만료 시간을 받습니다.

이 값을 사용하여 이 함수는 적절한 아고라 RTC 토큰 빌더 함수(BuildTokenWithUserAccount/BuildTokenWithUID)를 호출하여 토큰 문자열을 생성합니다. 토큰 빌더 함수가 반환되면 먼저 오류가 있는지 확인하고 오류가 없는 경우 토큰 문자열 값을 반환합니다.

RTM 토큰 구축

다음으로 getRtmToken으로 넘어가 보겠습니다. 위의 코드와 마찬가지로 getRtmToken은 gin.Context에 대한 참조를 가져오고, 이를 사용하여 parseRtmParams를 호출하여 필요한 값을 추출한 다음 반환된 값을 사용하여 RTM 토큰을 생성합니다. 여기서 차이점은 Agora RTM 토큰 빌더를 직접 호출하여 토큰인 문자열을 생성한다는 점입니다. 문제가 없는지 확인하기 위해 오류 검사를 포함하고 마지막으로 응답을 빌드합니다.

다음으로 parseRtmParams를 작성해 보겠습니다. 이 함수 역시 gin.Context에 대한 참조를 받은 다음 매개 변수를 추출하여 반환합니다.

RTC 및 RTM 토큰 모두 구축

이제 개별 서버 요청으로 RTC 토큰과 RTM 토큰을 모두 생성할 수 있으므로 한 번의 요청으로 두 토큰을 모두 생성할 수 있도록 getBothTokens를 채우겠습니다. 이번에는 RTM 토큰을 포함한다는 점을 제외하면 getRtcToken과 매우 유사한 코드를 사용할 것입니다.

토큰 서버 테스트

터미널 창으로 돌아가서 토큰 서버를 실행해 보겠습니다.

run main.go

서버 인스턴스가 실행되면 엔드포인트 목록과 메시지를 볼 수 있습니다: 8080에서 HTTP 수신 및 제공 중이라는 메시지가 표시됩니다.

Terminal interface

이제 서버 인스턴스가 실행 중이므로 웹 브라우저를 열고 테스트해 보겠습니다. 이 테스트에서는 다양한 쿼리 매개변수를 생략하는 몇 가지 변형을 시도해 보겠습니다.

토큰 서버 테스트

RTC 토큰부터 시작하겠습니다:

http://localhost:8080/rtc/testing/publisher/userAccount/1234/

http://localhost:8080/rtc/testing/publisher/uid/1234/

엔드포인트는 채널에서 사용할 수 있는 토큰을 생성합니다. 게시자 역할과 1234의 UID(문자열 또는 uint)를 가진 사용자가 테스트합니다.

{
  "rtcToken": "0062ec0d84c41c4442d88ba6f5a2beb828bIADJRwbbO8J93uIDi4J305xNXA0A+pVDTPLPavzwsLW3uAZa8+ij4OObIgDqFTEDoOMyXwQAAQAwoDFfAgAwoDFfAwAwoDFfBAAwoDFf"
}


이 토큰을 테스트하려면

듀얼 토큰 엔드포인트 테스트

듀얼 토큰 엔드포인트로 테스트를 마무리하겠습니다:

http://localhost:8080/rtc/testing/publisher/userAccount/1234/

http://localhost:8080/rtc/testing/publisher/uid/1234/

엔드포인트는 UID(문자열 또는 uint)가 1234인 사용자가 비디오 채널에 사용할 수 있는 RTC 및 RTM 토큰을 모두 생성합니다: 퍼블리셔 역할로 테스트합니다.

{
  "rtcToken": "0062ec0d84c41c4442d88ba6f5a2beb828bIADJRwbbO8J93uIDi4J305xNXA0A+pVDTPLPavzwsLW3uAZa8+ij4OObIgDqFTEDoOMyXwQAAQAwoDFfAgAwoDFfAwAwoDFfBAAwoDFf"
}

토큰을 테스트하기 위해 RTC 토큰의 경우 아고라 1:1 웹 데모를, RTM 토큰의 경우 아고라 RTM 튜토리얼 데모를 사용할 수 있습니다.

Terminal interface
엔드포인트를 테스트하면 터미널 창에 모든 요청이 표시됩니다.

완료!

Author profile

시간을 내어 튜토리얼을 읽어주셔서 감사드리며 궁금한 점이 있으면 댓글로 알려주세요. 개선의 여지가 있다면 언제든지 리포지토리를 포크하고 풀 리퀘스트를 해 주세요!

기타 리소스

아고라.io 애플리케이션용 토큰에 대한 자세한 내용은 인증 설정 가이드아고라 고급 가이드를 참조하세요: 토큰을 구축하는 방법(Go)을 참조하세요.

또한 아고라 개발자 슬랙 커뮤니티에 여러분을 초대합니다.

RTE Telehealth 2023
Join us for RTE Telehealth - a virtual webinar where we’ll explore how AI and AR/VR technologies are shaping the future of healthcare delivery.

Learn more about Agora's video and voice solutions

Ready to chat through your real-time video and voice needs? We're here to help! Current Twilio customers get up to 2 months FREE.

Complete the form, and one of our experts will be in touch.

Try Agora for Free

Sign up and start building! You don’t pay until you scale.
Try for Free