오브젝트스토리지

[오브젝트 스토리지 활용] 프라이빗 컨텐츠 전달하기

오브젝트 스토리지를 이용해서 허가된 사용자에게만, 제한된 시간동안만 컨텐츠를 공유하는 방법입니다.

Access Key와 Secret Key에 의해 미리 서명(signed)된 값을 쿼리 파라미터 URL을 만들어 사용하는 방식입니다.

 

 

 

Pre-signed url이란 무엇인가?


 

Pre-signed url 미리 서명된 URL을 뜻하며,  특정 오브젝트에  일정시간동안 접근할 수 있도록 하는 기능을 말합니다. 

Pre-signed url을 사용하게 되면 해당 URL을 통해 오브젝트에 접근할 수 있으며, 만료기간 설정을 통해 해당기간 이후에는 해당 url로 접속해도 접근이 불가하게 됩니다. 

 

 

 

Pre-Signed url를 활용한 프라이빗 컨텐츠 전달하기


 

위의 설명처럼 Pre-Signed url를 사용하게 되면 접근정책 - 공개안함(private) 인 오브젝트에 일정시간동안 접근할 수 있으며 , 보다 프라이빗하게 컨텐츠를 전달할 수 있습니다.

 

 먼저, 접근정책 - 공개안함(private) 인 presigned_url 이라는 버킷에 테스트용 오브젝트(파일) 하나를 업로드 해 보겠습니다. 

 

 

 

해당 파일의 상세정보에 나와있는 링크로 접속시 접근이 거부됩니다. 

 

 

< 링크 접속>  

 

 

 해당 오브젝트의 Pre-signed url를 통해 접속시 정상적으로 이미지가 보이는것을 확인할 수 있습니다.  

  < Pre-signed url 예시 >    

https://kr.object.iwinv.kr/presigned_url/smileserv.jpg
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=CCIJ3AHV5Y2W1EQ3GZ07%2F20200820%2Fus-east-1%2Fs3%2Faws4_request
&X-Amz-Date=20200820T233622Z&X-Amz-Expires=120&X-Amz-SignedHeaders=host
&X-Amz-Signature=fbf81827947f00f1ecd2902dc9398c9de73531c8e537862eb534644a349d4ff4

 

 

 

 

 

 해당 presigned url은 expires(만료시간) 설정이 120초이기 때문에 url 생성 120초 후에 접속시 접근이 거부됩니다. 

 

 

 

아래  SDK , Client Tool 별 메뉴얼을 통해 손쉽게 Pre-Signed url를 생성하고,  해당 url로 나만의 컨텐츠를 프라이빗하게 공유하시면 되겠습니다.  

 SDK , Clinet Tool 설치 및 사용 메뉴얼은 메뉴얼 가장 아래의 참고 메뉴얼의 링크를 이용하시면 되겠습니다. 

 

 

AWS cli   


 

AWS cli에서 Pre-Singed url를 생성하기 위해서는 presign 명령어를 사용해야 합니다.   

---exprires-in 옵션을 사용하여 만료시간(초단위)을 정할 수 있으며 ,  명령어 입력시 위의 예시에서 사용한 형식의 Pre-Signed url를 출력합니다.

Pre-Signed url의 세부사항은 링크 의 매개변수항목을 참조해주시면 감사하겠습니다.  

 

aws s3 presign s3://<버킷명>/<파일명> --expires-in <만료시간> --endpoint-url <엔드포인트>--profile <유저이름>

 

ex)  presinged_url 버킷에 smileserv.jpg 라는 파일을 120초동안 접근허용하는 presigned url 생성  ( 엔드포인트 kr.object.iwinv.kr 유저명 produser)

aws s3 presign s3://presigned/smileserv.jpg --expires-in 120 --endpoint-url https://kr.object.iwinv.kr --profile produser

 

 

 

Swift cli


 

Swift cli에서 presigned url를 생성하기 위해서는  tempurl 명령어를 사용해야 합니다. 

먼저 ,  tempurl 명령어는   

 인수의 경우 GET를 사용하며,   

 

 인수에는  Storage URL이 들어갑니다.   auth 명령어를 사용하여 Storage URL를 확인합니다. 

# swift auth 

export OS_STORAGE_URL=https://kr.object.iwinv.kr/swift/v1/AUTH_30fa689948fd4dc311b5ada86487b094f...
export OS_AUTH_TOKEN=AUTH_rgwtk550000003330666136383939343866643464633331316235616461383....

 

 인수에 사용되는 secret temporary URL을 생성합니다.  (임의값지정 )

swift post -m "Temp-URL-Key:t3968dsd0207b57v06ccc434d"

 

