자 어디가 문제인지 확인해보자
가설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
[쀼] Notification에 동시에 두 번 저장 요청 되는 문제 : Unique 제약 조건 지키지 않는다는 예외 발생 원인을 파악해보자 (0) | 2025.03.17 |
---|---|
[쀼] 백엔드 서버, 데이터베이스 서버 분리 (MySQL 직접 운영) (4) | 2025.02.21 |
[쀼] S3에 업로드한 사진 : 이미지 핫링크 방지 과정 (2) (1) | 2025.02.10 |
[쀼] S3에 업로드한 사진 : S3 퍼블릭 엑세스 차단 활성화(1) (1) | 2025.01.12 |
[쀼] 카카오맵 API 사용하기 (0) | 2025.01.08 |