script-src에서 지원되는 해시 확장

Carlos Joan Rafael Ibarra Lopez
Carlos Joan Rafael Ibarra Lopez
Mustafa Emre Acer
Mustafa Emre Acer

게시일: 2025년 11월 17일

Chrome 141부터 오리진 트라이얼에 참여하여 Chrome에서 도입하는 새로운 콘텐츠 보안 정책 (CSP) 기능을 테스트할 수 있습니다. 이러한 기능은 웹사이트가 알려진 JavaScript 소스를 더 효과적으로 허용 목록에 추가하여 XSS로부터 보호할 수 있도록 지원합니다. 알려진 JavaScript를 허용 목록에 추가하고 다른 모든 소스를 차단하는 것이 XSS를 방지하는 효과적인 방법입니다. 공격자가 삽입한 JavaScript는 허용 목록에 없으므로 차단됩니다.

이러한 기능이 없으면 스크립트 호스트와 사이트 간에 nonce 통신 메커니즘이 없거나 스크립트의 전체 해시를 미리 알지 않고 모든 JavaScript 소스를 허용 목록에 추가하는 '엄격한' CSP를 사용하기 어렵습니다. 스크립트가 자주 변경되고 신뢰할 수 있지만 별도의 서드 파티에서 호스팅하는 경우 두 방법 모두 배포하기 어렵습니다. 또한 스크립트에서 eval을 사용해야 하는 경우 현재 CSP에서는 모든 스크립트에 대해 eval을 허용 목록에 추가해야 하므로 훨씬 약해집니다.

Google에서는 script-src에서 스크립트의 URL 기반 허용 목록을 위한 더 강력한 메커니즘과 eval 호출을 허용 목록에 추가하는 메커니즘을 제공하여 이 격차를 해소하려고 노력하고 있습니다. script-src의 기존 해시 메커니즘을 사용하여 특정 스크립트의 URL과 eval (및 기타 eval과 유사한 함수)에 전달된 JavaScript를 허용 목록에 추가할 수 있습니다. URL 기반 허용 목록은 무결성 기반 콘텐츠 보안 정책만큼 엄격하지는 않지만 이 메커니즘은 기존 호스트 이름 허용 목록에 비해 크게 개선되었습니다.

이를 통해 허용되지 않은 인라인 및 eval 스크립트를 차단하여 XSS를 강력하게 완화하는 CSP 정책을 더 쉽게 배포할 수 있습니다. 이러한 새로운 기능은 사용자 에이전트 스니핑을 하지 않고도 새로운 기능을 지원하는 브라우저에서 더 나은 보안을 제공하는 정책을 사이트에서 설정할 수 있도록 신중하게 설계되고 구현되었습니다. 새로운 기능을 지원하지 않는 브라우저에서는 보안이 손상되거나 퇴보하지 않습니다.

사용 사례

script-src와 함께 사용할 특정 URL 허용 목록

script-src와 함께 사용할 특정 스크립트를 허용 목록에 추가하려는 사이트에는 현재 두 가지 옵션이 있습니다. 하위 리소스 무결성(SRI)을 통해 스크립트 콘텐츠를 허용 목록에 추가하거나 host-source를 사용하여 호스트 이름을 허용 목록에 추가하는 것입니다. SRI는 자주 변경되는 스크립트 (예: 분석 스크립트)에는 적합하지 않은 경우가 많습니다. strict-dynamic도 설정된 경우 호스트 소스 지정은 무시되며 URL 매개변수가 포함되지 않으므로 포괄적인 보호가 아닙니다. 이 변경사항을 통해 (전체) URL의 해시를 사용하여 스크립트를 허용 목록에 추가할 수 있으며, strict-dynamic를 사용하는 동적 스크립트와 구성을 모두 지원합니다.

eval 또는 eval과 유사한 함수와 함께 사용할 특정 스크립트를 허용 목록에 추가

