HTTP 보안 헤더 8종을 전부 설정한 웹사이트는 생각보다 드물다. Mozilla Observatory 통계 기준, 전체 스캔 사이트의 60% 이상이 CSP를 누락하고 있고, HSTS 미설정 사이트는 절반을 넘는다. Scott Helme의 2023 Web Almanac 분석에서도 상위 100만 개 사이트 중 HSTS를 올바르게 설정한 곳은 30% 수준이었다. 서버 코드 한 줄 안 바꾸고 설정 몇 줄로 막을 수 있는 공격을 그냥 열어두고 있는 셈이다.
HTTP 보안 헤더가 왜 중요한가
보안 헤더는 브라우저 동작을 서버가 명시적으로 제어하는 방식이다. 공격이 들어오기 전에 브라우저 레벨에서 실행 자체를 막는다. 보안 전문 기업 SENTRIX가 실제 보안 점검에서 확인한 패턴을 보면, X-Frame-Options 미설정 + 인증 없는 관리자 버튼이 같이 있을 때 클릭재킹으로 실제 계정 탈취까지 이어진 사례를 현장에서 직접 봤다.
8종 헤더 — 출처·권장 값·서버별 설정
1. HSTS (Strict-Transport-Security)
HTTP Archive Security 보고서에 따르면 2024년 기준 상위 100만 사이트 중 HSTS 설정 비율은 32.4%다.
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
# Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
2. Content-Security-Policy (CSP)
출처: W3C CSP Level 3 / MDN
Mozilla Observatory 기준, 2024년에도 전체 사이트의 62%가 CSP를 미설정 상태로 운영 중이다.
# Nginx
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-ancestors 'none'; base-uri 'self'; form-action 'self'" always;
3. X-Frame-Options
출처: RFC 7034. HTTP Archive 기준 2024년 설정률은 약 27%다.
X-Frame-Options: DENY
# Nginx
add_header X-Frame-Options "DENY" always;
4. X-Content-Type-Options
출처: Fetch Living Standard. 2024년 설정률은 40% 수준이다.
X-Content-Type-Options: nosniff
5. Referrer-Policy
Referrer-Policy: strict-origin-when-cross-origin
6. Permissions-Policy
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=(), interest-cohort=()
7. Cross-Origin-Opener-Policy (COOP)
출처: MDN COOP
Cross-Origin-Opener-Policy: same-origin
8. Cross-Origin-Embedder-Policy (COEP)
출처: MDN COEP
Cross-Origin-Embedder-Policy: require-corp
"Security headers are one of the easiest wins in web security — low effort, high impact, yet consistently overlooked." — Scott Helme, securityheaders.com 창업자
헤더별 사용률 현황 (2024 기준)
- X-Content-Type-Options: 약 40% 설정
- X-Frame-Options: 약 27% 설정
- HSTS: 약 32% 설정
- Referrer-Policy: 약 15% 설정
- CSP: 약 15% 설정
- Permissions-Policy: 약 9% 설정
- COOP: 약 4% 설정
- COEP: 약 2% 설정
CSP 실전 트랩 — unsafe-inline 제거 절차
1단계 — Report-Only로 현황 파악
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self'; report-uri /csp-report
2단계 — nonce 방식으로 교체
import secrets
nonce = secrets.token_hex(16)
response.headers['Content-Security-Policy'] = f"script-src 'self' 'nonce-{nonce}'"
설정 검증
curl -I https://yourdomain.com 2>/dev/null | grep -iE "strict-transport|content-security|x-frame|x-content-type|referrer-policy|permissions-policy|cross-origin"
자주 묻는 질문
HSTS preload 등록은 어떻게 하나요?
hstspreload.org에서 도메인을 제출한다. 등록 후 제거는 수개월이 걸리므로 서브도메인까지 HTTPS가 완전히 정비된 상태에서 신청해야 한다.
CSP를 설정했는데 콘솔에 에러가 쏟아집니다. 어떻게 디버깅하나요?
브라우저 개발자 도구 Console 탭에서 Content Security Policy 에러를 확인한다. Content-Security-Policy-Report-Only로 먼저 전환해서 실제 차단 없이 위반 목록을 수집한다.
Cloudflare를 쓰면 Nginx 설정 없이 헤더를 추가할 수 있나요?
그렇다. Cloudflare Dashboard → Rules → Transform Rules → Modify Response Header에서 추가할 수 있다.
X-Frame-Options DENY 설정 후 자사 iframe이 깨지면 어떻게 하나요?
같은 도메인 iframe이라면 SAMEORIGIN으로 변경한다. 다른 도메인에서 iframe 삽입이 필요한 경우에는 CSP frame-ancestors로 처리하는 게 맞다.
보안 헤더 설정 후 A등급 인증을 받고 싶은데 기준이 있나요?
securityheaders.com 기준으로 A등급은 HSTS·CSP·X-Frame-Options·X-Content-Type-Options·Referrer-Policy·Permissions-Policy 6종이 모두 설정돼 있어야 한다.
지금 바로 확인해보기
내 서비스에 8종 헤더가 제대로 설정돼 있는지 codescan.kr 무료 보안 진단에서 URL 하나로 자동 점검할 수 있다. 보안 전문 기업 SENTRIX가 실제 모의해킹에서 쓰는 점검 항목을 기반으로 만든 스캐너다.