투케이2K

71. (Aws/Amazon) [Aws S3 Storage] PreSignedUrl 프리 사인 URL 주소 정리 - S3 버킷 저장소 Get 확인 및 Put 업로드 임시 권한 주소 본문

Aws (Amazon)

71. (Aws/Amazon) [Aws S3 Storage] PreSignedUrl 프리 사인 URL 주소 정리 - S3 버킷 저장소 Get 확인 및 Put 업로드 임시 권한 주소

투케이2K 2025. 6. 18. 19:09
728x90

[개발 환경 설정]

개발 환경 : Aws / Amazon Web Services

 

[설명 정리]

// --------------------------------------------------------------------------------------
[개발 및 환경]
// --------------------------------------------------------------------------------------

- 인프라 : Aws / Amazon Web Services

- 기술 구분 : Aws / S3 / PreSignedUrl / Get / Put

- 사전 API 요청용 AWS Signature Version 4 개념 정리 : 

  >> AWS SigV4 는 AWS API 요청에 인증 정보를 추가하기 위한 AWS 서명 프로토콜입니다

  >> AWS SigV4 는 HTTP Authorization 헤더에서 또는 URL의 쿼리 문자열로 표현될 수 있습니다

    - ex : Aws Kvs HLS 비디오 스트리밍 업로드 및 재생 시 GetDataEndpoint 를 사용하지만, Authorization 헤더 값에는 SigV4 인증 정보 추가 필요

    - ex : Aws S3 파일 확인 및 업로드 수행 시 백엔드에서 PreSignedUrl 을 생성하면 클라이언트는 특별한 Authorization 헤더 추가 없이 다이렉트 URL 사용 가능 (URL 에 임시 권한 정보가 포함 됨)

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[설 명]
// --------------------------------------------------------------------------------------

1. AWS PreSignedUrl 은 Amazon S3에 저장된 객체에 대해 일시적인 접근 권한을 부여하는 URL입니다

  >> PreSignedUrl 을 통해 인증 없이도 제한된 시간 동안 S3 객체에 접근하거나 업로드할 수 있습니다


2. AWS PreSignedUrl 은 Get 정보 요청 용도와, Put 업로드 용도로 구분할 수 있습니다


3. AWS PreSignedUrl 특징 : 

  >> 서명된 URL로, AWS의 인증 정보를 포함하고 있음

  >> 특정 시간 동안만 유효함 (expiresIn 설정)

  >> 일반적으로 파일 다운로드(GET) 또는 업로드(PUT) 용도로 사용됨

  >> IAM 권한을 기반으로 생성되며, 생성한 사용자 권한에 따라 접근 가능 여부가 결정됨


4. AWS PreSignedUrl 사용 목적 및 장점 : 

  >> (사용 목적) 다운로드 사용자에게 S3 파일을 직접 제공 (예: 이미지, 문서 등)

  >> (사용 목적) 업로드 사용자로부터 파일을 S3에 직접 업로드 받기 (예: 프로필 사진 업로드)

  >> (사용 목적) 보안 유지 S3 버킷을 public으로 만들지 않고도 안전하게 파일 공유 가능

  >> (장점) 보안성: S3 버킷을 공개하지 않아도 안전하게 파일 공유 가능

  >> (장점) 유연성: 원하는 객체에만 접근 허용 가능

  >> (장점) 시간 제한: URL이 자동으로 만료되어 보안 유지


5. AWS PreSignedUrl 생성 및 사용 작동 방식 : 

  >> 서버 또는 백엔드에서 Pre-signed URL 생성

  >> 클라이언트(브라우저, 앱 등)에 URL 전달

  >> 클라이언트는 해당 URL을 통해 S3에 직접 접근

  >> URL은 만료 시간이 지나면 자동으로 무효화됨

  >> 참고 : 클라이언트에서도 AWS SDK 를 사용해 직접 Pre-Signed URL 생성 가능 (IMA - AccessKey, IAM - SecretKey, Region 정보 사전 확인 필요)


