Django의 콘텐츠 보안 정책을 사용하는 방법¶
기본 구성¶
Django 프로젝트에서 콘텐츠 보안 정책(CSP)을 활성화하려면 다음을 따르세요.
MIDDLEWARE설정에 CSP 미들웨어를 추가합니다:MIDDLEWARE = [ # ... "django.middleware.csp.ContentSecurityPolicyMiddleware", # ... ]
``settings.py``에서
SECURE_CSP또는SECURE_CSP_REPORT_ONLY중 하나(또는 둘 다)를 사용하여 CSP 정책을 설정합니다. :ref:`CSP 설정 문서 <csp-settings>`에서는 두 설정의 차이점을 자세히 설명합니다:from django.utils.csp import CSP # To enforce a CSP policy: SECURE_CSP = { "default-src": [CSP.SELF], # Add more directives to be enforced. } # Or for report-only mode: SECURE_CSP_REPORT_ONLY = { "default-src": [CSP.SELF], # Add more directives as needed. "report-uri": "/path/to/reports-endpoint/", }
논스 구성¶
CSP 정책에서 논스를 사용하려면 기본 구성 외에도 다음을 수행해야 합니다.
CSP 설정에
NONCE플레이스홀더 값을 추가하세요. 이는script-src또는style-src지시문에만 적용됩니다:from django.utils.csp import CSP SECURE_CSP = { "default-src": [CSP.SELF], # Allow self-hosted scripts and script tags with matching `nonce` attr. "script-src": [CSP.SELF, CSP.NONCE], # Example of the less secure 'unsafe-inline' option. "style-src": [CSP.SELF, CSP.UNSAFE_INLINE], }
TEMPLATES설정에csp()컨텍스트 프로세서를 추가하세요. 이렇게 하면 생성된 논스 값을 Django 템플릿에서csp_nonce컨텍스트 변수로 사용할 수 있습니다:TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "OPTIONS": { "context_processors": [ # ... "django.template.context_processors.csp", ], }, }, ]
템플릿에서
csp_nonce컨텍스트 변수를 사용하여 관련 인라인<style>or<script>태그에nonce속성을 추가하세요.<style nonce="{{ csp_nonce }}"> /* These inline styles will be allowed. */ </style> <script nonce="{{ csp_nonce }}"> // This inline JavaScript will be allowed. </script>
캐싱과 논스 재사용
ContentSecurityPolicyMiddleware`는 고유한 논스를 생성하고 템플릿에서 논스가 사용될 때 ``Content-Security-Policy` (또는 Content-Security-Policy-Report-Only) 헤더에 적절한 nonce-<value> 소스 표현식을 추가하는 작업을 자동으로 처리합니다.
올바르게 동작하도록 하려면 HTML과 헤더가 모두 동일한 요청에서 생성되고, 캐시에서 제공되지 않아야 합니다. 구현 상세 정보와 중요한 캐싱 관련 고려 사항은 Nonce usage 참고 문서를 확인하세요.