상세 컨텐츠

본문 제목

[쀼] S3에 업로드한 사진 : 이미지 핫링크 방지 과정 (3)

🔥Activites/[프로젝트] 진행하며 생각을 했다

by :부셔져버린개발자 2025. 2. 11. 12:09

본문

자 어디가 문제인지 확인해보자
 

가설1. CloudFront-Policy, CloudFront-Signature, CloudFront-Key-Pair-Id 를 생성하는 로직이 잘못되었을 것이다.

 
⚠️ 쿠키를 설정하여 Postman으로 요청을 보내보는데 누락된 키 쌍 ID 쿼리 매개 변수 또는 쿠키 값  이라는 메시지가 리턴되었다 
 
🧰 개인키를 로드하는 코드에서 외부 라이브러리(Bouncy Castle)를 사용하여 PEM파일을 읽어오도록 코드를 변경하였다 
🧰 직접 구현하였으나 =을 _로 변경하는 등 요구사항이 많아 CloudFrontUtilities (getCookiesForCustomPolicy) 를 사용하기로 했다
 

코드 예시는 다음과 같다

 
API 래퍼런스 : CloudFrontUtilites
https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/cloudfront/CloudFrontUtilities.html#getCookiesForCustomPolicy(java.util.function.Consumer)

 

CloudFrontUtilities (AWS SDK for Java - 2.30.16)

AWS SDK for Java API Reference - 2.30.16

sdk.amazonaws.com

 
⚠️이랬음에도 Postman으로 요청 보냈을 때 Access Denied 결과가 나왔다 
 

가설2. CloudFront-Policy, CloudFront-Signature, CloudFront-Key-Pair-Id 쿠키가 CloudFront로 이미지 요청을 보낼 때 같이 보내지지 않을 것이다.

 
현재 사용자가 로그인을 하면, SignedCookie 가 발급되어 Cookie에 저장된다
⚠️ 클라이언트가 CloudFront로 이미지 요청을 보낼 때 이를 같이 보내야 하는데 안 보내고 있는 것을 확인하였다 
 
1) 사용자가 로그인 한 후에 set-cookie가 되는지 확인하였다 
set-cookie가 안되고 있음을 발견하였고, Cookie 정책에 대해 공부했다 
 
아래 개념 글 참고)
https://eundms.tistory.com/entry/CORS-%EC%BF%A0%ED%82%A4-%EC%84%A4%EC%A0%95-SameSite-%EC%A0%95%EC%B1%85-Path%EC%99%80-Domain

 

쿠키, CORS, Referer, CSP 정책 : SameSite, Path, Domain

본문 제목 쿠키, CORS, Referer, CSP 정책 : SameSite, Path, Domain by :부셔져버린개발자 2025. 2. 11. 17:12 in 보호글

eundms.tistory.com

 
🧰 그리고, 아래와 같이 SameSite 설정을 추가하였다 

String cookieWithSecurity = cookie + "; SameSite=None; Secure; HttpOnly; Path=/";

 
 
✅그결과 로컬 환경에서 set-cookie 가 되는 것을 확인하였다
 
⚠️이제 해당 쿠키를 CloudFront 요청을 보낼 때 보내는지 확인해봤더니 안보내지고 있었다
 
 
🧰  next/image를 사용하고 있었기 때문에 custom-loader.js 를 추가하고
CloudFront 도메인으로 들어오는 요청을 Next.js의 API 엔드포인트로 프록시하여 전달하였다.
그 후, Next.js의 API 엔드포인트에서는 필요한 쿠키를 명시적으로 설정하여 이미지를 CloudFront로 요청하였다.
 
✅ 그렇게 로컬 환경에서는 적용이 됨을 확인할 수 있었다 
 
 
⚠️ 하지만, 배포 후 확인해보니 set-cookie가 안되고 있음을 확인할 수 있었다 
 
Domain 속성을 적지 않으면 자동으로 set-cookie를 진행한 도메인으로 설정이 되는 것 같았다 

https://developer.mozilla.org/en-US/docs/Web/Security/Types_of_attacks#session_fixation

 

Types of attacks - Security on the web | MDN

This article describes various types of security attacks and techniques to mitigate them.

developer.mozilla.org


 
로컬에서는 서버랑 클라이언트의 도메인이 모두 localhost이므로 괜찮지만, 
배포 환경에서는 서버(api.도메인), 클라이언트(도메인) 이므로 쿠키를 사용할 수가 없었다 
 
🧰   따라서, 쿠키 Domain을 .도메인으로 설정하였다 

String cookieWithSecurity = cookie + "; SameSite=None; Secure; HttpOnly; Domain=.도메인; Path=/";


✅ 로컬, 배포 환경에서 모두 확인이 되었다 
 
 

험난한 과정이었다




 
 
 


 
AWS 문제 해결 팁 : CloudFront의 서명된 URL 또는 서명된 쿠키와 관련된 문제를 해결하려면 어떻게 해야 하나요?
https://repost.aws/ko/knowledge-center/cloudfront-troubleshoot-signed-url-cookies

 

CloudFront의 서명된 URL 또는 쿠키 문제 해결

Amazon CloudFront와 서명된 URL 또는 서명된 쿠키를 사용하여 프라이빗 콘텐츠를 보호하고 있습니다. 403 액세스 거부 오류가 발생합니다.

repost.aws

 
 
 

728x90

관련글 더보기