signed URL이란 CloudFront로 배포되는 파일의 사용을 제한하는 기능이다.
즉, 특정 날짜가 지나면 파일을 받지 못하게 하거나, 특정 날짜가 지나야만 받게 하거나,
특정 IP만 파일을 볼 수 있게 하는 등의 용도로 사용한다.
주의할 점이 있다면
S3+CloudFront의 경우 Restrict Bucket Access를 Yes로 설정해야 하고(S3 부분 게시물에 올려 놓았다)
custom origin+CloudFront의 경우 웹 서버 레벨에서 CloudFront 접근만 가능하도록 설정해야 한다.
접근해오는 서버가 CloudFront인지 확인하려면 HTTP의 헤더를 확인해봐야 한다.
크롬에서 [개발자 도구]-[Network]를 열어서 확인해보자.
왼쪽이 EC2 접속 오른쪽이 CloudFront접속. X-Cache를 볼 수 있다.
꺼무위키를 인용하자면 다음과 같은 말이 있다.
이 서비스(CloudFront)는 유료 콘텐츠를 제공할 때 비로소 빛을 발한다. 서명 URL(Signed URL)이나 서명 쿠키를 사용해서 인증된 사용자에게만 콘텐츠를 배달하는 서비스를 할 수 있다.
출처) https://namu.wiki/w/Amazon%20Web%20Services?from=aws
즉, 유료 콘텐츠를 전달할 때 유용하다는 것이다.
Signed URL에는 2가지 종류가 있다
(왜 분리했는지 모르겠다. 강력한 custom policy를 사용하자)
1. Canned Policy를 사용한 Signed URL(미리 준비된 정책을 사용하여 서명된 URL 생성)
파일 1개의 사용을 제한합니다. 또한, 특정 날짜가 지나면 파일을 받지 못하게 하는 기능만 사용할 수 있습니다. 정책(Policy)의 내용이 URL에 포함되어 있지 않아 URL의 길이가 짧습니다.
2. Custom Policy를 사용한 Signed URL(사용자 지정 정책을 사용하여 서명된 URL 생성)
파일 여러 개의 사용을 제한합니다. 특정 날짜가 지나면 파일을 받지 못하게 하는 기능, 특정 날짜 이후에 파일을 받을 수 있도록 하는 기능, 특정 IP 혹은 IP대역에서만 파일을 받을 수 있도록 하는 기능을 사용할 수 있습니다. 정책(Policy)의 내용이 URL에 포함되어 있어 URL의 길이가 깁니다.
하여튼 Signed URL을 사용해보자.
서명 URL을 사용하기 위해선 CloudFront의 Behavior 설정을 바꿔야 한다.
우선 CloudFront에 가서 Distribution Settings를 눌러보자.
Behavors에서 Edit를 눌러 설정을 바꿔 봅시다.
Edit에서 Restrict Viewer Access에 Yes를 선택합니다.
설정을 마치면 Trusted Signers에 self가 뜬 것을 확인할 수 있습니다.
접속을 시도하면 MissingKey, 즉, 키가 없어서 접속할 수 없다고 뜬다.
이제 Signed URL(서명 URL)에 맞는 매개변수가 없으면 접근할 수 없는 것이다.
이제, 서명 URL을 위한 CloudFront 전용 키를 만들어보자.
RSA 암호를 기반으로 한 키 쌍(공개 키, 개인 키)를 만들어야 한다.
우선 상단의 자신의 이름을 클릭하여 '내 보안 자격 증명'으로 이동한다.
그 후 CloudFront 키 페어를 생성해주면 되겠다.
아래의 창을 그냥 닫으면 안된다!!! 반드시 다운로드 받고난 후에 닫아라
개인 키는 앞에 pk가 붙고 공개 키는 rsa가 붙으니 참고하라.
Canned Policy
Canned Policy를 사용해서 Signed URL을 만들어보자.
우선 오리진이 되는 EC2에 접속한 뒤
touch canned_policy.json
nano canned_policy.json
{
"Statement": [{
"Resource": "your CloudFront Domain",
"Condition": {
"DateLessThan": {
"AWS:EpochTime": [원하는 시간]
}
}
}]
}
위으 코드를 공백을 전부 없앤 뒤 canned_policy.json에 저장한다.
{"Statement":[{"Resource":"d1vpnjsa0ikc97.cloudfront.net","Condition":{"DateLessThan":{"AWS:EpochTime":1581751980}}}]}
이제 서명값을 생성하자.
cat canned_policy.json | openssl sha1 -sign [개인 키 파일] | openssl base64 | tr '+=' "-_~"
오류가 난다면
1. 실행하는 경로 내에 개인 키 파일이 있는지 (없다면 WinSCP를 이용해서 옮겨주자)
https://darrengwon.tistory.com/66?category=858372
2. json을 잘못 입력한 것이 아닌지
확인한다
명령을 입력하면 canned_policy.json의 내용을 서명한 데이터가 출력된다.
이제 Signed URL로 접속할 수 있다.
접속할CloudFront도메인?Expires=설정한timestamp&signature=생성된서명값&Key-Pair-Id=액세스키값
설정한 timestamp는 canned_policy.json에 입력한 값이며
생성된 서명값은 앞서 실행한 명령어로 나온 값이고
액세스 키 값은 아래 첨부한 사진(보안 자격 증명)의 액세스 키 ID를 말한다.
해당 경로로 접속했을 때 설정한 시간이 지나면 접속이 안된다.
성공적!
Cusmtom Policy
canned_policy와 대동소이하다.
앞서 왜 canned_policy와 custom_policy를 분리해놓았는지 모르겠다고 말한 이유가 여기에 있다.
'AWS > ☁️ AWS' 카테고리의 다른 글
AWS RDS와 EC2 연동하기 (0) | 2020.02.15 |
---|---|
AWS RDS (0) | 2020.02.15 |
AWS CloudFront / 커스텀 오리진 사용(EC2) + Invalidation + geo restrict (0) | 2020.02.14 |
AWS CloudFront / S3와 CloudFront 연동 (0) | 2020.02.14 |
AWS S3 : 객체 권한, 버켓 권한, 정적 웹 호스팅, 버저닝, 수명 주기 (0) | 2020.02.13 |