CSP란 무엇인가
CSP(Content Security Policy)는 웹 브라우저가 어떤 출처의 리소스만 실행하거나 불러올 수 있는지를 서버가 명시적으로 지정하는 보안 정책입니다. HTTP 응답 헤더나 HTML의 meta 태그를 통해 전달되며, 브라우저는 이 정책을 읽고 정책에 어긋나는 스크립트, 이미지, 스타일 등의 로딩을 차단합니다.
비유하자면 CSP는 ‘건물 출입 허가 명단’과 같습니다. 명단에 없는 사람(출처)은 아무리 정당해 보여도 건물(브라우저) 안으로 들어올 수 없습니다. 즉 신뢰할 수 있는 출처만 ‘화이트리스트’로 등록해두고, 그 외의 모든 리소스는 원천 차단하는 방식입니다.
동작 원리와 예시
CSP는 보통 서버에서 다음과 같은 헤더로 전달됩니다.
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com
이 정책은 ‘기본적으로 같은 출처(self)의 리소스만 허용하고, 스크립트는 자기 자신과 trusted-cdn.com에서만 불러올 수 있다’는 뜻입니다. 만약 공격자가 XSS 취약점을 통해 <script>alert(1)</script> 같은 인라인 스크립트를 페이지에 삽입했다 하더라도, CSP 정책에 인라인 스크립트 실행이 허용되어 있지 않다면 브라우저는 이를 실행하지 않고 콘솔에 정책 위반 에러만 남깁니다.
주요 지시어(directive)는 다음과 같습니다.
script-src: 자바스크립트 실행을 허용할 출처 지정style-src: CSS 로딩을 허용할 출처 지정img-src: 이미지 로딩을 허용할 출처 지정default-src: 다른 지시어가 없을 때 적용되는 기본값
특히 인라인 스크립트나 eval() 사용을 막는 것이 XSS 방어에 핵심적인데, 이는 unsafe-inline, unsafe-eval 옵션을 명시적으로 추가하지 않는 한 기본적으로 차단되기 때문입니다.
실무에서 CSP를 쓰는 이유
입력값 검증이나 출력 이스케이프 같은 기존 XSS 방어 기법은 개발자의 실수 하나로 뚫릴 수 있습니다. 하지만 CSP는 브라우저 레벨에서 동작하는 ‘최후의 방어선’ 역할을 합니다. 코드 어딘가에서 이스케이프 처리를 놓쳐 악성 스크립트가 삽입되더라도, CSP 정책이 제대로 설정되어 있다면 브라우저가 실행 자체를 차단해줍니다.
또한 CSP는 위반 사항이 발생했을 때 이를 서버로 보고하도록 설정할 수도 있습니다. report-uri 또는 report-to 지시어를 사용하면 실제 공격 시도나 설정 오류를 실시간으로 모니터링할 수 있어, 보안 운영 측면에서도 유용합니다.
다만 CSP는 만능이 아닙니다. 정책 설정이 지나치게 느슨하면 효과가 없고, 반대로 너무 엄격하면 정상적인 서비스 기능까지 막힐 수 있습니다. 따라서 서비스에서 실제로 사용하는 스크립트, 폰트, 이미지 출처를 정확히 파악한 뒤 점진적으로 정책을 강화해나가는 것이 안전한 도입 방법입니다.