Programming-[Infra]/Cloud-AWS

[탐험]S3 Content-Disposition으로 파일 다운로드 이름 변경, CloudFront 캐시 무효화

컴퓨터 탐험가 찰리 2023. 10. 5. 16:14
728x90
반응형

1. 결론

 

  • s3는 Content-Disposition값에 따라 다운로드하는 파일의 이름을 변경할 수 있다. 다만 S3 자체에서 다운로드 할때는 AWS에서 해당 header값을 override해서 안된다. URL을 거쳐서 진행할때만 가능하다.
  • CloudFront를 사용하는 경우 요청의 X-Cache 값을 살펴보자. S3와 즉각적으로 동기화가 안된다면 캐싱 때문일 수도 있고, 이때는 무효화를 적극적으로 고려해보자.
  • 상기 내용 때문에, CloudFront로 연결된 S3의 Content-Disposition 값을 그대로 프론트에서 활용하는 것은 실시간성을 확보할 수 없다. 실시간으로 변경 및 표시가 필요하다면 따로 DB 등에 저장해놓고 해당 값을 프론트에서 조회해야한다.

 

2. 문제상황

 

S3에 업로드된 파일을 사내 프로젝트에서 (프론트엔드를 통해) 다운로드하는데 Content-Disposition에서 정의한 이름대로 다운로드 되지가 않았다.

 

S3에서 다운로드 대상 객체의 key값은 아래와 같이 UUID 값으로 지정하였다.(S3 내에서 객체들끼리 key값이 중복되지 않도록 UUID로 저장하는게 일반적임)

하지만 다운로드 시에는 다른 이름으로 저장될 수 있도록 해당 객체의 메타데이터 중 Content-Disposition 값을 변경해주었다. 참고로 보통 filename= {지정할 파일이름.확장자} 로 입력하는데, 한글의 경우 URL 형태로 인코딩하기 위해서는 filename*=UTF-8"{파일명}의 형태로 입력해주어야한다.

 

그런데 프로젝트에서 다운로드를 실행하여 S3에 요청을 보내면 Content-Disposition에 정의된 URL encoded 이름대로 다운로드가 된다. 여기서 문제는, 테스트를 위해 위 사진처럼 메타데이터상 Content-Disposition 값을 변경했는데도(1111) 새로 요청을 해도 아래 사진의 Response Headers의 Content-Disposition 값이 변경되지 않는다는 것이였다.(1.%20FutureArea_...)

 

참고로 S3상 다운로드 자체를 할때를 말하는 것이 아니다. 이 때는 AWS에서 강제로 headerOverrides를해서 Content-Disposition에 "attachment"값만 남도록 만들어버린다.

 

3. 문제 원인

Content-Disposition이 변경되지 않는 원인은 CloudFront의 캐시 때문이였다! 위로 두번째 사진에서 X-Cache 헤더의 값이 hit from cloudfront라고 되어있는데, 이는 S3에 연결된 CloudFront에 의해서 오리진 위치(내가 CloudFront를 최초로 생성한 리전)에 업로드된 파일을 엣지 로케이션(오리진 외 다른 위치)에 캐싱해놓기 때문이다.

 

캐싱된 파일은 CloudFront의 정책 부분에서 TTL(Time To Live) 값에 따라 유지된다. CloudFront/정책/캐시/CachingOptimized에 들어가보면 최소, 최대, 기본 TTL이 설정된 것을 확인할 수 있다. 나의 경우 기본값이 86400(초)로 24시간으로 되어있었다!

 

정책을 바꾸는건 큰일이라, 캐시 무효화를 DevOps분께 허락받고 시도해봤다. 무효화는 CloudFront/특정 배포/무효화 탭 에 들어가서 무효화 생성을 해보면 된다.

돈이 들긴하는데, 아래처럼 매달 1000개 경로까진 무료이고 그 이후라도 0.005 달러밖에 안하니 크게 문제될 건 없다.(게다가 테스트 서버용 S3였다.)

 

무효화 경로는 다음과 같이 구체적으로 지정해야한다. 구체적으로 지정해야 특정 파일에 대한 캐시만 무효화하고, 혹시 모를 리스크를 줄일 수 있다.

 

/specific/directory/where/my/file/exists/*.jpeg

 

처음엔 잘 몰라서 위 경로 앞에 cloudfront에 연결된 S3 버킷 이름까지 적었는데, 그러면 정상적으로 작동하지 않는다. 또한 wildcard(*)는 모든 파일, .jpeg는 모든 파일 중 .jpeg 확장자 파일에 대해서만 캐시 무효화를 적용한다는 의미로 작용한다.

 

캐시 무효화 이후 다시 요청을 해보니, Content-Disposition 값이 S3에서 변경한 이름대로 바뀌었다. X-Cache값도 Miss From cloudfront로 바뀐 것을 확인할 수 있었다. 그리고 다운로드하는 파일의 이름도 설정한대로 1111로 변경되었다!

 

 

728x90
반응형