AI와 개발

콘텐츠 보안 정책(CSP)

작성: Jake Luo · 게시일: 2026년 9월 23일

콘텐츠 보안 정책(CSP)은 웹사이트가 브라우저에 보내는 규칙 모음으로, 보통 Content-Security-Policy 응답 헤더로 전달됩니다. 페이지가 스크립트, 스타일, 이미지, 폰트, 프레임을 어느 출처에서 불러올 수 있는지, 그리고 데이터를 어디로 보낼 수 있는지를 정합니다. 정책이 허용하지 않은 것은 실행되기 전에 브라우저가 거부합니다. 페이지 자체는 그대로 열리기 때문에 CSP 실수는 좀처럼 오류처럼 보이지 않습니다. 무언가가 조용히 빠진 페이지처럼 보일 뿐입니다.

정책이 실제로 통제하는 것

정책은 지시어(directive)의 목록이며, 각 지시어가 한 종류의 요청을 관할합니다. CSP는 크로스 사이트 스크립팅에 대한 2차 방어선으로 설계되었습니다. 공격자가 페이지에 마크업을 주입하는 데 성공하더라도, 정책이 지정하지 않은 출처의 스크립트는 브라우저가 실행하지 않습니다. 가장 먼저 마주치게 될 지시어는 다음과 같습니다.

  • default-src — 기본값입니다. 자체 지시어가 없는 모든 요청 유형은 이것을 물려받으므로, default-src 'self'는 따로 지정하지 않는 한 폰트, 미디어 등도 조용히 함께 규정합니다.
  • script-src, style-src, img-src, font-src — 각 종류의 하위 리소스를 어디서 가져올 수 있는지 정합니다. 'self'는 페이지 자신의 출처를 뜻하고, 호스트 이름을 적으면 그 호스트를 허용하며, 'unsafe-inline'은 페이지 안에 직접 작성된 코드를 허용합니다.
  • connect-src — 페이지의 코드가 fetch, XHR, WebSockets로 요청을 보낼 수 있는 곳입니다. 스크립트가 외부로 데이터를 보낼 수 있는지를 결정하는 지시어가 바로 이것입니다.
  • form-action — 폼이 제출될 수 있는 곳입니다. frame-ancestors — 누가 이 페이지를 프레임에 넣을 수 있는지로, X-Frame-Options를 대체하는 최신 방식입니다.
  • 논스와 해시 — 모든 인라인 스크립트를 허용하지 않고 특정 인라인 스크립트 하나만 허용하는 방법입니다. 서버가 자신이 작성한 스크립트에 표시를 해 두고, 나중에 주입된 코드에는 그 표시가 없습니다.

전달 방식에서 흔히 걸리는 함정이 두 가지 있습니다. 정책은 <meta http-equiv> 태그로도 설정할 수 있지만 이 방식은 모든 기능을 지원하지 않으며, 보고 전용(report-only) 정책은 아예 이렇게 전달할 수 없습니다. 또 정책에 같은 지시어가 두 번 들어가면 브라우저는 첫 번째를 따르고 두 번째는 무시하므로, "추가한" 규칙이 소스에서는 멀쩡해 보이면서 아무 효과도 없을 수 있습니다.

차단된 리소스가 조용히 실패하는 이유

브라우저는 정책에 따라 요청을 거부하면 개발자 콘솔에 한 줄을 남기고 렌더링을 계속합니다. 오류 페이지도, 알림도 없습니다. 방문자나 사이트를 훑어보는 운영자가 알아챌 만한 것이 전혀 없습니다. 이후 페이지가 어떻게 보이는지는 무엇이 거부되었는지에 전적으로 달려 있습니다. 분석 스크립트가 차단되면 페이지는 픽셀 하나 다르지 않은데 수치만 0이 됩니다. 웹 폰트가 차단되면 대부분의 사람이 눈치채지 못하는 시스템 서체로 대체됩니다. 스타일시트나 CSS 프레임워크가 차단되면 공들여 디자인한 페이지가 스타일 없는 기본 HTML로 바뀝니다.

실제 문제는 이 폭입니다. 같은 종류의 위반이 눈에 보이지 않는 수준부터 페이지를 망가뜨리는 수준까지 걸쳐 있는데, 정책 문구만으로는 어느 쪽인지 알 수 없습니다. 로컬 사본이 아니라 배포된 URL로 테스트하십시오 — 노트북에서 연 파일은 보통 정책 없이 제공되므로, 실제 페이지에서 거부될 것까지 모두 불러올 수 있습니다. AI로 만든 페이지가 미리보기에서는 괜찮다가 게시 후에 어긋나 보이는 가장 흔한 이유가 이것입니다.

다른 사람의 페이지에 정책을 운영하며 배운 것

AgentCeres — agentceres.com의 AI Growth Officer — 는 에이전트가 고객을 위해 만든 페이지를 게시하며, 모든 페이지는 엄격한 정책 아래에서 제공됩니다. 리소스는 페이지 자신의 출처에서만, 이미지는 출처에서 오거나 직접 내장된 것만, 폼은 호스트로만 제출, 다른 사이트에 임베드 불가, 그리고 connect-src 'none'입니다. 따라서 페이지의 코드는 계산하고, 로컬에 무언가를 기억하고, 페이지를 이동할 수는 있지만 네트워크 요청은 단 하나도 보낼 수 없습니다. 이 마지막 규칙 때문에 페이지 코드에 넣은 비밀 키는 실제 페이지에서 사용조차 될 수 없습니다.