이제 presign 명령어를 사용하여  Pre-signed url를 생성합니다.

swift tempurl

 

ex) presinged_url 버킷에 smileserv.jpg 라는 파일을 2020년 8월 22일 오후3시10분10초까지 접근허용하는 presigned url 생성

swift tempurl GET 2020-08-22T15:10:00 https://kr.object.iwinv.kr/swift/v1/AUTH_30fa689948fd4dc311b5ada86487b094f.../presigned_url/smileserv.jpg t3968dsd0207b57v06ccc434d

 

 

 

PHP SDK 


 

php-sdk를 사용하면 아래 코드를 통해 손쉽게 Pre-signed url을 생성할 수 있습니다. 

 

PHP 7.X

use Aws\Exception\AwsException;

$s3Client = new S3Client([
'region' => 'kr-standard',
'version' => 'latest',
'credentials' => [
'key' => 'Access_Key',
'secret' => 'Secret_Key',
],
'endpoint' => 'Endpoint'
]);

$cmd = $s3Client->getCommand('GetObject', [
'Bucket' => 'Bucket_Name',
'Key' => 'Object_Name'
]);

$request = $s3Client->createPresignedRequest($cmd, '+2 minutes');  # +2 minutes는 만료시간 2분

$presignedUrl = (string) $request->getUri();

echo $presignedUrl;

 

PHP 5.X 

use Aws\Exception\AwsException;

$s3Client = Aws\S3\S3Client::factory(array(

'key' => Access_Key,

'secret' => Secret_Key,

'endpoint' => 'Endpoint',));

$cmd = $s3Client->getCommand('GetObject', [
'Bucket' => 'Bucket_Name',
'Key' => 'Object_Name'
]);

$request = $s3Client->createPresignedRequest($cmd, '+2 minutes'); # +2 minutes는 만료시간 2분

$presignedUrl = (string) $request->getUri();

echo $presignedUrl;

 

 

 

 

Python SDK


 

Python sdk를 사용하면 아래 코드를 통해 손쉽게 Pre-signed url을 생성할 수 있습니다. 

 

import boto3

service_name = 's3'
endpoint_url = 'Endpoint'
region_name = 'kr-standard'
access_key = 'Access_Key'
secret_key = 'Secret_Key'

if __name__ == "__main__":
s3 = boto3.client(service_name, endpoint_url=endpoint_url, aws_access_key_id=access_key,
aws_secret_access_key=secret_key)

url = s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': 'Bucket_Name',
'Key': 'Object_Name'
},
ExpiresIn=Expires_Seconds # 만료시간을 60초하고싶을 경우 60, 하루로 하고싶다면 86400
)

print(url)

 

 

 

 

JAVA Script SDK (Node.js) 


 

JAVA Script SDK (Node.js) 를 사용하면 아래 코드를 통해 손쉽게 Presigned url을 생성할 수 있습니다. 

 

var AWS = require('aws-sdk');

AWS.config.loadFromPath('./config.json');
AWS.config.update({region: 'default'});

const s3 = new AWS.S3();
// Set the parameters
const myBucket = process.argv[2]; 
const myKey = process.argv[3]; 
const signedUrlExpireSeconds = Expires_Seconds// 만료시간을 60초하고싶을 경우 60, 하루로 하고싶다면 86400

const presignedURL = s3.getSignedUrl('getObject', {
Bucket: myBucket,
Key: myKey,
Expires:signedUrlExpireSeconds
})

 

# 실행 명령어 

node 파일명.js [Bucket_Name] [Object_Name]

 

 

 

 

CyberDuck


 

Cyberduck에서 Pre-signed url  생성하기 위해서는  URL복사 , 웹사이트 열기 기능에 서명됨 URL를 사용하면 됩니다.  

 

아래와 같이 해당 오브젝트을 선택후 마우스 우클릭을 하여 여러 메뉴중 URL복사, 웹사이트 열기를 선택합니다. 

 

 

 

URL 복사의 경우 해당 URL을 복사하며,  웹사이트 열기의 경우 클릭시 바로 해당 URL로 접속합니다. 

여러 세부 메뉴중 서명됨 URL을 선택합니다.   ( 생성시간 기준 만료시간 1시간  // 하루 // 일주일 중 선택 가능합니다. )

 

 

 

참고 메뉴얼


 

iwinv Object Storage - AWS_cli

iwinv Object Storage - Swift

iwinv Object Storage - PHP SDK

iwinv Object Storage - Python SDK

iwinv Object Storage - Java script SDK (Node.js)

Object Storage Client Tool - Cyberduck