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

안녕하세요,

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

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

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

감사합니다.
Jian

2개의 좋아요

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

3개의 좋아요

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

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

1개의 좋아요

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

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

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

1개의 좋아요

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

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

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

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

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

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

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

4개의 좋아요

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

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

3개의 좋아요

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

1개의 좋아요

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

1개의 좋아요

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

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

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

  - 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를 다시 빌드하려면 다음 명령을 실행하세요.

cd /var/discourse
./launcher rebuild app
4개의 좋아요