테마 컴포넌트가 about.json에서 에셋을 선언하면, Discourse는 이를 /uploads/ 경로 아래에 저장하고 제공합니다.
사이트 설정인 **“익명 사용자의 파일 다운로드 방지”**가 활성화되어 있으면, 이러한 테마 에셋은 보호된 업로드 파일로 취급되어 익명 사용자에게 404를 반환합니다.
이로 인해 자체 JavaScript를 동적으로 로드하는 테마나 컴포넌트(예: Topic List Previews 컴포넌트)가 작동하지 않을 수 있습니다.
재현 단계
- Topic List Previews 컴포넌트를 설치합니다 (
https://github.com/merefield/discourse-tc-topic-list-previews). - 로그인한 사용자와 익명 사용자 모두에게 올바르게 로드되는지 확인합니다.
- 사이트 설정인 익명 사용자의 파일 다운로드 방지를 활성화합니다.
- 로그아웃된 상태로 포럼 홈 페이지를 방문하고 브라우저 콘솔을 확인합니다.
관찰된 동작
-
다음과 같은 파일에 대한 요청
/uploads/default/original/1X/d8ce366bd7aad8f9fc7b26b08aecc855dd6d425c.js은 404 Not Found(실제로는 HTML 오류 페이지)를 반환합니다.
-
브라우저 콘솔에 다음 내용이 표시됩니다:
Refused to execute script ... because its MIME type ('text/html') is not executable -
해당 파일에 의존하는 컴포넌트(예: Topic List Previews의
preview-edits.gjs)가 실행되지 않아 레이아웃 문제가 발생합니다.
기대되는 동작
about.json에서 정의된 테마 에셋은 “익명 사용자의 파일 다운로드 방지” 설정과 무관하게 항상 공개 접근 가능해야 합니다.
이것들은 사용자 업로드가 아닌 정적 에셋이므로 업로드 수준의 접근 제한을 상속받아서는 안 됩니다.
기술적 세부 사항
-
Discourse 버전: 3.6.0.beta2 (최신)
-
컴포넌트: Topic List Previews
-
관련
about.json조각:"assets": { "imagesloaded": "assets/imagesloaded.js" } -
테마 설치过程中, Discourse는 이 파일을
/uploads/default/original/...아래에Upload로 저장합니다. -
익명 제한을 활성화하면 Discourse가 해당 경로가 테마 에셋임에도 불구하고 요청을 차단합니다.
제안된 해결책
about.json을 통해 업로드된 테마 에셋은 다음과 같이 처리되어야 합니다:
- 전용 경로(예:
/theme-assets/또는/assets/)에서 제공되는 것
또는 - “익명 사용자의 파일 다운로드 방지” 제한에서 예외로 처리되는 것.
영향
이 문제는 클라이언트에서 동적으로 로드되는 테마 에셋(JS/CSS/이미지)에 의존하는 모든 테마나 컴포넌트에 영향을 미칩니다.
익명 다운로드 제한이 켜져 있을 때 익명 방문자를 위한 주요 UI 컴포넌트가 깨집니다.