js 첨부 파일을 다운로드할 수 없습니다

저는 이 질문과 정확히 동일한 오류를 겪고 있습니다. 즉, 설정에서 허용한 후 js 파일을 업로드할 수는 있지만, 다운로드를 시도하면 브라우저의 URL이 js 파일 URL로 바뀌고 "The change you wanted was rejected."라는 메시지가 표시됩니다.

환경:
Nginx 뒤에 실행 중인 Discourse Docker (Nginx가 SSL 사용)

Discourse 컨테이너 로그:

    Started GET "p5ePkm5OoKveknnMjyArlS4PPwS.js" for 192.168.32.1 at 2021-02-22 05:48:52 +0000
    Processing by UploadsController#show_short as JS
      Parameters: {"base62"=>"p5ePkm5OoKveknnMjyArlS4PPwS", "extension"=>"js"}
    Sent file afcdf626f9db8d54a1fb5e8ebcab0ea214d9226a.js (2.2ms)
    Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.
    Completed 422 Unprocessable Entity in 59ms (ActiveRecord: 0.0ms | Allocations: 17414)
    ActionController::InvalidCrossOriginRequest (Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.)
    /opt/bitnami/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.3.1/lib/action_controller/metal/request_forgery_protection.rb:266:in `verify_same_origin_request'

Nginx 로그:

    10.164.0.103 - - [22/Feb/2021:05:51:11 +0000] "GET /uploads/short-url/p5ePkm5OoKveknnMjyArlS4PPwS.js HTTP/2.0" 422 781 "getting-started-with-sftp-module/292" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36"
``

도움이나 조언을 부탁드립니다!
2개의 좋아요

사용자가 게시글에 *.js 파일을 첨부할 수 있도록 허용하고 계신가요? 사용자의 JavaScript 파일 첨부에 정당한 필요가 있으신가요? 더 이상 진행하기 전에 반드시 확인하고 싶습니다.

1개의 좋아요

빠른 답변 감사합니다!
네, 코딩 관련 Q&A 토론이므로 *.js 코드 파일을 첨부하는 것은 정당한 사용 사례입니다.

2개의 좋아요

안녕하세요! 저도 같은 문제를 겪고 있습니다. .js 확장자 파일 업로드는 허용해 두었는데, 아무도 다운로드를 할 수 없습니다. 이 문제를 해결할 설정을 아직 찾지 못했습니다. 도와주실 분 있으신가요?

1개의 좋아요

사용 사례를 설명해 주시겠어요? 왜 이것이 필요한가요?

제프, 안녕하세요.

지금 우리는 코드를 게시물의 텍스트 섹션에 복사하여 붙여넣고 있습니다.
사용 사례: 반복적으로 발생하는 문제의 해결책이나 키스터리터(Kickstarter) 코드가 담긴 .js 파일을 가지고 있으며, 이를 첨부파일로 공유하여 사용자가 다운로드한 후 자신의 프로젝트에서 바로 사용하게 하고 싶습니다.

그러나 파일 확장자를 .js에서 .txt로 변경하면 다시 "원하시는 변경이 거부되었습니다."라는 오류가 발생합니다. (이는 백엔드의 저장 최적화 기능 때문일 수 있으며, 파일 내용이 이전 파일과 동일하면 새 첨부파일이 이전에 업로드된 파일을 가리키도록 하는 것입니다.)
그래서 .txt 확장자의 js 파일 내용을 조금 수정하고 다시 업로드했는데, 첨부파일로 다운로드하는 데 성공했습니다.

@codinghorror .js 파일 다운로드를 허용하는 데 보안 위험이 있을까요?

1개의 좋아요

네; 파일이 항상 디스크에 다운로드되고 절대 실행되지 않도록 확인하기 위해 몇 가지 브라우저 조사가 필요합니다.

1개의 좋아요

fluiggers.com.br에 개발자 포럼이 있으니 한번 살펴보세요… .js 파일을 자주 공유하고 있습니다.

1개의 좋아요

물론 JS 파일을 허용하는 것에는 많은 보안 문제가 따르기 때문에, 우리는 극도로 신중하게 다뤄야 합니다.

Content-Disposition 헤더는 다운로드된 JS 파일의 실행을 방지하며, 우리는 이를 올바르게 설정하고 있습니다:

attachment; filename="test.js"; filename*=UTF-8''test.js

S3 업로드에서는 작동하며 로컬 업로드에서도 작동해야 하지만, Rails에서 새로운(혹은 비교적 새로운) 보안 조치가 있는 것 같습니다:

ActionController::InvalidCrossOriginRequest (보안 경고: 다른 사이트의 임베디드 태그가 보호된 JavaScript를 요청했습니다. 무엇을 하는지 정확히 알고 있다면, 이 액션에서 위조 보호를 비활성화하여 크로스 오리진 JavaScript 임베딩을 허용할 수 있습니다.)

수정 가능할 것 같습니다…

3개의 좋아요

저도 같은 문제에 부딪혔습니다. 코딩 Q&A 포럼을 운영 중인데, 큰 JS 파일을 다운로드할 수 있도록 공유할 수 있어야 합니다.

저희 커뮤니티에서도 동일한 문제가 발생합니다. 사람들이 JS 파일을 공유하고 싶어 하지만, 다운로드를 시도하면 다음과 같은 오류가 표시됩니다:

Rails 프로덕션 로그 발췌:

Started GET "/uploads/short-url/qDlrltMxEIJ2aYYdt8lZ200E3wA.js" for 94.31.111.247 at 2025-07-09 05:53:30 +0000
Processing by UploadsController#show_short as JS
  Parameters: {"base62"=>"qDlrltMxEIJ2aYYdt8lZ200E3wA", "extension"=>"js"}
Sent file /var/www/discourse/public/uploads/default/original/1X/baab1fc131be960b601467333f5a690b257daeb0.js (0.3ms)
Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.
Completed 422 Unprocessable Entity in 17ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

JS 파일은 허용된 업로드 확장자 목록에 포함되어 있습니다:

저희도 같은 문제가 있습니다. 저희 소프트웨어에서 실행되는 js 파일들이 있는데, 브라우저에서 어떤 동작을 할 수 있는 파일들은 아닙니다.

모든 업로드 파일을 S3 버킷으로 이동하고 s3_use_cdn_url_for_all_uploads를 true로 설정함으로써 Discourse 다운로드 문제를 해결했습니다. 이는 js 파일의 치명적인 장애 요인으로 보이는 short-url 컨트롤러를 우회하는 효과가 있습니다.

상세 내용(AI가 안내해 준 내용을 바탕으로 정리):n

  1. S3 호환 스토리지 설정 (예: Cloudflare R2)

Discourse는 로컬 디스크에서 .js 파일을 안전하게 서빙할 수 없습니다. 파일을 버킷으로 이동해야 합니다.

  • 버킷: 비공개 버킷(예: my-discourse-bucket)을 생성합니다.

  • API 키: 액세스 키(Access Key)와 시크릿 키(Secret Key)를 생성합니다.

2. 커스텀 CDN 도메인 구성

Cloudflare(또는 해당 프로바이더)에서 버킷에 커스텀 도메인(예: cdn.example.com)을 연결합니다. 이를 통해 파일이 직접적인 URL을 통해 정적 자산으로 서빙되어 Discourse의 '보안 가드’를 우회하게 됩니다.

3. Discourse 설정 업데이트

관리자 → 설정에서 S3 세부 정보를 구성합니다. 중요하게는, 임시 헤더로 인해 깨질 수 있는 URL에 '서명’을 시도하지 않도록 하기 위해 다음 항목을 활성화해야 합니다:

  • s3_use_cdn_url_for_all_uploads: 이 상자를 선택하세요 (가장 중요한 단계입니다).

  • s3_cdn_url: https://cdn.example.com으로 설정합니다.

  • s3_region: R2 호환성을 위해 us-east-1을 사용합니다.

4. 기존 업로드 마이그레이션 (선택 사항)

참고: 저희는 알 수 없는 이유로 이 단계가 작동하지 않았습니다.

기존 게시물에 있는 오래된 링크를 수정하려면 컨테이너에 진입하여 다음을 실행하세요:

Bash

# /var/discourse 내부에서
./launcher enter app
rake uploads:migrate_to_s3
rake posts:rebake

이 정보가 누군가에게 도움이 되길 바랍니다.