전 세계에 콘텐츠를 배포하는 CDN 서비스인 CloudFront

이재홍 http://www.pyrasis.com 2014.03.24 ~ 2014.06.30

Custom Policy를 사용한 Signed URL 생성하기

이번에는 Custom Policy를 사용한 Signed URL을 직접 생성해보겠습니다.

EC2 인스턴스 혹은 Linux가 설치된 컴퓨터에 SSH로 접속합니다. 그리고 텍스트 편집기를 열고 아래와 같이 작성한 뒤 custom_policy.json로 저장합니다.

  • Resource: http://*로 모든 파일이 적용되도록 설정합니다. http://*.pdf 처럼 확장자를 지정할 수도 있습니다.
  • IpAddress: 특정 IP에서만 파일을 받을 수 있도록 설정합니다. 여러분들의 공인 IP 주소를 입력합니다. 사설 IP(192.168.0.x, 10.0.0.x)는 사용할 수 없습니다. 이 부분은 옵션이므로 사용하지 않아도 Signed URL은 동작합니다.
  • DateLessThan → AWS:EpochTime: Signed URL에서는 이 만료날짜 값이 필수입니다. 그리고 UTC 형식을 사용해야 합니다. 위의 정책 파일에서 1399206886 값은 이미 지나가버린 시간 값이므로 그대로 사용하면 Signed URL이 동작하지 않습니다. 꼭 미래의 시간 값을 사용하기 바랍니다.

custom_policy.json

{
   "Statement": [{
      "Resource":"http://*",
      "Condition":{
         "IpAddress":{"AWS:SourceIp":"111.111.111.111"},
         "DateLessThan":{"AWS:EpochTime":1399206886}
      }
   }]
}

UTC 값을 생성하는 방법은 ‘12.4.3 Canned Policy를 사용한 Signed URL 생성하기’에서 ‘웹에서 UTC 값 생성하기’를 참조하기 바랍니다.

내 공인 IP 확인하기
http://checkip.amazonaws.com/에 접속하면 자신의 공인 IP를 확인할 수 있습니다.

정책 파일의 공백을 모두 제거하고 한 줄로 만듭니다. 공백과 개행문자(새 줄)이 있으면 Signed URL이 동작하지 않습니다. 특히 파일 맨 끝의 개행문자는 꼭 제거해야 합니다.

custom_policy.json

{"Statement":[{"Resource":"http://*","Condition":{"IpAddress":{"AWS:SourceIp":"111.111.111.111"},"DateLessThan":{"AWS:EpochTime":1399206886}}}]}

공백과 개행문자를 제거하는 방법은 ‘12.4.3 Canned Policy를 사용한 Signed URL 생성하기’에서 ‘Vim에서 공백 및 개행문자 제거하기’를 참조하기 바랍니다.

다음과 같이 명령을 입력하여 custom_policy.json 파일을 BASE64 형식으로 변환합니다.

[ec2-user@ip-172-31-21-171 ~]$ cat custom_policy.json | openssl base64 | tr '+=/' '-_~'
eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovLyoiLCJDb25kaXRpb24i
OnsiSXBBZGRyZXNzIjp7IkFXUzpTb3VyY2VJcCI6IjE4My45OC4zOC4xOTYifSwi
RGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjEzOTkyMDY4ODZ9fX1dfQo_
  • cat canned_policy.json: 방금 작성한 custom_policy.json 파일 입니다.
  • openssl base64: custom_policy.json 파일의 내용을 BASE64로 인코딩합니다.
  • tr ‘+=/’ ‘-_~’: BASE64로 인코딩 된 값 중에서 URL로 인식될 수 있는 문자를 다른 것으로 바꿉니다.

출력된 값을 메모장이나 기타 텍스트 에디터에 복사해둡니다.

그리고 다음과 같이 명령을 입력하여 서명 값Signature을 생성합니다.