일부 사이트에서는 eval 또는 eval과 유사한 함수 (setTimeout, setInterval, setImmediate에서 문자열 리터럴로 코드 전달)를 사용해야 합니다. 이러한 사이트의 경우 eval에 대한 모든 호출을 사용 설정하는 unsafe-eval만 CSP 옵션으로 사용할 수 있습니다. 평가할 특정 입력을 허용 목록에 추가하는 메커니즘이 추가됩니다. 이 새로운 메커니즘을 사용하면 지나치게 광범위한 unsafe-eval CSP를 제공하지 않고도 스크립트 콘텐츠를 직접 해싱하여 필요한 특정 스크립트를 좁은 범위로 허용 목록에 추가할 수 있습니다.

시작하기

스크립트 및 eval 해싱 지원을 사용해 보려면 Chrome 141~144에서 실행되는 CSP의 URL 및 eval 해시 script-src 오리진 트라이얼에 참여하세요.

script-src에 해시 추가

url-<hash-algorithm>-<script-url-hash> 형식으로 script-src CSP 지시문에 값을 추가하여 URL을 허용 목록에 추가합니다. 이렇게 하면 콘텐츠와 관계없이 해당 URL이 제공하는 모든 콘텐츠가 실행될 수 있습니다. 해시에는 페이지에 포함된 URL인 초기 URL만 포함하면 되고, 해당 URL이 리디렉션되는 URL은 포함하지 않아도 됩니다. 절대 URL과 상대 URL이 모두 지원됩니다.

예를 들어 다음 CSP 헤더는 https://example.com/example.js에서 제공되는 스크립트를 허용 목록에 추가합니다.

Content-Security-Policy: script-src 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=';

여기서 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='은 'https://example.com/example.js'의 sha256 해시입니다.

eval 또는 new Function를 통해 평가된 스크립트는 스크립트 src에 eval-<hash-algorithm>-<script-contents-hash>를 포함하여 허용 목록에 추가할 수 있습니다. 예를 들어 다음 CSP 헤더는 alert("hello world") 문자열을 eval()에 전달하는 것을 허용 목록에 추가합니다.

Content-Security-Policy: script-src 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=';

여기서 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0='alert("hello world")의 sha256 해시입니다.

도입을 부트스트랩하기 위해 사이트가 오리진 트라이얼을 선택하면 URL과 eval의 해시가 DevTools 콘솔에 출력되고 CSP 보고서에 포함됩니다. 즉, 엄격하지만 report-only 정책을 사용하여 허용 목록에 필요한 모든 해시를 열거할 수 있습니다.

이전 버전과의 호환성 유지

모든 브라우저에서 지원을 추가하기 전에 이러한 정책의 배포를 허용하려면 URL 해시를 호스트 기반 허용 목록 뒤에 나열하면 됩니다. 새 해시 유형을 이해하는 브라우저는 이전 호스트 기반 허용 목록을 무시하는 반면 새 해시 유형을 이해하지 못하는 브라우저는 여전히 호스트 기반 허용 목록을 적용하므로 사이트에서 이를 모두 설정할 수 있습니다. 따라서 지원하는 브라우저에서는 더 엄격한 정책을 사용하고 지원하지 않는 브라우저에서는 중단 위험을 감수하지 않아도 됩니다(다음 예 참고).

Content-Security-Policy: script-src 'https:' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='

또한 URL 해시가 설정된 경우에만 적용되는 strict-dynamic의 동등한 항목인 strict-dynamic-url도 도입했습니다. strict-dynamic으로 인해 호스트 기반 허용 목록이 무시되므로 특정 해시를 허용 목록에 추가하고 strict-dynamic을 적용하려는 사이트는 다음과 같은 정책을 사용할 수 있습니다.

Content-Security-Policy: https: 'strict-dynamic-url' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='

이 예시에서 아직 해시를 지원하지 않는 브라우저는 https:만 적용합니다. 마찬가지로 eval 해시가 있으면 지원되는 브라우저에서 unsafe-eval가 무시됩니다. 예를 들어 다음 정책은 unsafe-eval로 평가됩니다. 이를 통해 아직 eval 해시를 지원하지 않는 브라우저에서 모든 eval() 사용이 가능하며, eval 해시를 지원하는 브라우저에서는 alert("hello world")eval()만 허용됩니다.

  Content-Security-Policy: script-src "unsafe-eval" "'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0='"

의견 공유

script-src에 대한 이러한 확장 프로그램에 관한 개발자의 의견을 기다리고 있습니다. GitHub의 설명에 문제를 댓글로 게시합니다.