보안 강화 헤더: HSTS, CSP, OCSP Stapling
HTTPS 설정만으로는 충분하지 않습니다. 보안 헤더를 추가하면 XSS, 클릭재킹, 프로토콜 다운그레이드 공격 등 다양한 위협을 차단할 수 있습니다.
HSTS (HTTP Strict Transport Security)
브라우저가 해당 도메인에 항상 HTTPS로만 접속하도록 강제합니다. HTTP로 접속을 시도하면 서버에 요청도 보내지 않고 브라우저가 직접 HTTPS로 전환합니다.
# Nginx
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# Apache
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
파라미터 설명:
| 파라미터 | 설명 |
|---|---|
max-age=63072000 | 브라우저가 HTTPS를 강제할 기간 (초, 약 2년) |
includeSubDomains | 모든 서브도메인에도 적용 |
preload | HSTS Preload 목록 등록 신청 가능 |
주의: HSTS를 설정한 후 HTTP로만 접근 가능한 상황이 생기면 사용자가 해당 도메인에 접속할 수 없게 됩니다. 먼저 max-age=300(5분)으로 테스트 후 늘리세요.
HSTS Preload
hstspreload.org에 등록하면 Chrome, Firefox 등 브라우저에 최초 접속부터 HTTPS를 강제합니다.
X-Frame-Options (클릭재킹 방어)
다른 도메인의 iframe에 내 사이트가 삽입되는 것을 차단합니다.
add_header X-Frame-Options "SAMEORIGIN" always;
# DENY : 어디에도 삽입 불가
# SAMEORIGIN : 같은 도메인에서만 삽입 가능 (권장)
# ALLOW-FROM uri : 특정 URI에서만 허용 (구형, 비권장)
X-Content-Type-Options (MIME 스니핑 방어)
브라우저가 서버가 지정한 Content-Type을 무시하고 콘텐츠 타입을 추측(MIME 스니핑)하는 것을 차단합니다.
add_header X-Content-Type-Options "nosniff" always;
Content-Security-Policy (CSP)
XSS(Cross-Site Scripting) 공격을 방어하는 가장 강력한 헤더입니다. 브라우저에게 어떤 출처의 리소스만 로드할 수 있는지 알려줍니다.
add_header Content-Security-Policy "
default-src 'self';
script-src 'self' https://cdn.example.com;
style-src 'self' https://fonts.googleapis.com;
img-src 'self' data: https:;
font-src 'self' https://fonts.gstatic.com;
connect-src 'self' https://api.example.com;
frame-ancestors 'none';
base-uri 'self';
form-action 'self';
" always;
주요 지시어:
| 지시어 | 설명 |
|---|---|
default-src 'self' | 모든 리소스 기본값: 같은 도메인만 |
script-src | JavaScript 허용 출처 |
style-src | CSS 허용 출처 |
img-src | 이미지 허용 출처 |
frame-ancestors 'none' | iframe 삽입 완전 차단 (X-Frame-Options 대체) |
'unsafe-inline' | 인라인 스크립트 허용 (피해야 함) |
'nonce-{값}' | 특정 스크립트만 허용 (권장) |
CSP Report-Only (테스트 모드):
# 위반 시 차단하지 않고 보고만 함 (초기 도입 시 사용)
add_header Content-Security-Policy-Report-Only "
default-src 'self';
report-uri /csp-report;
" always;
Referrer-Policy
다른 사이트로 이동 시 Referer 헤더로 전달되는 URL 정보를 제어합니다.
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# no-referrer : Referer 헤더 전혀 보내지 않음
# same-origin : 같은 도메인 내에서만 전체 URL
# strict-origin-when-cross-origin : 교차 출처 시 도메인만 (권장)
# unsafe-url : 항상 전체 URL (비권장)
Permissions-Policy (Feature Policy)
브라우저의 특정 기능(카메라, 마이크, 위치 등)을 제어합니다.
add_header Permissions-Policy "
geolocation=(),
microphone=(),
camera=(),
payment=(self),
usb=()
" always;
OCSP Stapling
인증서 폐기 여부를 확인하는 OCSP 요청을 서버가 미리 처리해 클라이언트의 지연을 줄입니다.
# Nginx
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 5s;
# Apache (전역 설정)
SSLUseStapling On
SSLStaplingCache shmcb:/run/apache2/ssl_stapling(32768)
SSLStaplingReturnResponderErrors off
SSLStaplingStapleMaxAge 3600
완전한 보안 헤더 Nginx 설정
# /etc/nginx/snippets/security-headers.conf
# 다른 설정에서 include로 재사용
# HSTS (2년)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# 클릭재킹 방어
add_header X-Frame-Options "SAMEORIGIN" always;
# MIME 스니핑 방어
add_header X-Content-Type-Options "nosniff" always;
# XSS 필터 (구형 브라우저용)
add_header X-XSS-Protection "1; mode=block" always;
# Referrer 정책
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# 권한 정책
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
# CSP (서비스에 맞게 조정 필요)
add_header Content-Security-Policy "default-src 'self'; img-src 'self' data: https:; font-src 'self' https://fonts.gstatic.com;" always;
# 서버 정보 숨기기
server_tokens off;
# 각 서버 블록에서 include로 사용
server {
listen 443 ssl;
server_name example.com;
include /etc/nginx/snippets/security-headers.conf;
# ...
}
보안 헤더 검사 도구
# curl로 헤더 확인
curl -I https://example.com
# securityheaders.com API로 점수 확인
curl "https://securityheaders.com/?q=https://example.com&followRedirects=on" \
-o /dev/null -w "%{http_code}\n"
# 로컬에서 헤더 파싱
curl -sI https://example.com | grep -iE "strict-transport|x-frame|content-security|x-content"
securityheaders.com에서 A+ 등급 목표를 확인하세요.
다음 페이지에서는 TLS 고급 설정 — TLS 1.3 전용 설정과 취약 암호 비활성화를 알아봅니다.