server {
listen 443 ssl;
# 기본 CSP 설정 (아주 엄격함)
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; connect-src 'self'; frame-ancestors 'self';" always;
# 또는 더 유연한 설정
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self';" always;
}
default-src 'self': 기본적으로 같은 도메인만 허용script-src 'self': JavaScript 출처 제한style-src 'self': CSS 출처 제한img-src 'self' data:: 이미지 출처 제한 (data URI 허용)frame-ancestors 'self': clickjacking 방지server {
listen 443 ssl;
# HSTS 설정 (프리로드 준비)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# 또는 보수적인 설정
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
max-age=63072000: 2년 동안 적용 (31536000 = 1년)includeSubDomains: 모든 하위 도메인 포함preload: 브라우저 프리로드 목록 등록server {
listen 443 ssl;
# X-Content-Type-Options 설정
add_header X-Content-Type-Options "nosniff" always;
}
text/css로 선언된 파일만 CSS로 처리application/javascript로 선언된 파일만 JS로 처리server {
listen 443 ssl;
# 다양한 정책 중 선택
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# 또는 더 엄격한 설정
add_header Referrer-Policy "same-origin" always;
# 또는 더 관대한 설정
add_header Referrer-Policy "no-referrer-when-downgrade" always;
}
no-referrer: Referrer 정보 전송 안 함same-origin: 같은 도메인에만 Referrer 전송strict-origin-when-cross-origin: 동일 도메인은 전체 URL, 다른 도메인은 도메인만 전송no-referrer-when-downgrade: HTTPS→HTTP가 아니면 Referrer 전송server {
listen 443 ssl;
server_name example.com www.example.com;
# SSL 설정
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
# 보안 헤더 설정
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
# 웹사이트 루트 설정
root /var/www/example.com;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
# HTTP → HTTPS 리다이렉트
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
add_header X-Frame-Options "SAMEORIGIN" always;
DENY(모든 프레임 금지), SAMEORIGIN(같은 도메인만 허용)add_header X-XSS-Protection "1; mode=block" always;
# nginx 설정 검증
sudo nginx -t
# nginx 재시작
sudo systemctl restart nginx
# 헤더 확인
curl -I https://example.com/
# 상세 헤더 확인
curl -i https://example.com/
# 또는 브라우저 개발자 도구 → Network 탭에서 확인
CSP는 점진적으로 도입
Content-Security-Policy-Report-Only로 먼저 테스트HSTS는 신중하게
max-age를 짧게 설정하고 점진적으로 증가모든 하위 도메인 확인
includeSubDomains 사용 시 모든 서브도메인이 HTTPS 지원해야 함테스트 필수