# 외부 링크에서 다운로드를 금지할 수 있나요?

**URL:** https://meta.discourse.org/t/can-i-forbid-download-from-external-links/206229
**Category:** Feature
**Created:** [10월 16, 2021, 2:39오후 UTC](https://meta.discourse.org/t/can-i-forbid-download-from-external-links/206229 "2021-10-16T14:39:56Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![Jian\_Jiao](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jian_jiao/32/232323_2.png) [@Jian\_Jiao](https://meta.discourse.org/u/Jian_Jiao)
#### Post date: [10월 16, 2021, 2:39오후 UTC](https://meta.discourse.org/t/can-i-forbid-download-from-external-links/206229/1 "2021-10-16T14:39:56Z")

</div>

안녕하세요,

검색을 해 보았지만 이 주제에 대한 게시물을 찾을 수 없었습니다.

외부 링크를 통한 다운로드를 비활성화하고 싶습니다. 즉, 다운로드 권한을 등록된 사용자로 제한하려는 것이 아니라, 제 Discourse 사이트의 리소스는 누구나 다운로드할 수 있도록 하되, 최소한 사이트를 방문하여 해당 주제(토픽)를 확인한 후에만 다운로드할 수 있도록 하고 싶습니다.

현재 Discourse에 업로드된 파일이 있으면, 누군가 그 파일 링크를 다른 곳에 게시하면 사람들이 제 사이트에서 온 것인지도 모른 채 다운로드할 수 있습니다. 이 문제를 해결할 방법이 있을까요?

감사합니다.  
Jian

---

<div class="post-metadata">

### Author: ![MarcP](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/marcp/32/160184_2.png) [@MarcP](https://meta.discourse.org/u/MarcP)
#### Post date: [10월 16, 2021, 4:35오후 UTC](https://meta.discourse.org/t/can-i-forbid-download-from-external-links/206229/2 "2021-10-16T16:35:30Z")

</div>

아마 이 정보가 도움이 될지도 모르겠네요.

> [@게스트가 이미지 보는 것 방지](https://meta.discourse.org/t/prevent-guests-from-watching-images/159027/2?u=marcp):
>
> Check out the prevent anons from downloading files and the secure media site setting, they may be what you want. Specifically the secure uploads site setting. Explainers on each site setting: prevent anons from downloading files: Prevent anonymous users from downloading attachments. WARNING: this will prevent any non-image site assets posted as attachments from working. secure media: Limits access to ALL uploads (images, video, audio, text, pdfs, zips, and others). If “login required” is ena…

---

<div class="post-metadata">

### Author: ![Jian\_Jiao](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jian_jiao/32/232323_2.png) [@Jian\_Jiao](https://meta.discourse.org/u/Jian_Jiao)
#### Post date: [10월 16, 2021, 10:21오후 UTC](https://meta.discourse.org/t/can-i-forbid-download-from-external-links/206229/3 "2021-10-16T22:21:53Z")

</div>

답변해 주셔서 감사합니다.

아니요, 이 경우는 다른 시나리오입니다. 로그인하지 않은 사용자의 다운로드를 제한하는 것이 아니라, 다른 웹사이트에서 해당 링크를 통해 로컬 리소스를 다운로드하는 것을 차단하는 것입니다. 제 사이트를 방문하는 사용자는 등록 여부와 관계없이 다운로드할 수 있도록 하려는 것이죠.

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [10월 17, 2021, 6:48오전 UTC](https://meta.discourse.org/t/can-i-forbid-download-from-external-links/206229/4 "2021-10-17T06:48:17Z")

</div>

이것들은 의미론적으로 동일한 것인가요?

미디어를 보호하거나 안 하는 것뿐입니다. 보호되지 않았다면, 여러분의 UI를 띄우지 않고도 누구나 링크를 사용할 수 있겠죠? 브라우저는 이전에 어떤 페이지를 방문했는지 신경 쓰지 않습니다.

리소스가 가치 있다면, 왜 보호하지 않고 해당 리소스가 링크된 주제에 링크를 배포하지 않나요? 이렇게 하면 여러분의 사이트에 가입할 추가적인 동기가 될 수 있습니다?

---

<div class="post-metadata">

### Author: ![Simon\_Manning](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon_manning/32/198596_2.png) [@Simon\_Manning](https://meta.discourse.org/u/Simon_Manning)
#### Post date: [10월 17, 2021, 1:20오후 UTC](https://meta.discourse.org/t/can-i-forbid-download-from-external-links/206229/5 "2021-10-17T13:20:05Z")

</div>

> [@merefield](#):
>
> 브라우저는 이전에 어떤 페이지를 방문했는지 신경 쓰지 않습니다.

브라우저는 신경 쓰지 않지만, 서버는 신경 쓸 수 있습니다. 기본적으로 브라우저가 참조 페이지와 동일한 오리진(origin)으로 요청을 보낼 때, 서버가 요청이 어디에서 왔는지 알릴 수 있도록 referrer 헤더를 포함합니다. 서버는 이 정보를 사용하여 동작을 조정할 수 있으며, 특정 위치로의 액세스를 허용하거나 거부하는 것도 포함됩니다.

우회하기는 쉽지만, 다른 웹사이트에서의 단순한 링크를 방지할 수 있습니다.

```plaintext
location /uploads/ {
    valid_referers www.example.com;
    if ($invalid_referer) {
        return 403;
    }
}

```

위 코드에서 `www.example.com`을 Discourse 인스턴스의 도메인으로 대체하면, 인스턴스의 업로드에 대한 핫링크(hotlinking)를 방지하는 적절한 nginx 구성이 됩니다.

403(허용되지 않음) 반환 대신 다른 동작을 취하고 싶을 수도 있습니다. 예를 들어 Discourse 홈 페이지로 리다이렉트하는 것 등이 있습니다. 이렇게 하려면 대신 다음 코드를 사용할 수 있습니다.

```plaintext
location /uploads/ {
    valid_referers www.example.com;
    if ($invalid_referer) {
        return 307 /;
    }
}

```

재빌드(rebuild) 시 구성을 주입하기 위해 app.yml 파일에 무언가를 추가하는 것이 가능해야 합니다. 다만 이 부분은 제가 자세히 살펴본 적이 없어 어떻게 해야 하는지 정확히 알지 못합니다.

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [10월 17, 2021, 1:34오후 UTC](https://meta.discourse.org/t/can-i-forbid-download-from-external-links/206229/6 "2021-10-17T13:34:17Z")

</div>

> [@Simon\_Manning](#):
>
> 우회하기는 쉽지만, 다른 웹사이트에서의 무분별한 링크를 방지합니다.

그리고 그게 아마도 충분히 좋은 방법일까요? 시몬, 잘하셨네요. 훌륭합니다.

홈페이지로 리다이렉트하는 규칙을 추가하면 더 나을 것 같네요.

---

<div class="post-metadata">

### Author: ![Simon\_Manning](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon_manning/32/198596_2.png) [@Simon\_Manning](https://meta.discourse.org/u/Simon_Manning)
#### Post date: [10월 17, 2021, 7:48오후 UTC](https://meta.discourse.org/t/can-i-forbid-download-from-external-links/206229/7 "2021-10-17T19:48:15Z")

</div>

감사합니다. 리다이렉트에 대한 단락은 이미 작성해 두었는데, 이전 게시글을 수정해서 완전한 예시를 들어 더 명확하게 설명했습니다.

---

<div class="post-metadata">

### Author: ![Jian\_Jiao](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jian_jiao/32/232323_2.png) [@Jian\_Jiao](https://meta.discourse.org/u/Jian_Jiao)
#### Post date: [10월 17, 2021, 11:29오후 UTC](https://meta.discourse.org/t/can-i-forbid-download-from-external-links/206229/8 "2021-10-17T23:29:00Z")

</div>

공유해 주셔서 감사합니다, Simon. 제 요구사항에 대한 해결책이 될 수 있을 것 같은데, 아직 Discourse에 어떻게 적용해야 할지 모르겠습니다. 리눅스 서버와 Apache에 대해서는 조금 알고 있지만, Discourse는 Docker와 Nginx를 모두 사용하는데, 이 둘은 제 지식 범위 밖에 있습니다. 하지만 어쨌든 Simon이 방향을 제시해 주셨으니, 제가 할 수 있는 일이 있는지 살펴볼 계획입니다.

---

<div class="post-metadata">

### Author: ![Simon\_Manning](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon_manning/32/198596_2.png) [@Simon\_Manning](https://meta.discourse.org/u/Simon_Manning)
#### Post date: [10월 18, 2021, 1:56오후 UTC](https://meta.discourse.org/t/can-i-forbid-download-from-external-links/206229/9 "2021-10-18T13:56:22Z")

</div>

Discourse가 nginx에 사용하는 설정에는 이미 핫링크(hotlinking) 관련 항목이 포함되어 있지만, 주석 처리되어 있는 상태입니다. 따라서 `app.yml` 파일에 몇 가지 replace 지시문을 추가하여 해당 줄들의 주석을 해제하면 됩니다.

편한 편집기로 `/var/discourse/containers/app.yml` 파일을 편집하세요. 파일 끝부분에 run 섹션이 있고, 그 안의 끝부분에 `echo "end of custom commands"`를 실행하는 exec 항목을 찾을 수 있습니다.

해당 exec 항목 앞에 다음 줄들을 추가하세요:

```plaintext
  - replace:
      filename: "/etc/nginx/conf.d/discourse.conf"
      from: "#valid_referers none blocked mysite.com *.mysite.com;"
      to: valid_referers none blocked mysite.com *.mysite.com;

  - replace:
      filename: "/etc/nginx/conf.d/discourse.conf"
      from: "#if ($invalid_referer) { return 403; }"
      to: if ($invalid_referer) { return 307 /; }

```

첫 번째 replace 섹션의 `to:` 줄에서 `mysite.com *.mysite.com`을 볼 수 있는데, 이 부분을 자신의 도메인 이름(예: `discourse.org *.discourse.org`)으로 대체하세요. 두 번째 replace는 방문자가 Discourse 홈 페이지로 리다이렉트되기를 원하는 경우를 가정하고 있습니다.

변경 사항을 저장한 후, 업데이트된 nginx 설정으로 Discourse를 다시 빌드하려면 다음 명령을 실행하세요.

```plaintext
cd /var/discourse
./launcher rebuild app

```
