https://github.com/aws/aws-sdk-php
GitHub - aws/aws-sdk-php: Official repository of the AWS SDK for PHP (@awsforphp)
Official repository of the AWS SDK for PHP (@awsforphp) - GitHub - aws/aws-sdk-php: Official repository of the AWS SDK for PHP (@awsforphp)
github.com
일반적으로 공개 되는 링크가 아닌 비공개 링크를 사용할때 많이 사용하는 SignedUrl 이다.
웹툰과 같이 유료로 배포하거나 음원사이트에서 유로 배포할때 사용할수 있다.
만료 시간을 정하거나 접근하는 사용자의 아이피를 제한하거나 할수 있다.
기본 적인 사용시 1개의 Url 에 대한 만료 기한을 가진 1개의 SignedUrl 을 얻을수 있다
require 'vendor/autoload.php';
use Aws\CloudFront\CloudFrontClient;
use Aws\Exception\AwsException;
$resourceKey = 'https://test.cloudfront.net/test_file.txt';
$expires = time() + 60 * 60 * 3; // 60초 * 60분 * 3 = 3시간 후 만료.
$keyPairId = 'AAKLLLFFKKKFFOOOFPPPFLLFE'; // CloundFront key pair id
$privateKey = dirname(__DIR__) . "/cloudfront/pk-{$keyPairId}.pem";
$cloudFrontClient = new CloudFrontClient([
'profile' => 'default',
'version' => '2014-11-06',
'region' => 'us-east-1'
]);
$signedUrl = $resourceKey;
try {
$signedUrl = $cloudFrontClient->getSignedUrl([
'url' => $resourceKey,
'expires' => $expires,
'private_key' => $privateKey,
'key_pair_id' => $keyPairId
]);
} catch (AwsException $e) {
echo 'Error: ' . $e->getAwsErrorMessage();
}
echo $signedUrl;
3시간후 만료시간을 가지는 url 이 생성 되었다.
이렇게 사용해도 문제가 없지만 웹툰이라든가 화보집등 이미지가 동일 디렉토리에 2~300개가 되는 경우 php의 openssl_sign 이 너무 느려 페이지가 늦게 뜨는 경우가 생긴다.
보통 사양의 ec2에서 300개의 url 을 sign 하는데 최대 3초 정도가 걸렸다.
이럴 경우 widcard 를 사용하여 한 폴더를 통체로 사용할수 있다.
예를 들어
"https://test.cloudfront.net/story/14/1.png",
"https://test.cloudfront.net/story/14/2.png",
"https://test.cloudfront.net/story/14/3.png"
위와 같은 url 이 있을경우 wildcard "*"를 사용하여 아래와 같이 변경할 수 있다.
"https://test.cloudfront.net/story/14/*.png"
와일드 카드를 사용할때는 개별 Policy를 사용해야 한다. 그렇게 되면 url에 Policy 가 포함된 SignedUrl 을 얻을수 있다.
require 'vendor/autoload.php';
use Aws\CloudFront\CloudFrontClient;
use Aws\Exception\AwsException;
$resourceKey = 'https://test.cloudfront.net/story/14/*.png';
$expires = time() + 60 * 60 * 3; // 60초 * 60분 * 3 = 3시간 후 만료.
$keyPairId = 'AAKLLLFFKKKFFOOOFPPPFLLFE'; // CloundFront key pair id
$privateKey = dirname(__DIR__) . "/cloudfront/pk-{$keyPairId}.pem";
$cloudFrontClient = new CloudFrontClient([
'profile' => 'default',
'version' => '2014-11-06',
'region' => 'us-east-1'
]);
$signedUrl = $resourceKey;
$customPolicy = json_encode(['Statement' => [['Resource' => $resourceKey,'Condition' => ['DateLessThan' => ['AWS:EpochTime' => $expires]]]]], JSON_UNESCAPED_SLASHES);
try {
$signedUrl = $cloudFrontClient->getSignedUrl([
'url' => $resourceKey,
'policy' => $customPolicy,
'private_key' => $privateKey,
'key_pair_id' => $keyPairId
]);
} catch (AwsException $e) {
echo 'Error: ' . $e->getAwsErrorMessage();
}
// 기본이되는 signedUrl
echo $signedUrl."<br>";
for ($j = 0; $j < 300; $j++)
{
// 파일별로 이름을 지정해줘도 사용할 수 있다.
echo str_replace("*", $j, $signedUrl);
echo "<br>";
}
위와 같이 와일드 카드를 사용하면 "*" 부분에 어떠한 글씨가 들어가도 상관 없이 시간이 제한된 url을 사용할수 있다.
이렇게 300번 암호화할 것을 1번으로 끝냈다.
'Php' 카테고리의 다른 글
php GuzzleHttp 를 이용한 멀티 푸시 보내기 (0) | 2022.07.13 |
---|---|
MacOs 에서 php 개발 환경 구축하기 2탄 로컬 서버 셋팅 (0) | 2022.05.26 |
MacOs 에서 php 개발 환경 구축하기 with Eclipse (0) | 2022.05.26 |