흰 스타렉스에서 내가 내리지

CF(6): CloudFront 컨텐츠 보호(1) 본문

AWS

CF(6): CloudFront 컨텐츠 보호(1)

주씨. 2024. 10. 26. 12:27
728x90

# 컨텐츠 접근 제한

  • CloudFront 에서 컨텐츠에 대한 접근 제한
    • CloudFront 에 접근하는 주체 별로 다르게 컨텐츠의 접근 제한이 필요한 경우  (1)
      • 예: 프리미엄 티어용 영상, 유저 전용 다운로드 이미지 등
    • CloudFront Origin 에 대한 직접 접근 제한
      • CloudFront 를 거치지 않고 직접 Origin 에 접근을 막고 싶은 경우   (2)

 


# CloudFront 에서 컨텐츠 접근 제한

  • CloudFront 에서 컨텐츠 접근 제한
    • 예: 프리미엄 티어용 영상, 유저 전용 다운로드 이미지 등
  • 2가지 방법
    • Signed URL : 권한 정보가 담긴 임시 URL을 발급하여 뷰어에게 전달하여 컨텐츠를 다운로드할 수 있도록 허용
      • URL 당 하나의 파일만 사용 가능
    • Signed Cookie : 뷰어가 권한을 행사해 다운로드할 수 있도록 컨텐츠 접근 권한을 가진 Cookie 를 발급해 뷰어에 전달
      • 다수의 파일에 사용 가능
    • (presigned 는 특정 시간 동안 권한을 부여하는 방식, signed 는 조건부 접근을 제어하는 방식).
    • (Amazon S3는 signed URL 대신 pre-signed URL 만을 지원한다. signed URL 개념은 CloudFront 같은 CDN 에서 주로 사용되며, 더 복잡한 조건부 접근을 위해 설정할 수 있다.).
  • 만료 기간 설정 가능

 


# Signer

  • Signed URL/Cookie 를 만들 권한을 가진 주체
  • 2가지 종류
    • Trusted Key Groups (추천) : CloudFront 에 Public/Private Key Pair 중 Public Key 를 등록하고, 가지고 있는 Private Key 로 Presigned URL/Cookie 를 생성하는 방식  (Signer : private key 를 가지고 있는 Application)
    • AWS Account (비추천) : Root 사용자 (IAM 사용자 불가능) 로 계정의 CloudFront Key Pair 를 다운받아 활용
      • 비추천 이유 : AWS Root 사용자를 활용해야 하고, API를 사용할 수 없고, IAM 을 통한 권한제어 불가능
  • CloudFront URL을 만들 때 Distribution 단위로 등록된 Key Group 을 사용
    • Key Group : Private/Public Key 로 이루어진 키쌍의 집합으로 CloudFront에 업로드하는 하나 이상의 Public Key 로 구성

 


# Presigned 정책

  • Presigned URL/Cookie 를 만들 때 URL/Cookie 의 권한을 설정하기 위한 정책
  • 2가지 종류
    • Canned (미리 준비된) Policy : 간단한 버전, 만료시간만 설정 가능
      • 단 URL이 짧아짐
    • Custom Policy : 모든 제약사항 설정 가능
      • base64 인코딩된 policy 내용이 들어가기 때문에 url 이 길어진다
  • 각 정책으로 Presigned URL/ Cookie 의 동작 범위(만료시간, IP 제한 등) 설정 가능
설명 Canned Policy Custom Policy
정책 재사용 No Yes
사용 가능 시점 적용 No Yes (optional)
만료 시점 적용 Yes Yes
IP Range 제한 No Yes (optional)

 

 


# Pre-signed url 실습

* README.md

# 데모 프로젝트 적용 순서

1. Public/Private KeyPair 생성

```shell
openssl genrsa -out private_key.pem 2048 
openssl rsa -pubout -in private_key.pem -out public_key.pem
```

2. CloudFront에서 Public Key 등록 후 Keygroup 생성
3. .env 파일에 PUBLIC_KEY_ID, KEYGROUP_ID에 각각 public key id, KeyGroup ID 등록
4. Systems Manager Parameter Store (Default 경로: /demo-cf-presigned-url/dev/private_key/1)에 private key 내용 등록
5. node18이상 설치
6. yarn 설치

```shell
npm install yarn -g
```


7. aws cli 설치 / aws configure
8. 배포

```shell
yarn deploy --aws-profile [자신의 프로파일 명]
```

 

 

1. private, public key 생성

private, public key 생성

 

2. CloudFront에서 Public Key 등록 후 Keygroup 생성

CloudFront > 좌측 탭 키 관리 > 퍼블릭 키
CloudFront > 퍼블릭 키 > 퍼블릭 키 생성

 

퍼블릭 키 생성 > public key 붙여넣기 (Name 은 크게 중요하지 않다.)
public key 등록 완료

 

keygroup 은 public key 의 집합이다. 

CloudFront > 좌측 탭 키 관리 > 퍼블릭 키
키 그룹 > 키 그룹 생성
키 그룹 생성 > Public Keys 선택 > Create key group
key group 생성 완료

 

 

 

3. CloudFront Distribution 에 key groups 연결

CloudFront > Distribution > 동작 > 편집
동작 > 편집 > 뷰어 액세스 제한 (Restrict viewer access) > Yes > Trusted key groups > 키 그룹 추가

 

방금 만든 키 그룹을 등록한다. 

뷰어 액세스를 제한하는 경우 뷰어는 CloudFront 서명된 URL 또는 서명된 쿠키를 사용하여 사용자의 콘텐츠에 액세스해야 합니다.

MissingKey

이전에 CloudFront 에서 접근했던 url에 접속하면, 위와 같은 화면이 나오며 접근이 불가능해진다. 

이제 Signed URL 혹은 Signed Cookie 를 사용해야만 컨텐츠에 액세스할 수 있다. 

 

 

4. Signed URLs 생성

이제 Signed URLs 를 코드상에서 생성해주면 된다. 

 

아래 링크는 AWS 공식문서에서 제공하는 프로그래밍 언어별 코드 예제이다. 

각자의 언어에 맞게 sdk 를 사용하여 애플리케이션에서 생성해도 좋고, 람다함수를 생성해도 좋다. 

https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/PrivateCFSignatureCodeAndExamples.html

 

서명 URL에 대한 서명을 만드는 코드 예제 - Amazon CloudFront

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

위 방법을 통해 생성된 Signed URLs 주소로 들어가면 접근 제한된 CloudFront 에 접근이 가능해질 것이다.