새로운 ‘strict-dynamic’ CSP를 실험하고 있습니다. 이를 통해 테마, 플러그인 및 외부 스크립트를 Discourse에 안전하게 통합하는 것이 훨씬 쉬워질 것으로 기대됩니다.
‘content security policy strict dynamic’ 사이트 설정을 활성화하여 새로운 모드를 사용해 볼 수 있습니다. 피드백이 있으시면 알려주세요!
가까운 미래에 이것이 기본값이 되기를 희망하며, 그 목표에 가까워질 때 #announcements 주제를 게시할 예정입니다.
자세한 내용은 아래를 참조하세요:
배경
2018년에 Discourse에 기본 Content Security Policy를 도입했습니다. 당시 브라우저 지원 정책 때문에 ‘host-source’ 값(즉, 허용할 모든 스크립트의 URL 접두사를 나열하는 것)만 사용할 수 있었습니다.
2024년 현재에는 더 많은 옵션이 제공됩니다. 바로 'strict-dynamic' 키워드입니다. 이 키워드는 모든 스크립트 URL을 사전에 나열할 필요를 없앱니다. 대신, 초기에 신뢰되는 스크립트(‘hash’ 또는 ‘nonce’ 값을 통해)는 최소한의 제한으로 더 많은 스크립트를 로드할 수 있습니다.
이 새로운 모드를 어떻게 시도해 볼 수 있나요?
관리자 패널에서 ‘content security policy strict dynamic’ 설정을 활성화하세요.
설정이 보이지 않는다면 최신 버전의 Discourse를 실행 중인지 확인하세요. 이 새로운 기능은 2월 16일에 (3.3.0.beta1-dev 사이클 동안) 병합되었습니다.
저희 호스팅을 사용 중이시며 업데이트를 앞당기고 싶으시다면 알려주세요!
새로운 설정을 활성화하면 어떤 일이 발생하나요?
Content-Security-Policy의 script-src 지시문은 단일 nonce- 값과 'strict-dynamic' 키워드를 포함하도록 업데이트됩니다.
코어 및 테마의 모든 초기 <script> 태그에는 적절한 nonce= 속성이 자동으로 부여됩니다. 관리자나 테마 개발자의 추가 작업은 필요하지 않습니다.
자체적인 사용자 정의 <script> 태그를 삽입하는 플러그인은 이 새로운 모드를 지원하도록 업데이트가 필요합니다(예시). 이 문제가 얼마나 널리 퍼져 있는지 데이터 수집을 진행 중이며, 필요 시 개발자에게 가이드라인을 제공하겠습니다.
테마나 플러그인이 기여하는 host-source 값은 자동으로 무시됩니다(브라우저는 strict-dynamic과 함께 host-source를 지원하지 않음).
GTM, 분석, 광고 등 외부 스크립트는 어떻게 되나요?
추가 구성 없이 '그냥 작동’해야 합니다. 문제가 발생하면 알려주세요!
되돌릴 수 있나요?
네! 실험을 진행하는 동안 설정을 켜고 끌 수 있으며, 변경 사항은 즉시 적용됩니다.
정책 예시
이 변경 사항 이전의 Discourse 정책 예시:
upgrade-insecure-requests;
base-uri 'self';
object-src 'none';
script-src https://meta.discourse.org/logs/ https://meta.discourse.org/sidekiq/ https://meta.discourse.org/mini-profiler-resources/ https://global.discourse-cdn.com/meta/assets/ https://meta.discourse.org/extra-locales/ https://d3bpeqsaub0i6y.cloudfront.net/highlight-js/ https://d3bpeqsaub0i6y.cloudfront.net/javascripts/ https://d3bpeqsaub0i6y.cloudfront.net/plugins/ https://d3bpeqsaub0i6y.cloudfront.net/theme-javascripts/ https://d3bpeqsaub0i6y.cloudfront.net/svg-sprite/ 'sha256-8uAKDaK4QxxCeYZl0Wxad2Nnj2tgKyA14hYBh66pnn0=' 'sha256-QFlnYO2Ll+rgFRKkUmtyRublBc7KFNsbzF7BzoCqjgA=';
worker-src 'self' https://global.discourse-cdn.com/meta/assets/ https://d3bpeqsaub0i6y.cloudfront.net/javascripts/ https://d3bpeqsaub0i6y.cloudfront.net/plugins/;
frame-ancestors 'self';
manifest-src 'self';
이 변경 사항 이후의 Discourse 정책 예시:
upgrade-insecure-requests;
base-uri 'self';
object-src 'none';
script-src 'nonce-78uQrKOCg78iGuMAwCq2lI9E7' 'strict-dynamic';
frame-ancestors 'self';
manifest-src 'self';