언리얼 엔진 - 게임 프로젝트/AWS GameLift를 활용한 데디케이트 FPS 프로젝트

Access Tokens - 3) Token 재발급

monstro 2026. 6. 14. 17:43
728x90
반응형

- 개요

Token재발급하는 람다 함수를 구현하고 구현한 람다 함수를 호출할 수 있도록 설계한다

 

- AWS 콘솔 작업

import { CognitoIdentityProviderClient, InitiateAuthCommand } from "@aws-sdk/client-cognito-identity-provider";

export const handler = async (event) => {
  const cognitoIdentityProviderClient = new CognitoIdentityProviderClient( { region: process.env.REGION } );
  const { username, password, refreshToken } = event;

  if (refreshToken) {
    const refreshTokensInput = {
      AuthFlow: "REFRESH_TOKEN_AUTH",
      ClientId: process.env.CLIENT_ID,
      AuthParameters: {
        REFRESH_TOKEN: refreshToken
      }
    };
    
    const initiateAuthCommand = new InitiateAuthCommand(refreshTokensInput);
    
    try {
      const initiateAuthResponse = await cognitoIdentityProviderClient.send(initiateAuthCommand);
      return initiateAuthResponse;
    } catch(error) {
      console.error(error);
      return error;
    }
  } else {
    const initiateAuthInput = {
      AuthFlow: "USER_PASSWORD_AUTH",
      ClientId: process.env.CLIENT_ID,
      AuthParameters: {
        USERNAME: username,
        PASSWORD: password
      }
    };
    
    const initiateAuthCommand = new InitiateAuthCommand(initiateAuthInput);
  
    try {
      const initiateAuthResponse = await cognitoIdentityProviderClient.send(initiateAuthCommand);
      return initiateAuthResponse;
    } catch(error) {
      return error;
    }
  }
};

 

이전에 작성한 CognitoSignIn 람다 함수의 코드를 위와 같이 수정한다

  • event 객체에 추가로 refreshToken을 입력받도록 변경
  • 조건문을 통해 만약 기존에 로그인했던 사용자에게 만료되지 않은 refreshToken이 있다면 다음과 같이 처리
    • 아이디와 비밀번호없이 Cognito를 통해 새로운 Access TokenID Token을 발급
  • REFRESH_TOKEN_AUTH 인증 흐름중에 문제가 발생하면 에러 로그를 남김

 

- 스크립트 작업

1) DSLocalPlayerSubsystem 클래스

 

DSLocalPlayerSubsystem 클래스에 위와 같이 코드를 추가한다

멤버변수의 구성은 다음과 같다

  • TokenRefreshInterval 멤버변수 : 토큰을 재발급하는 간격(테스트용으로 10초로 설정)
  • RefreshTimer 멤버변수 : 토큰을 재발급하기 위한 시간측정하는 타이머 핸들

 

 

SetRefreshTokenTimer 함수의 로직은 위와 같다

TimerDelegate 객체를 생성하고 TokenRefreshInterval 변수의 값만큼의 시간 후

발급된 Token을 인자로 넘겨 Portal 중재자 클래스의 RefreshTokens 함수를 호출하는 람다 함수를 바인드한다

따라서 TokenRefreshInterval 변수만큼의 시간이 흐른 후에 서버에게 Token 재발급을 요청한다

 

 

UpdateTokens 함수의 로직은 위와 같다

발급된 토큰AccessTokenIdToken의 값을 덮어씌우토큰 관련 정보를 로그로 출력한다

이후 SetRefreshTokenTimer 함수를 호출한다

 

 

InitializeTokens 함수SetRefreshTokenTimer 함수를 호출하는 로직을 추가한다

 

2) PortalManager 클래스

 

Portal 중재자 클래스에 위 2개의 함수를 추가한다

RefreshTokens 함수를 호출하여 서버에 토큰 재발급을 요청한다

RefreshTokens_Response 함수를 호출하여 서버에서 반환된 토큰 재발급 수행 결과를 처리한다

 

 

RefreshTokens 함수의 로직은 위와 같다

  • 서버에 전송할 HTTPRequest 객체 생성
  • 민감한 정보를 포함하여 전송하므로 POST 함수로 설정 + HTTP 헤더 및 URL 설정
  • 토큰 재발급에 필요한 데이터를 구성하고 JSON 포맷으로 직렬화
  • 직렬화된 데이터를 포함한 HTTP 요청을 서버로 전송

 

 

RefreshTokens_Response 함수의 로직은 위와 같다

  • 네트워크 연결이 실패했다면 델리게이트로 얼리 리턴
  • 서버로부터 반환된 문자열 JSON 데이터로 역직렬화
  • 에러 메세지가 포함되어 있다면 얼리 리턴
  • 리플렉션을 사용하여 JSON 데이터를 언리얼 구조체로 변환
  • DSLocalPlayerSubsystem을 가져오고 필요한 정보를 넘겨주어 UpdateTokens 함수를 호출

 

- 최종 실행 결과

로그인 후의 Output Log 탭

 

로그인을 실행하면 위와 같이 10초 간격으로 토큰이 재발급되는 것을 확인할 수 있다

 

728x90
반응형