아바타 프록시 및 CDN 핫링크 방지

제 Discourse 사이트는 이미지 비중이 높습니다. 이미지 수가 많기 때문에 이미지를 저장하고 서빙하기 위해 S3/CDN 조합을 사용하고 있습니다. CDN 내부에서는 이미지 하이재킹을 방지하기 위해 다양한 조치를 취하고 있습니다. 그 중 하나는 모든 직접 이미지 접근을 차단하고 정의된 호스트명 목록에서만 접근을 허용하는 것입니다.

이 설정은 아바타를 제외하고는 Discourse에서 정상적으로 작동합니다. 핫링크 보호가 켜지면 아바타가 작동하지 않게 됩니다.

그 이유는 Discourse가 아바타에 프록시 설정을 사용하기 때문입니다. HTML에서 아바타를 위해 프록시 링크를 사용합니다. 링크 구조는 https://discourse.forum/user_avatar/discourse.forums/username/24/616_2.png 형태입니다.
프록시가 해석되면 브라우저가 이미지 파일에 대한 직접 접근을 요청합니다.

제 CDN은 이러한 직접 요청 시 403 오류를 반환하여 직접 접근을 차단합니다. 그 결과 모든 사용자 지정 아바타가 실루엣으로 표시됩니다.

프록시를 제거할 수 있는 옵션은 무엇인가요?
아바타를 표준 이미지 파일 구조로 변경할 수 있을까요?

Discourse IP 주소를 화이트리스트에 추가할 수 없나요?

직접 액세스 링크 호출은 사용자의 IP 주소에서 발생합니다. 서버는 정보를 해석하지만, 실제 호출은 로컬 브라우저에서 수행됩니다.

그렇게 작동하는지 확실하지 않습니다. 설정에 따라 실제로 프록시가 프록시 역할을 하거나 CDN이 먼저 처리될 수 있습니다. 이 설정이 어떻게 구성되어 있는지 좀 더 자세히 설명해 주시겠습니까?

모호한 질문은 정말 싫습니다. "이것"이라고 질문하실 때 무엇을 생각하고 계셨나요?

현재 제 설정은 다음과 같습니다:

Discourse 설정:

  • 표준 단일 컨테이너 설치
  • 서브도메인으로 설정: forums.domain.tld
  • 업로드를 위한 표준 S3 설정
  • 업로드 파일은 S3에 저장됨

S3 설정:

  • Digital Ocean S3 버킷
  • 외부 액세스가 활성화된 버킷
  • 기타 보안 계층 또는 권한 없음

CDN 설정:

  • bunny CDN
  • 허용된 리퍼러 설정: domain.tld 및 *.domain.tld
  • 아바타 액세스를 차단한 전환 스위치는 "직접 URL 파일 액세스 차단"이었습니다.

이 기능이 켜지면 모든 아바타에 403 오류가 발생합니다. 꺼지면 아바타가 정상적으로 표시됩니다.

아바타가 아닌 이미지:

  • Discourse 내 URL: https://cdn.domain.tld/optimized/3X/3/1/filename_#_size.jpeg

아바타 이미지:

  • Discourse 내 URL: https://forums.domain.tld/user_avatar/forums.domain.tld/mazzini/48/776_2.png

이전 게시물인 아바타는 어떻게 저장되고 액세스됩니까?에 따르면 Discourse는 아바타에 프록시를 사용한다고 합니다. 따라서 아바타의 URL 구조는 표준 이미지 URL 구조가 아닙니다.

제 시스템 내에서 아바타는 S3 또는 CDN에서 액세스 가능합니다. 이는 어딘가에서/어떤 방식으로든 아바타 URL이 CDN URL로 변환되고 있음을 의미합니다.

이것이 발생하면 CDN은 해당 URL을 직접 액세스 링크로 간주하여 403으로 액세스를 차단합니다.

마침내 "이것"에 대한 질문에 답을 드린 것 같습니다.

저도 제가 시간을 들여 도움을 주고 있는데 사람들이 그렇게 반응할 때 싫어하니까, 이건 무승부인 셈이죠 :wink:.

네, "프록시"란 요청이 Discourse를 통해 전달된다는 것을 의미합니다. 요청은 브라우저에서 CDN으로 직접 보내지는 것이 아니라 Discourse에서 보내집니다.

CDN을 전체 사이트 CDN으로 설정했나요, 아니면 S3 CDN으로 설정했나요? 후자일 것 같습니다. 그 경우 요청은 Discourse에서 CDN으로 보내지며, 리퍼러(referrer) 없이 전송됩니다. 하지만 요청이 Discourse IP에서 시작되기 때문에 CDN은 여전히 legitimate한 요청임을 인식할 수 있습니다. 그래서 화이트리스트에 추가할 것을 조언한 것입니다.

수정: 보호 기능을 잠시 꺼두고 Bunny의 로그를 확인하여 요청이 어떤 IP에서 오는지 살펴볼 수 있습니다.

도와주셔서 감사합니다. IT 개발과 지원 분야에서 수십 년간 일해온 경험상, 모호한 질문과 답변은 불필요한 업무를 더 많이 발생시킵니다. 경험에 비추어 보았을 때, 동의하실 것이라고 생각합니다.

CDN은 S3 버킷에만 설정되어 있습니다.

원본 주제를 게시하기 전에 403 오류와 관련된 Discourse IP에 대해 CDN 로그를 확인했습니다. 로그 파일에는 해당 정보가 없었습니다.

귀하의 코멘트를 바탕으로 다시 로그를 분석했습니다. 가장 많은 트래픽을 발생시킨 상위 IP 주소를 검토한 결과, 상위 2개는 호스팅 회사의 게이트웨이인 것으로 확인되었습니다.

문제는 Digital Ocean의 게이트웨이 IP 주소를 계속 추적하여 Discourse 서버가 이미지를 올바르게 표시하도록 하고 싶지 않다는 점입니다.

도와주셔서 감사합니다.