# 비이미지 업로드 시 S3 CDN URL이 사용되지 않음

**URL:** https://meta.discourse.org/t/s3-cdn-url-not-being-used-on-non-image-uploads/175332
**Category:** Bug
**Created:** [1월 7, 2021, 1:24오전 UTC](https://meta.discourse.org/t/s3-cdn-url-not-being-used-on-non-image-uploads/175332 "2021-01-07T01:24:44Z")
**Posts on this page:** 11
**Page:** 1

<div class="post-metadata">

### Author: ![renato](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/renato/32/383632_2.png) [@renato](https://meta.discourse.org/u/renato)
#### Post date: [1월 7, 2021, 1:24오전 UTC](https://meta.discourse.org/t/s3-cdn-url-not-being-used-on-non-image-uploads/175332/1 "2021-01-07T01:24:44Z")

</div>

[게시물에 업로드할 때 S3 CDN URL이 무시되는 문제](https://meta.discourse.org/t/s3-cdn-url-ignored-when-uploading-into-posts/54898/18)와 관련이 있을 수 있습니다.

처음에는 어떤 설정을 놓친 줄 알았지만, 메타(meta)에서도 재현됩니다:  
`https://meta.discourse.org/uploads/short-url/dw1U4hctATusBlHsUmWQXeme66j.csv` ([여기](https://meta.discourse.org/t/database-performance-recommendations-by-azure-psql/141166)에 업로드됨)는  
`//cdck-file-uploads-global.s3.dualstack.us-west-2.amazonaws.com/meta/original/3X/5/e/5ebb2cfb8cc907e8e8f7c6559a72d2f4a8ba2f8f.csv`로 302 리다이렉트됩니다.

대신 `https://global.discourse-cdn.com/meta/original/3X/5/e/5ebb2cfb8cc907e8e8f7c6559a72d2f4a8ba2f8f.csv`로 리다이렉트되는 것이 맞지 않나요?

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [1월 7, 2021, 2:14오전 UTC](https://meta.discourse.org/t/s3-cdn-url-not-being-used-on-non-image-uploads/175332/2 "2021-01-07T02:14:00Z")

</div>

음, 여기 문제가 있을 수도 있겠네요. @martin, 확인해 주실 수 있나요? 가능하면 CDN으로 리다이렉트하는 게 좋을 것 같습니다.

---

<div class="post-metadata">

### Author: ![martin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/martin/32/491371_2.png) [@martin](https://meta.discourse.org/u/martin)
#### Post date: [3월 2, 2021, 1:55오전 UTC](https://meta.discourse.org/t/s3-cdn-url-not-being-used-on-non-image-uploads/175332/4 "2021-03-02T01:55:55Z")

</div>

조금 까다로운 문제입니다. 방금 확인해 보았는데, 기본적으로 "강제 다운로드(force download)"를 수행할 때는 항상 사전 서명된 URL(presigned URL)을 통해 S3에서 다운로드를 진행합니다. 첨부파일 링크를 클릭하거나 이미지에서 다운로드 버튼을 클릭할 때 이 강제 다운로드가 발생하게 됩니다. 이렇게 함으로써 적절한 content-disposition 헤더를 추가할 수 있습니다:

```plaintext
attachment; filename="#{upload.original_filename}"; filename*=UTF-8''#{upload.original_filename}

```

CDN URL이 이러한 방식으로 동작하도록 하는 것은 불가능하다고 생각합니다. 이미지의 경우 CDN URL은 인라인으로 표시할 때만 사용되며, 다운로드할 때는 사용되지 않습니다. 또한 개인 ACL을 가진 보안 이미지 및 첨부파일의 경우 사전 서명된 URL을 반드시 사용해야 합니다.

---

<div class="post-metadata">

### Author: ![elle](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/elle/32/119940_2.png) [@elle](https://meta.discourse.org/u/elle)
#### Post date: [1월 13, 2022, 11:46오전 UTC](https://meta.discourse.org/t/s3-cdn-url-not-being-used-on-non-image-uploads/175332/5 "2022-01-13T11:46:51Z")

</div>

@martin 첨부 파일 링크에 대해, 항상 "강제 다운로드"로 설정하는 방법을 모르겠습니다. 현재 이미지 외의 파일을 업로드하면, 생성된 렌더링된 URL은 `?dl=1` 파라미터가 없는 짧은 URL입니다. 이 URL은 해당 업로드의 `url` 속성 값으로 해석되는데, 이는 presigned\_url이 아니며, 또한 URL이 s3 cdn\_url이 아니라 특정 s3 프로바이더에서만 작동할 수 있는 구성 URL이기 때문에 저희 환경에서는 실패합니다.

첨부 파일을 항상 강제 다운로드하도록 하는 방법이 있는지, 아니면 현재 동작이 실제로 버그인지 알려 주실 수 있을까요?

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [1월 14, 2022, 3:47오전 UTC](https://meta.discourse.org/t/s3-cdn-url-not-being-used-on-non-image-uploads/175332/6 "2022-01-14T03:47:53Z")

</div>

> [@elle](#):
>
> 특정 S3 프로바이더에서만 작동할 수 있습니다

여기서 좀 더 자세히 설명해 주시겠어요? 아마존 S3를 사용 중이신가요, 아니면 다른 프로바이더를 사용 중이신가요? 그렇다면 어떤 프로바이더인가요?

---

<div class="post-metadata">

### Author: ![elle](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/elle/32/119940_2.png) [@elle](https://meta.discourse.org/u/elle)
#### Post date: [1월 14, 2022, 8:36오전 UTC](https://meta.discourse.org/t/s3-cdn-url-not-being-used-on-non-image-uploads/175332/7 "2022-01-14T08:36:21Z")

</div>

네, 제가 _지원되지 않는_ S3 프로바이더([OVH Object Storage](https://www.ovhcloud.com/en/public-cloud/object-storage/))를 사용하고 있는 것 같습니다.

엔드포인트 URL은 `https://s3.de.ovh.cloud.net`이며, s3 cdn\_url은 `https://storage.de.ovh.cloud.net/v1/<some-unique-user-id>/<the-bucket-name>`으로 설정되어 있습니다.

단축 URL이 해석될 때 discourse는 결과 URL을 구성하기 위해 엔드포인트 URL을 사용하지만, 이는 올바른 OVH 사용자 ID(s3 cdn\_url에 포함된 부분)를 포함하지 않아 실패합니다.

반면, 단축 URL에 `dl=1`을 강제하면 작동하는 presigned\_url이 구성되므로 저에게는 문제가 되지 않습니다.

컨테이너 yaml 내에서 이(s3 관련) 환경 변수들을 설정했습니다:

```plaintext
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: DE
DISCOURSE_S3_ENDPOINT: https://s3.de.cloud.ovh.net
DISCOURSE_S3_ACCESS_KEY_ID: ...
DISCOURSE_S3_SECRET_ACCESS_KEY: ...
DISCOURSE_S3_CDN_URL: https://storage.de.ovh.cloud.net/v1/<some-unique-user-id>/<the-bucket-name>
DISCOURSE_S3_UPLOAD_BUCKET: <the-bucket-name>
DISCOURSE_S3_INSTALL_CORS_RULE: false

```

---

<div class="post-metadata">

### Author: ![elle](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/elle/32/119940_2.png) [@elle](https://meta.discourse.org/u/elle)
#### Post date: [1월 18, 2022, 7:07오후 UTC](https://meta.discourse.org/t/s3-cdn-url-not-being-used-on-non-image-uploads/175332/8 "2022-01-18T19:07:28Z")

</div>

이 주제에서는 벗어나는 내용일 수 있지만, 현재 동작이 의도된 것이라면 프론트엔드에서 짧은 URL 렌더링(short-url-rendering)을 어떻게 또는 어디서 오버라이드할 수 있을까요? 게시물의 조리(cooking) 과정에 훅을 걸고 첨부 파일의 짧은 URL에 쿼리 매개변수를 추가하는 방식을 고려하고 있습니다. 디스코urs(Discourse)용 JS 플러그인을 작성하는 방법은 알고 있지만, 대부분의 경우 어떤 위젯(Widget)을 다시 열어야 하거나 어떤 함수를 오버라이드해야 하는지 찾는 데 어려움을 겪고 있습니다.

---

<div class="post-metadata">

### Author: ![elle](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/elle/32/119940_2.png) [@elle](https://meta.discourse.org/u/elle)
#### Post date: [1월 23, 2022, 4:12오후 UTC](https://meta.discourse.org/t/s3-cdn-url-not-being-used-on-non-image-uploads/175332/9 "2022-01-23T16:12:23Z")

</div>

좋아요, [첨부 파일용 마크다운이 생성되는 위치](https://github.com/discourse/discourse/blob/v2.8.0.beta11/app/assets/javascripts/discourse/app/lib/uploads.js#L269)를 찾았습니다. 제 이해로는 플러그인 API를 통해 이를 (쉽게) 오버라이드할 수 없으며(실제로 그렇게 하지 않는 것이 옳다고 생각합니다) 그렇게 생각됩니다.

따라서 해당 URL에 `?dl=1` 매개변수를 추가하려는 제 초기 생각은 잘못된 접근인 것 같습니다.

해결된 짧은 URL에 대해 다운로드를 강제하지 않는 문제에 관해: [S3 버킷의 공개 ACL에 대한 반대 논거](https://meta.discourse.org/t/s3-cdn-url-ignored-when-uploading-into-posts/54898/4?u=elle)를 올바르게 이해했다면, 다음 중 하나를 선택해야 합니다:

1. CDN을 통해 S3에서 파일을 서빙한다 (@martin이 지적했듯이 첨부 파일의 경우 이 경우 다운로드 시 파일명을 올바르게 설정할 수 없으므로 실현 불가능합니다)
2. S3 객체에 대해 사전 서명된 URL(presigned url)을 생성한다

하지만 현재 동작은 이 두 가지 중 어느 것도 수행하지 않고 S3 버킷에 공개 ACL이 설정되어 있다고 가정합니다. 이는 지원되는 S3 제공업체(아마존 포함)의 경우에도 마찬가지인 것 같습니다. 그렇다면 S3 스토어에 대한 짧은 URL을 해석할 때 `Discourse.store.url_for`의 [force\_download 옵션을 기본적으로 true로 설정](https://github.com/discourse/discourse/blob/v2.8.0.beta11/app/controllers/uploads_controller.rb#L121)하는 것이 왜 아닌가 질문하고 싶습니다.

---

<div class="post-metadata">

### Author: ![lucheng](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/lucheng/32/196320_2.png) [@lucheng](https://meta.discourse.org/u/lucheng)
#### Post date: [2월 25, 2022, 2:39오전 UTC](https://meta.discourse.org/t/s3-cdn-url-not-being-used-on-non-image-uploads/175332/11 "2022-02-25T02:39:38Z")

</div>

저도 같은 문제를 겪고 있습니다. 제가 기대하는 것은 uploads/short-url 뒤에 있는 파일이 S3 CDN URL을 통해 다운로드되거나 해당 URL로 리다이렉트되어야 한다는 것입니다.

---

<div class="post-metadata">

### Author: ![aosus](https://avatars.discourse-cdn.com/v4/letter/a/ed8c4c/32.png) [@aosus](https://meta.discourse.org/u/aosus)
#### Post date: [6월 3, 2023, 5:36오후 UTC](https://meta.discourse.org/t/s3-cdn-url-not-being-used-on-non-image-uploads/175332/12 "2023-06-03T17:36:37Z")

</div>

Cloudflare R2에서도 동일한 문제를 겪고 있습니다. 프리사인드 URL 없이 직접 S3 URL을 사용하는 것이 허용되지 않는 것 같기 때문입니다. 또한 R2는 버킷에 대한 ACL을 지원하지 않습니다.

---

<div class="post-metadata">

### Author: ![aosus](https://avatars.discourse-cdn.com/v4/letter/a/ed8c4c/32.png) [@aosus](https://meta.discourse.org/u/aosus)
#### Post date: [9월 17, 2023, 9:06오전 UTC](https://meta.discourse.org/t/s3-cdn-url-not-being-used-on-non-image-uploads/175332/13 "2023-09-17T09:06:47Z")

</div>

Discourse가 최근 "모든 업로드에 S3 CDN URL 사용"이라는 기능을 추가하여 이 문제를 해결한 것으로 보입니다.
