AWS SDK for PHP버전 3으로 Amazon CloudFront URL에 서명 - AWS SDK for PHP

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS SDK for PHP버전 3으로 Amazon CloudFront URL에 서명

서명된 URL을 사용하여 사용자에게 프라이빗 콘텐츠에 대한 액세스를 제공할 수 있습니다. 서명된 URL에는 만료 날짜 같은 추가 정보가 포함되므로 콘텐츠에 대한 액세스를 더욱 세부적으로 제어할 수 있습니다. 이러한 추가 정보는 미리 준비된(canned) 정책 또는 사용자 지정 정책에 따라 정책 설명에 나타납니다. 비공개 배포를 설정하는 방법과 URL에 서명해야 하는 이유에 대한 자세한 내용은 Amazon CloudFront CloudFront 개발자 안내서의 Amazon을 통한 비공개 콘텐츠 제공을 참조하십시오.

  • CloudFront GetSignedurl을 사용하여 서명된 아마존 URL을 생성합니다.

  • 를 사용하여 서명된 Amazon CloudFront 쿠키를 생성합니다 getSignedCookie.

의 모든 예제 코드는 여기에서 확인할 수 GitHub 있습니다. AWS SDK for PHP

보안 인증 정보

예제 코드를 실행하기 전에 보안 인증에 설명된 대로 AWS 보안 인증을 구성합니다. 그 다음 기본 사용법에 설명된 대로 AWS SDK for PHP를 가져옵니다.

Amazon 사용에 대한 자세한 내용은 Amazon CloudFront CloudFront 개발자 안내서를 참조하십시오.

프라이빗 배포를 위한 서명 CloudFront URL

SDK의 CloudFront 클라이언트를 사용하여 URL에 서명할 수 있습니다. 먼저 CloudFrontClient 객체를 생성해야 합니다. 미리 준비된 정책 또는 사용자 지정 정책을 사용하여 동영상 리소스의 CloudFront URL에 서명할 수 있습니다.

가져오기

require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;

샘플 코드

