
{
"Statement": [
{
"Resource": "https://*",
"Condition": {
"IpAddress": {
"AWS:SourceIp": "192.0.2.10/32"
},
"DateGreaterThan": {
"AWS:EpochTime": 1357034400
},
"DateLessThan": {
"AWS:EpochTime": 1357120800
}
}
}
]
}
공식문서에 어느정도 나와있다. 그렇지만 Custom Policy를 사용하는 것은 설명이 친절하지 않으며 AWS Jdk 버전에 따라서 그 방식도 상이하다. 그래도 몇가지 포인트만 확인하면 쉽게 잘 구현할 수 있을 것이다.
private final CloudFrontUtilities cloudFrontUtilities = CloudFrontUtilities.create();
Instant now = Instant.now();
Instant expireDate = now.plusSeconds(2 * 60 * 60); // 2시간 동안 유효
CustomSignerRequest request;
try {
request = CustomSignerRequest.builder()
.resourceUrl(resourcePathPattern) // https://~~~~~~~~~~.cloudfront.net/images/post/* 와 같은 패턴
.resourceUrlPattern(resourcePathPattern) // 이부분은 사실 필요없다... 코드 내부를 까보면 resourceUrl로 대체된다.
.privateKey(Paths.get(privateKeyPath)) // private key 경로이다. .pem파일도 가능하며 절대경로로 지정해야한다.(배포 환경에 따른 환경변수 처리 필수)
.keyPairId(keyPairId) // key-pair-id 아니다.. 공개키의 ID이다. AWS 콘솔에서 확인할 수 있다.
.expirationDate(expireDate)
.activeDate(now.minusSeconds(5 * 60)) // 5분 전부터 유효
.ipRange("0.0.0.0/0") // ip 제한하려면 이 부분을 조절하면 된다.
.build();
} catch (Exception e) {
throw new RuntimeException("Failed to create CustomSignerRequest: " + e.getMessage(), e);
}
CookiesForCustomPolicy cookiesForCustomPolicy = cloudFrontUtilities.getCookiesForCustomPolicy(request);
// 아래와 같은 방식으로 쿠키에 필요한 3가지 값을 확인할 수 있다.
// 쿠키에 바로 사용가능한 Key=Value 형식으로 작성되어있다.
cookiesForCustomPolicy.policyHeaderValue(); // 정책을 Base64로 인코딩한 값
cookiesForCustomPolicy.signatureHeaderValue(); // 서명값
cookiesForCustomPolicy.keyPairIdHeaderValue(); // 공개키 ID 값
