투케이2K

199. (TWOK/WORK) [업무 이슈] AWS WebRTC 마스터 SDK 초기화 시 STS 임시 자격 증명 UserId 값에 특수 문자 포함으로 인증 에러 발생 이슈 본문

투케이2K 업무정리

199. (TWOK/WORK) [업무 이슈] AWS WebRTC 마스터 SDK 초기화 시 STS 임시 자격 증명 UserId 값에 특수 문자 포함으로 인증 에러 발생 이슈

투케이2K 2026. 1. 13. 21:45
728x90

[제 목]

타이틀 : 투케이 / 2k / 업무 정리

제목 : [업무 이슈] AWS WebRTC 마스터 SDK 초기화 시 STS 임시 자격 증명 UserId 값에 특수 문자 포함으로 인증 에러 발생 이슈

 

[내 용]

------------------------------------------------------------------------------
[개발 및 테스트 환경]
------------------------------------------------------------------------------

- 제 목 : [업무 이슈] AWS WebRTC 마스터 SDK 초기화 시 STS 임시 자격 증명 UserId 값에 특수 문자 포함으로 인증 에러 발생 이슈


- 테스트 환경 : AWS / KVS / WebRTC / STS / DEVICE


- 사전) WebRTC 설명 : 

  >> WebRTC 란 웹, 애플리케이션, 디바이스 간 중간자 없이 오디오나 영상 미디어를 포착하고 실시간 스트림할 뿐 아니라, 임의의 데이터도 교환할 수 있도록 하는 기술입니다

  >> WebRTC 는 간단한 API 를 통해 웹 브라우저, 모바일 애플리케이션 및 커넥티드 디바이스 간에 실시간 통신을 활성화할 수 있습니다

  >> WebRTC 주요 용어 : 

    - SDP (Session Description Protocol) : 오디오/비디오 코덱, 해상도, 포트 등 스트리밍 정보를 담은 텍스트 포맷
    - Offer / Answer : 통신 연결을 협상하기 위한 SDP 메시지 (초기 연결 설정)
    - ICE (Interactive Connectivity Establishment) : NAT/P2P 환경에서도 연결 가능한 경로(IP, 포트 등)를 찾기 위한 기술
    - Candidate : 가능한 연결 경로 (IP + Port 조합)

  >> WebRTC SDP 오퍼 생성 (뷰어) 및 응답 (마스터) 스트리밍 플로우 : 

    [Viewer → Signaling Server] -- SDP Offer --> [Master] : 뷰어는 마스터로 스트리밍 오퍼 신호 보낸다
    [Master] -- SDP Answer --> [Viewer] : 마스터는 특정 뷰어의 오퍼 신호 확인 후 응답을 보낸다

    [Viewer] -- ICE Candidate --> [Master] : 스트리밍을 할 수 있는 경로 확인
    [Master] -- ICE Candidate --> [Viewer] : 스트리밍을 할 수 있는 경로 확인

    P2P 연결 성립 → 스트리밍 시작


- 사전) STS 임시 보안 자격 증명 설명 정리 : 

  >> AWS STS 는 AWS 리소스에 대한 액세스를 제어할 수 있는 임시 보안 자격 증명입니다 (신뢰받는 사용자에게 제공)

  >> AWS STS 는 단기적 임시 보안 자격 증명이며, 몇 분에서 몇 시간 동안 해당 자격 증명을 사용해 AWS 리소스를 액세스할 수 있습니다

  >> AWS STS 임시 보안 자격 증명이 만료 된 경우 AWS는 더는 그 자격 증명을 인식하지 못하거나 그 자격 증명을 사용한 API 요청으로부터 이루어지는 어떤 종류의 액세스도 허용하지 않습니다

------------------------------------------------------------------------------





------------------------------------------------------------------------------
[이슈 사항]
------------------------------------------------------------------------------

1. 디바이스 기기에서 AWS SDK C 라이브러리 사용해 WebRTC 마스터 역할 SDK 초기화 수행 시

   SDK 초기화에 사용 된 STS 임시 자격 증명 정보 UserId 에 특수 문자 (@) 포함으로 초기화 실패 이슈

  >> ✅ url-safe 한 특수 문자 (. , - , _) 등은 허용 되지만 @ 특수 문자 포함 시 인증 에러 발생

  >> ✅ 추가로, 뷰어에서 접속 요청 시 지정하는 remoteClientId 에도 @ 등의 특수 문자가 포함 되면 SDP 메시지 교환에서 문제가 발생할 수 있음

  >> STS 임시자격증명 정보는 백엔드 API 에서 생성해서 내려주는 로직


2. WebRTC 초기화에 실패했으므로, 뷰어에서는 실시간 영상 확인도 실패하는 추가 이슈 발생

------------------------------------------------------------------------------





------------------------------------------------------------------------------
[원인 파악 및 증상 재현]
------------------------------------------------------------------------------

1. 백엔드에서 내려준 STS 임시자격 증명 정보 복호화 수행


2. 복호화 된 정보에서 UserId 에 @ 특수 문자 포함 된 것 확인


3. 비교를 위해 Web 브라우저 마스터에서 해당 STS 임시정보로 마스터 역할 초기화 수행 (성공)

   ❌ 디바이스 C SDK 에서 WebRTC 마스터 역할 초기화 수행 (실패)

------------------------------------------------------------------------------






------------------------------------------------------------------------------
[조치 내용]
------------------------------------------------------------------------------