function signPrivateDistribution( $cloudFrontClient, $resourceKey, $expires, $privateKey, $keyPairId ) { try { $result = $cloudFrontClient->getSignedUrl([ 'url' => $resourceKey, 'expires' => $expires, 'private_key' => $privateKey, 'key_pair_id' => $keyPairId ]); return $result; } catch (AwsException $e) { return 'Error: ' . $e->getAwsErrorMessage(); } } function signAPrivateDistribution() { $resourceKey = 'https://d13l49jEXAMPLE.cloudfront.net/my-file.txt'; $expires = time() + 300; // 5 minutes (5 * 60 seconds) from now. $privateKey = dirname(__DIR__) . '/cloudfront/my-private-key.pem'; $keyPairId = 'AAPKAJIKZATYYYEXAMPLE'; $cloudFrontClient = new CloudFrontClient([ 'profile' => 'default', 'version' => '2018-06-18', 'region' => 'us-east-1' ]); echo signPrivateDistribution( $cloudFrontClient, $resourceKey, $expires, $privateKey, $keyPairId ); } // Uncomment the following line to run this code in an AWS account. // signAPrivateDistribution();

URL을 만들 CloudFront 때는 사용자 지정 정책을 사용하십시오.

사용자 지정 정책을 사용하려면 policy 대신 expires 키를 제공합니다.

가져오기

require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;

샘플 코드

function signPrivateDistributionPolicy( $cloudFrontClient, $resourceKey, $customPolicy, $privateKey, $keyPairId ) { try { $result = $cloudFrontClient->getSignedUrl([ 'url' => $resourceKey, 'policy' => $customPolicy, 'private_key' => $privateKey, 'key_pair_id' => $keyPairId ]); return $result; } catch (AwsException $e) { return 'Error: ' . $e->getAwsErrorMessage(); } } function signAPrivateDistributionPolicy() { $resourceKey = 'https://d13l49jEXAMPLE.cloudfront.net/my-file.txt'; $expires = time() + 300; // 5 minutes (5 * 60 seconds) from now. $customPolicy = <<<POLICY { "Statement": [ { "Resource": "$resourceKey", "Condition": { "IpAddress": {"AWS:SourceIp": "{$_SERVER['REMOTE_ADDR']}/32"}, "DateLessThan": {"AWS:EpochTime": $expires} } } ] } POLICY; $privateKey = dirname(__DIR__) . '/cloudfront/my-private-key.pem'; $keyPairId = 'AAPKAJIKZATYYYEXAMPLE'; $cloudFrontClient = new CloudFrontClient([ 'profile' => 'default', 'version' => '2018-06-18', 'region' => 'us-east-1' ]); echo signPrivateDistributionPolicy( $cloudFrontClient, $resourceKey, $customPolicy, $privateKey, $keyPairId ); } // Uncomment the following line to run this code in an AWS account. // signAPrivateDistributionPolicy();

CloudFront 서명된 URL 사용

서명된 URL의 형태는 서명하는 URL이 "HTTP" 체계를 사용하는지 또는 "RTMP" 체계를 사용하는지에 따라 다릅니다. "HTTP"의 경우 전체 절대 URL이 반환됩니다. "RTMP"의 경우 편의를 위해 상대 URL만 반환됩니다. 이렇게 하는 이유는 일부 플레이어에서 호스트와 경로를 별도의 파라미터로 제공해야 하기 때문입니다.

다음 예제에서는 JWPlayer를 사용하여 비디오를 표시하는 웹 페이지를 생성하기 위해 서명된 URL을 사용하는 방법을 보여 줍니다. 같은 유형의 기법이 다른 플레이어 (예:) 에도 FlowPlayer적용되지만 클라이언트측 코드는 달라야 합니다.

<html> <head> <title>|CFlong| Streaming Example</title> <script type="text/javascript" src="https://example.com/jwplayer.js"></script> </head> <body> <div id="video">The canned policy video will be here.</div> <script type="text/javascript"> jwplayer('video').setup({ file: "<?= $streamHostUrl ?>/cfx/st/<?= $signedUrlCannedPolicy ?>", width: "720", height: "480" }); </script> </body> </html>

비공개 배포를 위한 CloudFront 쿠키 서명

서명된 URL에 대한 대체 방법으로, 서명된 쿠키를 통해 프라이빗 배포에 대한 클라이언트 액세스 권한을 부여할 수도 있습니다. 서명된 쿠키를 사용하면 HLS 형식의 비디오용 모든 파일 또는 웹 사이트의 구독자 영역에 있는 모든 파일과 같은 여러 개의 제한된 파일에 대한 액세스 권한을 제공할 수 있습니다. 서명된 URL 대신 서명된 쿠키를 사용해야 하는 이유 (또는 그 반대) 에 대한 자세한 내용은 Amazon CloudFront 개발자 안내서의 서명된 URL과 서명된 쿠키 중 선택을 참조하십시오.

서명된 쿠키를 생성하는 방법은 서명된 URL을 생성하는 방법과 비슷합니다. 유일한 차이점은 호출되는 메서드입니다(getSignedUrl 대신 getSignedCookie).

가져오기

require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;

샘플 코드

function signCookie( $cloudFrontClient, $resourceKey, $expires, $privateKey, $keyPairId ) { try { $result = $cloudFrontClient->getSignedCookie([ 'url' => $resourceKey, 'expires' => $expires, 'private_key' => $privateKey, 'key_pair_id' => $keyPairId ]); return $result; } catch (AwsException $e) { return [ 'Error' => $e->getAwsErrorMessage() ]; } } function signACookie() { $resourceKey = 'https://d13l49jEXAMPLE.cloudfront.net/my-file.txt'; $expires = time() + 300; // 5 minutes (5 * 60 seconds) from now. $privateKey = dirname(__DIR__) . '/cloudfront/my-private-key.pem'; $keyPairId = 'AAPKAJIKZATYYYEXAMPLE'; $cloudFrontClient = new CloudFrontClient([ 'profile' => 'default', 'version' => '2018-06-18', 'region' => 'us-east-1' ]); $result = signCookie( $cloudFrontClient, $resourceKey, $expires, $privateKey, $keyPairId ); /* If successful, returns something like: CloudFront-Expires = 1589926678 CloudFront-Signature = Lv1DyC2q...2HPXaQ__ CloudFront-Key-Pair-Id = AAPKAJIKZATYYYEXAMPLE */ foreach ($result as $key => $value) { echo $key . ' = ' . $value . "\n"; } } // Uncomment the following line to run this code in an AWS account. // signACookie();

쿠키를 생성할 때는 사용자 지정 정책을 사용하십시오. CloudFront

getSignedUrl과 마찬가지로, 'policy' 파라미터 및 expires 파라미터 대신 url 파라미터를 제공하여 사용자 지정 정책으로 쿠키에 서명할 수 있습니다. 사용자 지정 정책에서는 리소스 키에 와일드카드가 포함될 수 있습니다. 이렇게 하면 여러 개의 파일에 사용할 하나의 서명된 쿠키를 생성할 수 있습니다.

getSignedCookie는 프라이빗 배포에 대한 액세스 권한을 부여하기 위해 모두 쿠키로 설정해야 하는 키-값 페어의 배열을 반환합니다.

가져오기

require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;

샘플 코드

function signCookiePolicy( $cloudFrontClient, $customPolicy, $privateKey, $keyPairId ) { try { $result = $cloudFrontClient->getSignedCookie([ 'policy' => $customPolicy, 'private_key' => $privateKey, 'key_pair_id' => $keyPairId ]); return $result; } catch (AwsException $e) { return [ 'Error' => $e->getAwsErrorMessage() ]; } } function signACookiePolicy() { $resourceKey = 'https://d13l49jEXAMPLE.cloudfront.net/my-file.txt'; $expires = time() + 300; // 5 minutes (5 * 60 seconds) from now. $customPolicy = <<<POLICY { "Statement": [ { "Resource": "{$resourceKey}", "Condition": { "IpAddress": {"AWS:SourceIp": "{$_SERVER['REMOTE_ADDR']}/32"}, "DateLessThan": {"AWS:EpochTime": {$expires}} } } ] } POLICY; $privateKey = dirname(__DIR__) . '/cloudfront/my-private-key.pem'; $keyPairId = 'AAPKAJIKZATYYYEXAMPLE'; $cloudFrontClient = new CloudFrontClient([ 'profile' => 'default', 'version' => '2018-06-18', 'region' => 'us-east-1' ]); $result = signCookiePolicy( $cloudFrontClient, $customPolicy, $privateKey, $keyPairId ); /* If successful, returns something like: CloudFront-Policy = eyJTdGF0...fX19XX0_ CloudFront-Signature = RowqEQWZ...N8vetw__ CloudFront-Key-Pair-Id = AAPKAJIKZATYYYEXAMPLE */ foreach ($result as $key => $value) { echo $key . ' = ' . $value . "\n"; } } // Uncomment the following line to run this code in an AWS account. // signACookiePolicy();

Guzzle 클라이언트에 CloudFront 쿠키 전송

이러한 쿠키를 Guzzle 클라이언트에 사용하기 위해 GuzzleHttp\Cookie\CookieJar에 전달할 수도 있습니다.

use GuzzleHttp\Client; use GuzzleHttp\Cookie\CookieJar; $distribution = "example-distribution.cloudfront.net"; $client = new \GuzzleHttp\Client([ 'base_uri' => "https://$distribution", 'cookies' => CookieJar::fromArray($signedCookieCustomPolicy, $distribution), ]); $client->get('video.mp4');

자세한 내용은 Amazon CloudFront 개발자 안내서의 서명된 쿠키 사용을 참조하십시오.