[ec2-user@ip-172-31-21-171 ~]$ cat custom_policy.json | openssl sha1 -sign pk-APKAJERVTR4A7EO47UYA.pem | openssl base64 | tr '+=/' '-_~'
UE9R~Xhny-kwZF2lQQ6nJbmIh-baCFj7HkAw4~zjZpw9n11laoE2y9t3YhHHaQKN
7UgfDnX4F4FRpEz-5qBaFvNu5p6roLiLFLAr53Xha5DcwdyT3xDEFGduDE5UbA4w
Xxd3rBJbkK2Oc3LVN5XXu0OfrdScMc-3fYooIjoFwLZLuiNc8lxqLdqvWgNIgJu3
9EDwiNHVzmp-LfGaF-sJIfgoGBA7Xe1XDL94xaU7YM31kQ68jPea-s5C81xHDTDR
ZjMD-TDcRzLFPr6OWRq878MtUTSbMKUxJl8qhp76gvrn~XuKZMygO~PNYFMmS3QM
H5E~Mn9jwn-YiyJjpYtMQw__
  • cat custom_policy.json: 방금 작성한 custom_policy.json 파일 입니다.
  • openssl sha1 -sign pk-APKAJERVTR4A7EO47UYA.pem: pk-APKAJERVTR4A7EO47UYA.pem는 CloudFront 키(Key Pair)에서 개인 키 파일입니다. 여러분들이 생성한 개인 키 파일을 지정합니다.
  • openssl base64: 서명 값(Signature)를 BASE64로 인코딩합니다.
  • tr ‘+=/’ ‘-_~’: BASE64로 인코딩 된 값 중에서 URL로 인식될 수 있는 문자를 다른 것으로 바꿉니다.

명령을 입력하면 canned_policy.json의 내용을 서명한 데이터가 출력됩니다.

메모장이나 기타 텍스트 편집기에서 아래와 같이 Signed URL을 직접 생성합니다.

  • http://d38443sd7c5866.cloudfront.net/index.html: 접속할 CloudFront 도메인과 파일명입니다. 이 도메인은 여러분들이 생성한 CloudFront 배포 도메인을 입력합니다.
  • Policy: custom_policy.json을 BASE64 형태로 변환한 값을 이곳에 붙입니다. 생성할 때는 여러 줄로 출력이 되지만 URL로 사용할 때는 한 줄로 만들어서 붙여야 합니다.
  • Signature: 생성한 서명 값을 이곳에 붙입니다. 생성할 때는 여러 줄로 출력이 되지만 URL로 사용할 때는 한 줄로 만들어서 붙여야 합니다.
  • Key-Pair-Id: CloudFront 액세스 키 값 입니다. 여러분들이 생성한 액세스 키 값을 입력합니다.
http://d38443sd7c5866.cloudfront.net/index.html?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovLyoiLCJDb25kaXRpb24iOnsiSXBBZGRyZXNzIjp7IkFXUzpTb3VyY2VJcCI6IjE4My45OC4zOC4xOTYifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjEzOTkyMDY4ODZ9fX1dfQo_&Signature=UE9R~Xhny-kwZF2lQQ6nJbmIh-baCFj7HkAw4~zjZpw9n11laoE2y9t3YhHHaQKN7UgfDnX4F4FRpEz-5qBaFvNu5p6roLiLFLAr53Xha5DcwdyT3xDEFGduDE5UbA4wXxd3rBJbkK2Oc3LVN5XXu0OfrdScMc-3fYooIjoFwLZLuiNc8lxqLdqvWgNIgJu39EDwiNHVzmp-LfGaF-sJIfgoGBA7Xe1XDL94xaU7YM31kQ68jPea-s5C81xHDTDRZjMD-TDcRzLFPr6OWRq878MtUTSbMKUxJl8qhp76gvrn~XuKZMygO~PNYFMmS3QMH5E~Mn9jwn-YiyJjpYtMQw__&Key-Pair-Id=APKAJERVTR4A7EO47UYA

이제 Custom Policy를 사용한 Signed URL이 완성되었습니다. 웹 브라우저에서 이 URL로 접속해봅니다.

index.html의 내용이 정상적으로 출력됩니다. custom_policy.json 파일의 DateLessThan → AWS:EpochTime에 설정한 날짜와 시간이 지났거나, 접속한 IP 주소가 맞지 않으면 index.html 파일의 내용을 볼 수 없습니다.


그림 12-54 Custom Policy를 사용한 Signed URL에 접속

설정을 다 했는데도 Signed URL이 동작하지 않는다면 Resource에서 도메인과 파일명이 정확하게 설정되었는지, custom_policy.json에서 공백과 개행문자, 파일 끝의 개행문자를 제거했는지, 서명에 사용한 개인 키와 Key-Pair-Id에 설정한 액세스 키가 동일한 것인지 확인하기 바랍니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.