Back to Blog

GoLang을 사용하여 Agora 애플리케이션을 위한 토큰 서버를 구축하는 방법

How to Build a Token Server for Agora Applications using GoLang

비디오 채팅 애플리케이션 내 보안은 현재 뜨거운 이슈입니다. 원격 근무와 가상 이벤트가 확산됨에 따라 보안의 중요성은 더욱 증가할 것입니다.

아고라 플랫폼 내에서는 토큰 인증이 보안의 한 층을 구성합니다. 토큰은 특정 입력값을 기반으로 생성되는 동적 키입니다. 아고라 플랫폼은 토큰을 사용하여 사용자를 인증합니다.

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

필수 조건

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

프로젝트 설정

먼저 터미널을 열고 프로젝트용 새 폴더를 생성한 후 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 파일을 생성하세요.

main.go 파일 내에서 패키지를 선언하고 main 함수를 추가합니다.

package main
func main() {
}

다음으로 Gin 프레임워크를 가져오고, Gin 앱을 생성한 후 간단한 GET 엔드포인트를 설정하고 localhost 포트 8080에서 요청을 수신하고 처리하도록 설정합니다. 간단한 엔드포인트의 경우 요청 컨텍스트를 받아 200 상태 헤더와 함께 JSON 응답을 반환하도록 설정합니다.

서버 테스트를 시작할 준비가 되었습니다. 터미널 창으로 돌아가서 다음 명령어를 실행하세요:

go run main.go

종단점을 테스트하려면 웹 브라우저를 열고 다음 주소로 이동하세요:

localhost:8080/ping

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

{"message":"pong"}

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

Agora 토큰 생성

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

토큰을 생성하기 전에 AppIDAppCertificate를 추가해야 합니다. appIDappCertificateString 형식으로 global 범위에서 선언합니다. 이 가이드에서는 프로젝트 자격 증명을 환경 변수에 저장하므로 이를 가져와야 합니다. main() 내에서 os.LookupEnv를 사용하여 환경 변수를 가져옵니다. os.LookupEnv는 환경 변수의 String 값과 변수가 존재하는지 여부를 나타내는 boolean 값을 반환합니다. 후자의 반환 값을 사용하여 환경이 올바르게 구성되었는지 확인합니다. 그렇다면 환경 변수 값을 글로벌 appIDAppCertificate 변수에 각각 할당할 수 있습니다.

다음으로 3개의 엔드포인트를 추가합니다. 하나는 RTC 토큰용, 다른 하나는 RTM 토큰용, 그리고 마지막으로 두 가지 토큰을 모두 반환하는 엔드포인트입니다.

RTC 토큰은 채널 이름, UID, 사용자 역할, UID가 문자열 기반인지 정수 기반인지 구분하기 위한 tokentype, 마지막으로 만료 시간을 요구합니다. 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)를 사용하여 생성될 수 있으므로, Agora RTC Token Builder 함수 BuildTokenWithUserAccount/BuildTokenWithUID를 감싸는 함수(generateRtcToken)를 사용합니다.

RTC 토큰 생성

먼저 getRtcToken 함수를 시작합니다. 이 함수는 gin.Context에 대한 참조를 받아 이를 사용하여 parseRtcParams 함수를 호출합니다. 이 함수는 필요한 값을 추출합니다. 추출된 값을 사용하여 generateRtcToken 함수를 호출하여 토큰 String을 생성합니다. 또한 오류가 발생하지 않았는지 확인하기 위해 몇 가지 오류 점검을 포함합니다. 마지막으로 응답을 생성합니다.

다음으로 parseRtcParams를 채워보겠습니다. 이 함수는 gin.Context에 대한 참조도 받아, 이를 사용하여 매개변수를 추출하고 반환합니다. parseRtcParams는 문제가 발생할 경우 오류 메시지를 반환하기 위해 error도 반환합니다.

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

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

RTM 토큰 생성

다음으로 getRtmToken로 이동하겠습니다. 위 코드와 마찬가지로 getRtmTokengin.Context에 대한 참조를 받아 이를 사용하여 parseRtmParams를 호출해 필요한 값을 추출한 후, 반환된 값으로 RTM 토큰을 생성합니다. 여기서 다른 점은 Agora RTM 토큰 생성기를 직접 호출해 토큰을 생성한다는 점입니다. 이 토큰은 String 형식으로 반환됩니다. 오류 검사를 포함하여 문제가 없었는지 확인하고, 마지막으로 응답을 생성합니다.

다음으로 parseRtmParams를 채워보겠습니다. 이 함수는 gin.Context에 대한 참조를 받아서 매개변수를 추출하고 반환합니다.

RTC 및 RTM 토큰 모두 생성

이제 개별 서버 요청을 통해 RTC 및 RTM 토큰을 모두 생성할 수 있게 되었으므로, 단일 요청으로 두 토큰을 모두 생성할 수 있도록 getBothTokens를 구현할 것입니다. getRtcToken와 매우 유사한 코드를 사용하지만, 이번에는 RTM 토큰을 포함하도록 합니다.

토큰 서버 테스트

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

run main.go

서버 인스턴스가 실행되면 엔드포인트 목록과 다음 메시지가 표시됩니다: HTTP를 8080 포트에서 수신 및 서비스 중.

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

토큰 서버 테스트

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

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

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

엔드포인트는 채널에서 사용할 수 있는 토큰을 생성합니다: testingpublisher역할의 사용자와 UID (String 또는 uint)가 1234인 경우.

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

이 토큰을 테스트하려면 Agora 1:1 웹 데모를 사용할 수 있습니다.

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

테스트를 완료하기 위해 듀얼 토큰 엔드포인트를 사용합니다:

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

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

엔드포인트는 사용자가 UID (String 또는 uint)가 1234인 경우 사용할 수 있는 RTC 및 RTM 토큰을 생성합니다. 비디오 채널: testing의 역할이 publisher인 경우에도 마찬가지입니다.

{
  "rtcToken": "0062ec0d84c41c4442d88ba6f5a2beb828bIAD33wY6pO+xp6iBY8mbYz2YtOIiRoTTrzdIPF9DEFlSIwZa8+ij4OObIgAQ6e0EX+UyXwQAAQDvoTFfAgDvoTFfAwDvoTFfBADvoTFf",
  "rtmToken": "0062ec0d84c41c4442d88ba6f5a2beb828bIABbCwQgl2te3rk0MEDZ2xrPoalb37fFhTqmTIbGeWErWaPg45sAAAAAEAD1WwYBX+UyXwEA6APvoTFf"
}

토큰을 테스트하려면 RTC 토큰에는 Agora 1:1 웹 데모를, RTM 토큰에는 Agora RTM 튜토리얼 데모를 사용할 수 있습니다.

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

완료!

이 튜토리얼을 읽어주셔서 감사합니다. 질문이 있다면 댓글로 알려주시기 바랍니다. 개선할 점이 있다면 리포지토리를 포크하고 pull request를 제출해 주시면 감사하겠습니다!

기타 자료

Agora 애플리케이션용 토큰에 대한 자세한 내용은 Set up Authentication 가이드와 Agora Advanced Guide: How to build a Token(Go)를 참고해 주세요.

또한 Agora Developer Slack 커뮤니티에 가입해 주시기를 초대합니다.

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