“스크립트 삽입 공격, 더는 당하지 마세요.” CSP는 자바스크립트의 가장 효과적인 보안 방패입니다.
안녕하세요. 웹 보안과 프론트엔드 시큐어 코딩을 동시에 다루고 있는 분들이 많을텐데요. 오늘은 자바스크립트 보안 중 가장 강력한 대응책인 CSP(Content Security Policy)에 대해 설명드리겠습니다. 많은 개발자들이 CSP를 어렵게 느끼지만, 원리와 구조만 파악하면 어떤 사이트에도 바로 적용 가능한 실전형 방패입니다. 이 글을 통해 여러분은 CSP의 핵심 개념부터 적용 실전, 개발툴 팁까지 전부 가져가실 수 있습니다.
📌 바로가기 목차
1. CSP란 무엇인가요?
CSP(Content Security Policy)는 웹 브라우저에 리소스 로딩 및 실행에 대한 규칙을 명시하여, 악성 스크립트 실행을 방지하는 보안 기능입니다.
HTML 문서의 <meta>
태그나 HTTP 응답 헤더로 정책을 선언할 수 있으며,
XSS, clickjacking, code injection
등 다양한 공격을 사전에 차단합니다.
2. 자바스크립트 보안에서 CSP가 중요한 이유
CSP는 자바스크립트 취약점을 이용한 스크립트 삽입 공격(XSS)을 근본적으로 차단할 수 있습니다. 특히 다음과 같은 환경에서 CSP는 필수입니다:
- 사용자 입력이 HTML로 렌더링되는 환경 (게시판, 댓글)
- 서드파티 JS 스크립트를 사용하는 경우
- 보안 인증, 결제 등 민감 데이터가 있는 페이지
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)
네. 이미지, 폰트, 스타일시트, iframe 등의 리소스도 제어할 수 있어 전체적인 콘텐츠 무결성을 보호하는 데 도움이 됩니다.
보안상 매우 위험합니다. inline 스크립트는 XSS 공격의 주요 진입점이기 때문에 가능한 피해야 합니다. CSP 수준을 낮추기보다는 구조를 개선하는 것이 바람직합니다.
CORS는 다른 도메인으로의 리소스 요청을 제어하는 것이고, CSP는 페이지 내 콘텐츠의 실행 범위를 제어합니다. 상호보완적인 보안 기능입니다.
CSP는 적용 즉시 차단 기능이 발동되므로, 반드시 Content-Security-Policy-Report-Only
모드로 먼저 적용해 보고 오류 로그를 분석해 조정 후 최종 적용하는 것이 좋습니다.
지금까지 CSP의 핵심 개념부터 실제 적용, 디버깅 전략까지 살펴보았습니다. 웹 보안은 개발자 개인의 선택이 아닌 필수 과제입니다. 특히 프론트엔드 영역에서도 보안 사고는 언제든 발생할 수 있기 때문에, 시큐어 코딩과 정책 기반 방어는 모두의 기본이 되어야 합니다. 오늘 포스팅이 자바스크립트 보안에 대한 시야를 넓히는 데 도움이 되셨길 바랍니다. 궁금한 점은 댓글로 남겨주시고, 도움이 되셨다면 공유도 부탁드립니다 🙏
'Security보안 > 웹어플리케이션 보안' 카테고리의 다른 글
로그인 우회부터 DB 탈취까지: SQL 인젝션 유형 정리 (5) | 2025.08.08 |
---|---|
HTTPS와 SSL 인증서, 아직도 헷갈리시나요? (0) | 2025.04.20 |
CI/CD와 보안의 만남, DevSecOps 구축 실전 노하우 (0) | 2025.04.12 |
인증 토큰 vs 보안 토큰 – 실무에서 꼭 알아야 할 차이점과 예제 코드 (1) | 2025.04.05 |
보안 코드 리뷰 체크리스트 – 실무에 바로 쓰는 취약점 점검 항목 (1) | 2025.04.04 |