1. 백엔드에서 STS 임시정보를 만들어서 발급해 줄 때 UserId 값에 @ 등의 안전하지 않은 문자를 대체하기 위해 랜덤 UUID 값으로 변경 수행

  >> ✅ STS 임시정보에 사용 된 UserId 값과 뷰어가 마스터 연결 요청 시 달고 들어오는 remoteClientId 값은 달라도 상관 없음


2. 자바스크립트 STS 임시자격 증명 복호화 예시 코드 첨부 : 

  <script src="https://sdk.amazonaws.com/js/aws-sdk-2.1416.0.min.js"></script>

  var region = 'ap-northeast-2'; 
  var stsAccessKey = 'AS..6O'; 
  var stsSecretKey = 'ep..47'; 
  var stsSessionToken = 'Fw..wA='; 

  // -----------------------------------------
  // [AWS.config 지정]
  // -----------------------------------------       
  AWS.config.update({
    accessKeyId: stsAccessKey, // 임시 Access Key
    secretAccessKey: stsSecretKey, // 임시 Secret
    sessionToken: stsSessionToken,    // STS Session Token
    region: region,
  });


  // -----------------------------------------
  // [AWS 객체 생성]
  // -----------------------------------------
  const aws = new AWS.STS();


  // -----------------------------------------
  // [GetCallerIdentity] : AWS 계정 정보와 인증된 사용자 정보 확인
  // -----------------------------------------
  // AWS 참고 사이트 : https://docs.aws.amazon.com/STS/latest/APIReference/API_GetCallerIdentity.html
  // -----------------------------------------
  // 입력 파라미터 없음: 단순히 현재 인증된 엔티티의 정보를 반환.
  // -----------------------------------------
  // 권한 요구사항: sts:GetCallerIdentity 권한이 필요.
  // -----------------------------------------
  // 리전 무관: 모든 리전에서 동일하게 동작.
  // -----------------------------------------
  aws.getCallerIdentity( {} , function(err, data) { 
    if (err) {
      console.error("[getCallerIdentity] : [Error] : ", err);

      // ---------------------------------------------
      // ✅ [주요 에러 정리]

      // ---------------------------------------------
      // AccessDenied : 정책 혹은 권한 문제로 호출 실패. HTTP 403.
      // InvalidClientTokenId : 제공된 토큰이 AWS 기록에 없거나 잘못된 경우. 
      // ExpiredToken : 세션 토큰이 만료된 경우. 예: "The security token included in the request is expired".
      // IncompleteSignature : 요청 시그니처가 불완전하거나 서명 오류. HTTP 403.
      // MissingAuthenticationToken : 인증 토큰이 누락된 경우. HTTP 403.
      // RequestExpired : 요청 시간이 유효시간 초과된 경우. HTTP 400.
      // InternalFailureAWS : 내부 오류로 인해 처리 실패. HTTP 500.
      // ServiceUnavailable : 서비스 일시 중단 상태. HTTP 503.
      // ---------------------------------------------              

    } else {
      console.log("[getCallerIdentity] : [Success] : ", JSON.stringify(data));

      // ---------------------------------------------
      // ✅ [로그 출력 예시 첨부]
      // ---------------------------------------------
      /*
      {
        "ResponseMetadata": {
          "RequestId": "d3c30b16-6516-46ac-bfce-634439e4f4f0"
        },
        "UserId": "AI..2S", // 호출자의 고유 사용자 ID
        "Account": "123456789012", // 호출자의 AWS 계정 ID
        "Arn": "arn:aws:iam::123456789012:user/2k@twok.com-CLI" // 호출자의 Amazon Resource Name (ARN)
      }
      */
      // ---------------------------------------------

    }

  });

------------------------------------------------------------------------------





------------------------------------------------------------------------------
[참고 사이트]
------------------------------------------------------------------------------

[자바스크립트 AWS Security Token Service 서비스 GetCallerIdentity 사용해 STS 임시자격 증명 정보 유효성 검증]

https://kkh0977.tistory.com/8555

https://blog.naver.com/kkh0977/224141368685


[Aws Security Token Service] Aws STS 임시 보안 자격 증명 설명 정리

https://kkh0977.tistory.com/7942

https://blog.naver.com/kkh0977/223846461194?trackingCode=blog_bloghome_searchlist


[Web/JavaScript] AWS Kvs WebRtc 마스터 비디오 스트림 다중 뷰어 영상 송출

https://kkh0977.tistory.com/8058

https://blog.naver.com/kkh0977/223899701921


[업무 이슈] AWS WebRTC 뷰어에서 동일한 clientId 사용해 스트리밍 시청 시 AWS 세션 초기화 이슈로 60 초내외 재사용 필요 이슈

https://kkh0977.tistory.com/8442

https://blog.naver.com/kkh0977/224094606649


[Aws Kvs WebRTC 실시간 영상 재생 관련 구성 요소 및 용어 정리]

https://blog.naver.com/kkh0977/223858189791


[Aws Kinesis Video Streams] WebRTC remote sender clientId 클라이언트 아이디 설명, 규격 및 제한 정리

https://kkh0977.tistory.com/8415

https://blog.naver.com/kkh0977/224083731976


[Aws Kinesis Video Streams] WebRTC SDP 협상 과정 프로세스 정리 정리

https://blog.naver.com/kkh0977/224030054470

------------------------------------------------------------------------------
 
728x90
반응형
Comments