본문 바로가기
Security보안/웹어플리케이션 보안

Content Security Policy(CSP)로 자바스크립트 보안 강화하기

by ICT리더 리치 2025. 4. 22.
반응형

“스크립트 삽입 공격, 더는 당하지 마세요.” CSP는 자바스크립트의 가장 효과적인 보안 방패입니다.

안녕하세요. 웹 보안과 프론트엔드 시큐어 코딩을 동시에 다루고 있는 분들이 많을텐데요. 오늘은 자바스크립트 보안 중 가장 강력한 대응책인 CSP(Content Security Policy)에 대해 설명드리겠습니다. 많은 개발자들이 CSP를 어렵게 느끼지만, 원리와 구조만 파악하면 어떤 사이트에도 바로 적용 가능한 실전형 방패입니다. 이 글을 통해 여러분은 CSP의 핵심 개념부터 적용 실전, 개발툴 팁까지 전부 가져가실 수 있습니다.

시큐어코딩 교육을 진행 중인 20대 여성 보안 강사의 환한 실사 이미지
보안 교육 중 밝은 표정으로 강의 중인 시큐어코딩 전문 여성 강사

1. CSP란 무엇인가요?

CSP(Content Security Policy)는 웹 브라우저에 리소스 로딩 및 실행에 대한 규칙을 명시하여, 악성 스크립트 실행을 방지하는 보안 기능입니다.

HTML 문서의 <meta> 태그나 HTTP 응답 헤더로 정책을 선언할 수 있으며,

XSS, clickjacking, code injection

등 다양한 공격을 사전에 차단합니다.

2. 자바스크립트 보안에서 CSP가 중요한 이유

CSP는 자바스크립트 취약점을 이용한 스크립트 삽입 공격(XSS)을 근본적으로 차단할 수 있습니다. 특히 다음과 같은 환경에서 CSP는 필수입니다:

  • 사용자 입력이 HTML로 렌더링되는 환경 (게시판, 댓글)
  • 서드파티 JS 스크립트를 사용하는 경우
  • 보안 인증, 결제 등 민감 데이터가 있는 페이지
CSP는 코드 수정을 요구하지 않고 보안을 강화할 수 있는 정책 기반 방어 수단입니다.

3. 주요 CSP 디렉티브 살펴보기

CSP는 다양한 디렉티브(정책 항목)로 구성됩니다. 각각의 디렉티브는 어떤 리소스를 허용할지 결정합니다.

디렉티브 역할 예시
default-src 기본 리소스 로딩 출처 default-src 'self'
script-src 스크립트 실행 허용 도메인 script-src 'self' https://apis.google.com
img-src 이미지 로딩 출처 img-src * data:
frame-ancestors 페이지 임베딩 허용 도메인 (Clickjacking 방지) frame-ancestors 'none'

4. 실전 적용 예시: 안전한 정책 만들기

CSP는 HTTP 응답 헤더 또는 <meta> 태그로 선언 가능합니다. 실전에서는 다음과 같이 복합적인 정책 구성이 일반적입니다.

Content-Security-Policy:
  default-src 'self';
  script-src 'self' https://cdn.jsdelivr.net https://apis.google.com;
  style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
  font-src 'self' https://fonts.gstatic.com;
  img-src 'self' data: https:;
  connect-src 'self' https://api.myapp.com;
  media-src 'none';
  object-src 'none';
  frame-ancestors 'none';
  upgrade-insecure-requests;

이 정책은 안전하고 유연한 구성입니다. CDN, Google API, Web Font까지 필요한 외부 도메인만 허용하고, 나머지는 모두 차단합니다. upgrade-insecure-requests는 http 요청을 자동으로 https로 전환해 보안을 강화합니다.

5. 디버깅과 테스트 전략 (콘솔 로그 확인)

report-only 모드로 먼저 정책을 테스트하세요. 브라우저 콘솔에 오류가 기록되며 실제 차단은 되지 않습니다.

Content-Security-Policy-Report-Only:
  script-src 'self';
  report-uri /csp-violation-report-endpoint;

위 설정을 통해 브라우저는 외부 스크립트를 차단하지 않고 로그만 수집합니다. CSP 위반 로그는 다음과 같이 개발자 도구 콘솔에서 확인할 수 있습니다.

[Report Only] Refused to load the script from 'https://malicious.example.com'
because it violates the policy: "script-src 'self'".

이런 로그를 통해 어떤 리소스가 차단되었는지 파악하고, 정책을 조정할 수 있습니다.

  • 크롬: 개발자 도구 → 콘솔 탭 확인
  • 파이어폭스: 보안 탭에서도 CSP 정책 로그 확인 가능
  • Report URI / CSP Evaluator 등 외부 도구도 활용 가능

마지막으로 CSP 정책은 반드시 서비스 목적과 리소스 구성에 맞춰 유연하게 설계해야 하며, Content-Security-Policy-Report-Only로 충분한 테스트를 먼저 수행하는 것을 추천합니다.

6. 자주 묻는 질문 (FAQ)

Q CSP는 자바스크립트 보안 외에도 도움이 되나요?

네. 이미지, 폰트, 스타일시트, iframe 등의 리소스도 제어할 수 있어 전체적인 콘텐츠 무결성을 보호하는 데 도움이 됩니다.

Q script-src에 'unsafe-inline'을 넣으면 안 되나요?

보안상 매우 위험합니다. inline 스크립트는 XSS 공격의 주요 진입점이기 때문에 가능한 피해야 합니다. CSP 수준을 낮추기보다는 구조를 개선하는 것이 바람직합니다.

Q CSP와 CORS는 무엇이 다른가요?

CORS는 다른 도메인으로의 리소스 요청을 제어하는 것이고, CSP는 페이지 내 콘텐츠의 실행 범위를 제어합니다. 상호보완적인 보안 기능입니다.

Q CSP 적용 시 기존 페이지 오류가 나요. 어떻게 해야 하나요?

CSP는 적용 즉시 차단 기능이 발동되므로, 반드시 Content-Security-Policy-Report-Only 모드로 먼저 적용해 보고 오류 로그를 분석해 조정 후 최종 적용하는 것이 좋습니다.

 

지금까지 CSP의 핵심 개념부터 실제 적용, 디버깅 전략까지 살펴보았습니다. 웹 보안은 개발자 개인의 선택이 아닌 필수 과제입니다. 특히 프론트엔드 영역에서도 보안 사고는 언제든 발생할 수 있기 때문에, 시큐어 코딩과 정책 기반 방어는 모두의 기본이 되어야 합니다. 오늘 포스팅이 자바스크립트 보안에 대한 시야를 넓히는 데 도움이 되셨길 바랍니다. 궁금한 점은 댓글로 남겨주시고, 도움이 되셨다면 공유도 부탁드립니다 🙏

반응형