nonce로 신뢰된 스크립트가 동적으로 추가한 스크립트로 신뢰를 전달하는 strict-dynamic 개념도

strict-dynamic은 nonce 또는 hash로 허가한 스크립트가 동적으로 추가하는 스크립트에도 신뢰를 이어 주는 CSP 규칙입니다. 지원 브라우저에서 호스트 허용 목록을 계속 늘리는 대신, 승인된 시작 스크립트와 그 로더를 중심으로 정책을 설계할 수 있습니다. CSP Level 3 명세의 실행 규칙과 web.dev의 strict CSP 가이드를 함께 보면 적용 범위를 구분할 수 있습니다.

nonce 기반 시작점과 동적 로더

서버는 응답마다 예측하기 어려운 nonce를 생성해 CSP 헤더와 실행을 허용할 <script> 요소에 같은 값으로 넣습니다. strict-dynamic을 지원하는 브라우저는 nonce/hash로 승인된 스크립트와 그 스크립트가 동적으로 추가한 비 parser-inserted 스크립트를 신뢰할 수 있습니다. 이때 호스트·scheme 허용 목록은 해당 브라우저에서 fallback으로 취급될 수 있습니다.

Content-Security-Policy: script-src 'nonce-{응답별-난수}' 'strict-dynamic'; object-src 'none'; base-uri 'none'

이 정책은 태그에 붙은 단어 하나가 모든 위험을 막는다는 뜻이 아닙니다. 신뢰된 로더가 사용자 입력을 검증 없이 script.src로 사용하면 허용되지 않아야 할 코드를 불러올 수 있습니다. 로더가 읽는 URL·manifest·설정도 코드 실행 경계로 검토하세요.

`'unsafe-eval'`은 별도의 실행 허용이다

CSP에서 script-src는 지시자이고, strict-dynamic과 'unsafe-eval'은 서로 다른 소스 표현식입니다. script-src 또는 fallback 정책에서 'unsafe-eval'을 허용하면 eval(), Function() 생성자, 문자열을 받는 setTimeout()·setInterval() 같은 동적 JavaScript 평가가 다시 허용될 수 있습니다. strict-dynamic이 있다고 이 허용이 자동으로 취소되는 것은 아닙니다. 빌드 도구나 런타임이 문자열 평가에 의존하는지 찾아 제거하거나, 꼭 필요한 이유와 범위를 따로 검토하세요.

nonce나 hash를 지정한 정책은 지원 브라우저에서 일반적인 인라인 스크립트 허용을 제한하지만, CSP 전체가 HTML 주입 결함을 수정하는 것은 아닙니다. nonce는 응답마다 새로 만들어야 하고 같은 페이지에서 이미 실행 권한을 얻은 스크립트에 숨겨진 비밀이라고 취급해서도 안 됩니다. 안전한 DOM API와 문맥별 출력 인코딩으로 주입 원인을 고치고, 허용한 로더의 입력을 검증하세요.

Report-Only로 앱 동작을 확인한다

기존 사이트에 곧바로 차단 정책을 적용하면 인라인 이벤트 핸들러나 동적으로 넣던 스크립트가 실행되지 않을 수 있습니다. 먼저 Content-Security-Policy-Report-Only로 위반을 수집하고, 필요한 이벤트를 별도 listener로 옮기며 정상 기능과 외부 스크립트 경로를 확인합니다. 그 뒤 차단 정책을 단계적으로 적용하고 보고를 계속 살펴보세요. 보고가 조용하다는 사실만으로 XSS가 없다고 증명되지는 않습니다.

strict-dynamic을 모르는 오래된 브라우저의 fallback은 지원 브라우저와 다르게 동작합니다. web.dev는 일부 구형 브라우저를 위해 https: 같은 fallback을 검토하는 방법을 제시하지만, 허용 범위는 그만큼 넓어질 수 있습니다. 지원 브라우저 표와 실제 앱 동작을 함께 시험해 어떤 세대에서 어떤 정책이 적용되는지 결정하세요.

도입 전 확인 목록

  • 서버가 페이지 응답마다 충분히 예측 불가능한 nonce를 새로 만드는가?
  • nonce가 승인할 스크립트에만 붙고, 정책 헤더와 값이 일치하는가?
  • 승인된 동적 loader가 attacker-controlled URL을 script로 삽입하지 않는가?
  • 'unsafe-eval'이 필요한 곳을 찾아 별도로 제거·검토했는가?
  • Report-Only 보고와 구형 브라우저 fallback을 실제 화면에서 확인했는가?

CSP는 브라우저의 스크립트 실행을 제한하는 방어층입니다. 인증·인가, 안전한 출력 처리, 취약한 코드의 수정이나 앱의 다른 보안 통제를 대신하지 않습니다.

참고 자료