6. AWS PreSignedUrl 예시 형식 : 

  >> GET : https://service.s3.ap-northeast-2.amazonaws.com/control/private.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AK..7Q%2F20250618%2Fap-northeast-2%2Fs3%2Faws4_request&X-Amz-Date=20250618T000124Z&X-Amz-Expires=3600&X-Amz-Signature=bd..86&X-Amz-SignedHeaders=host

  >> PUT : https://service.s3.ap-northeast-2.amazonaws.com/control/photo.jpg?Content-Type=image%2Fjpeg&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AK..7Q%2F20250618%2Fap-northeast-2%2Fs3%2Faws4_request&X-Amz-Date=20250618T001010Z&X-Amz-Expires=3600&X-Amz-Signature=9e..70&X-Amz-SignedHeaders=host


7. AWS PreSignedUrl QueryParams 정리 :

  >> X-Amz-Algorithm : 서명 버전과 알고리즘을 식별하고 서명을 계산하는데 사용되는 값

  >> X-Amz-Credential : AccessKey, 요청 날짜, Region, 서비스 명칭

  >> X-Amz-Date : ISO 8601 형식의 날짜로 URL 생성 시간

  >> X-Amz-Expires : URL 유효 시간 (단위는 초)

  >> X-Amz-Signature : 요청을 인증하기 위한 서명 값

  >> X-Amz-SignedHeaders : 서명을 계산하기 위해 요구 되는 헤더 목록 (기본 host 헤더 요구)


8. AWS PreSignedUrl 생성 예시 코드 (JavaScript) : 

    <!-- [CDN 주소 설정] -->

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


    <!-- [자바스크립트 코드 지정] -->
    <script>

        // [html 최초 로드 및 이벤트 상시 대기 실시]
        window.onload = async function() {

            // -----------------------------------------
            // [변수 생성]
            // -----------------------------------------
            var region = 'ap-northeast-2'; // [AWS 리전]
            var accessKeyId = 'AK..7Q'; // [IAM 액세스 키]
            var secretAccessKey = 'Zz..xj'; // [IAM 시크릿 키]


            // -----------------------------------------
            // [AWS.config 지정]
            // -----------------------------------------
            AWS.config.update({
              region: region,
              accessKeyId: accessKeyId,
              secretAccessKey: secretAccessKey,
              signatureVersion: "v4", // [API 요청용 AWS Signature Version 4]
            });


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

            // -----------------------------------------
            // [GET 확인 용도 : Pre-Signed URL 생성 요청]
            // -----------------------------------------
            const getExpiresInSeconds = 3600; // 만료 시간 (3600 초 : 1시간) 
            const getParams = {
              Bucket: 'service', // 버킷 이름
              Key: 'control/private.txt', // [폴더 및 파일 경로]
              Expires: getExpiresInSeconds // URL 유효 시간 (초)
            }; 

            const getUrl = await s3.getSignedUrl('getObject', getParams); // ------> getObject


            // -----------------------------------------
            // [PUT 업로드 용도 : Pre-Signed URL 생성 요청]
            // -----------------------------------------
            const putExpiresInSeconds = 3600; // 만료 시간 (3600 초 : 1시간) 
            const putParams = {
              Bucket: 'service\', // 버킷 이름
              Key: 'control/photo.jpg', // [폴더 및 파일 경로]
              Expires: putExpiresInSeconds, // URL 유효 시간 (초)
              ContentType: "image/jpeg", // 업로드할 파일 타입
            }; 

            const putUrl = await s3.getSignedUrl('putObject', putParams); // ------> putObject

        };

    </script>

// --------------------------------------------------------------------------------------






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

[Aws 사이트 : 미리 서명된 URL을 통해 객체 공유]

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/PresignedUrlUploadObject.html


[Aws SigV4 인증 및 서명 프로토콜 설명 - AWS4Signer API 호출 시 서명 사용]

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


[Aws Kvs HLS 라이브 스트리밍 시청 및 녹화 영상 업로드 방법 정리]

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


[[android] Aws Kvs HLS PutMedia 스트리밍 동영상 업로드 로직 정리 - DataEndpoint, MKV , AWS4Signer]

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

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