2026-09-04에 호스팅 중인 모든 페이지를 점검했을 때, 52개 페이지 중 5개(5 of 52)에 끝내 로드되지 않는 외부 리소스가 하나 이상 있었습니다. 가장 심각한 것은 레이아웃 전체를 공개 CDN에서 불러오는 CSS 프레임워크에 의존한 페이지였습니다. 정책은 외부 호스트를 하나도 지정하지 않으므로 프레임워크는 끝내 도착하지 않았고, 페이지는 스타일 없는 일반 텍스트로 게시되었습니다. 라디오 스트림이나 임베드 프레임을 잃은 페이지도 있었습니다. 게시 시점에 차단될 참조를 제거하는 방법도 검토했지만 채택하지 않았습니다. 제거된 페이지도 여전히 "문제없이 게시"되고 여전히 어긋나 보이기 때문입니다. 게시를 아예 거부하는 것도 나을 게 없었습니다. 같은 규칙이 대체 서체로 넘어갈 뿐인 폰트 때문에 페이지를 막아 버리기 때문입니다. 그래서 게시 단계에서 차단될 참조마다 그것을 거부할 지시어를 함께 보고하고, 누군가 페이지를 보기 전에 수정이 이루어지게 했습니다. 판정은 서버가 보내는 것과 같은 지시어 목록으로, 대체 규칙까지 포함해 계산하므로 경고가 정책과 어긋날 수 없습니다.

이 교훈은 우리 환경을 넘어 일반화됩니다. 실제 페이지에 대고 확인하지 않은 정책은 알리지도 않고 페이지를 망가뜨리는 정책입니다. 적용하기 전에 먼저 Content-Security-Policy-Report-Only로 보내 보십시오. 아무것도 차단하지 않고 위반만 보고하므로, 무엇이 망가졌을지 읽어 볼 수 있습니다.

정책이 할 수 없는 것

CSP는 페이지가 무엇을 불러오고 어디에 연결할 수 있는지를 통제합니다. 그 이상의 역할을 기대하기 쉽습니다.

  • 쿠키를 다루는 지시어는 없습니다. 정책이 허용한 스크립트는 HttpOnly로 표시된 것을 제외하면 여전히 쿠키를 읽고 설정할 수 있습니다. 상위 도메인을 공유하는 페이지끼리는 쿠키도 공유할 수 있으며, 이를 막으려면 더 엄격한 정책이 아니라 별도의 통제가 필요합니다.
  • 인라인 코드를 안전하게 만들어 주지 않습니다. 'unsafe-inline'을 허용하면 페이지에 쓰인 모든 것이 허용되고, 공격자가 써 넣은 것도 예외가 아닙니다. 논스와 해시가 존재하는 이유가 이것입니다.
  • 이스케이프와 입력 검증을 대체하지 않습니다. 주입의 피해를 제한할 뿐 주입 자체를 막지는 않습니다. 사용자 입력을 그대로 믿는 페이지는 여전히 결함이 있고, 악용하기가 조금 어려워졌을 뿐입니다.
  • AI 에이전트를 입력으로부터 보호하지 않습니다. 정책은 브라우저가 악성 스크립트를 불러오는 것을 막지만, 에이전트가 읽고 따라 움직이는 악성 *텍스트*에는 아무 효과가 없습니다. 그것은 프롬프트 인젝션이라는 별개의 문제입니다.

자주 묻는 질문

이미지나 폰트가 로컬에서는 불러와지는데 실제 사이트에서는 안 되는 이유는 무엇인가요?
대부분 호스트는 정책을 제공하고 로컬 사본에는 정책이 없기 때문입니다. 실제 페이지를 열고 브라우저 콘솔에서 Content Security Policy를 언급하는 줄을 찾아보십시오. 각 줄에 요청을 거부한 지시어가 적혀 있습니다. 해결책은 해당 파일을 자신의 사이트에서 제공하거나, 그 파일 유형을 관할하는 지시어에 외부 호스트를 추가하는 것입니다.
오류를 없애려고 'unsafe-inline'이나 와일드카드를 추가해도 되나요?
할 수는 있고 오류도 사라지지만, 정책이 지키던 것의 대부분도 함께 사라집니다. 실제로 사용하는 호스트를 구체적으로 지정하고, 인라인 스크립트는 전부가 아니라 논스나 해시로 하나씩 허용하십시오. 어떤 호스트가 필요한지 모르겠다면 한동안 보고 전용 모드로 정책을 운영하며 보고를 읽어 보십시오.
콘텐츠 보안 정책이 SEO에 영향을 주나요?
직접적으로는 아닙니다. 검색 엔진은 CSP를 순위 요소로 쓰지 않습니다. 다만 콘텐츠나 구조화된 데이터를 삽입하는 스크립트처럼 렌더링된 페이지가 의존하는 무언가를 차단하면 간접적으로 영향을 줄 수 있습니다. 브라우저로 페이지를 렌더링하는 크롤러도 대체로 같은 거부를 겪기 때문입니다. 소스만 보지 말고 렌더링된 페이지를 확인하십시오.
관련 용어
프롬프트 인젝션바이브 코딩 (Vibe Coding)디자인 시스템레이트 리밋 (Rate Limit)

이 일을 대신 실행하는 AI 그로스 팀

AgentCeres는 관리형 AI 마케팅 팀입니다. 무엇을 내보낼지는 직접 승인합니다. 14일 무료 체험, $39/월부터.

무료 체험 시작용어집 둘러보기