웹 보안 헤더·HSTS·CSP
Source: Dev.to
원본은 thatdevpro.com에 처음 게시되었습니다. ThatDevPro의 오픈 SEO + AI 프레임워크 라이브러리의 일부입니다. ThatDevPro는 SDVOSB 인증을 받은 베테랑 소유 웹 + AI 엔지니어링 스튜디오이며, 오픈소스 AI 인용 툴킷은 github.com/Janady13/aio-surfaces 에서 확인할 수 있습니다.
HTTPS, 헤더, 인증, WAF, 하드닝, 사고 대응 및 검색 신뢰 유지를 위한 보안 자세
Joseph이 관리하는 사이트 전반에 걸친 웹 보안에 대한 포괄적인 참고 자료입니다. 2026년 현재 보안은 기본 기대치이며, Google은 HTTPS를 순위 요소(작지만)로 명시하고, 보안 문제가 발생하면 수동 조치를 트리거합니다. 브라우저 경고는 전환율을 급격히 떨어뜨리고, 침해 사고는 영구적인 브랜드 손상을 초래합니다.
보안은 종종 SEO/마케팅과 별개로 취급되지만, 두 분야는 크게 겹칩니다. 해킹당한 사이트는 순위가 하락하고, 브라우저에서 위험 사이트로 표시되며, 사용자를 떠나게 하고, GSC에서 수동 조치를 유발하며, 복구 작업에 수개월이 소요됩니다. 보안 신호가 약한 사이트는 사용자와 검색 엔진 모두의 신뢰를 잃습니다.
Joseph이 자체 관리 Linux 인프라에서 130개 이상의 프로덕션 클라이언트 사이트를 운영하는 상황에서는 보안 규율이 기본이 됩니다. 하나의 클라이언트 사이트가 침해되면 전체 호스팅 환경에 영향을 미칩니다. 특히 WordPress 사이트는 지속적인 공격 시도의 표적이 됩니다.
이 프레임워크는 서버, 애플리케이션, 콘텐츠, 운영 차원 전반에 걸친 보안 구현을 명시합니다.
- SSL Labs — ssllabs.com/ssltest/ — SSL/TLS 구성 테스트
- Mozilla Observatory — observatory.mozilla.org — 보안 헤더 분석
- Security Headers — securityheaders.com — 헤더 분석
- WPScan — WordPress 취약점 스캐너
- OWASP ZAP — 애플리케이션 보안 스캐너
- Wordfence / Sucuri / Patchstack — WordPress 보안 플랫폼
- Cloudflare — WAF 및 DDoS 방어
- Let’s Encrypt / acme.sh — 무료 SSL 인증서
Joseph의 Debian/Nginx 환경에서 130개 이상의 사이트 관리
Install certbot
apt install certbot python3-certbot-nginx
Get certificate for single site
certbot --nginx -d example.com -d www.example.com
Auto-renewal (typically configured by certbot install)
systemctl status certbot.timer
Manual renewal test
certbot renew --dry-run
대량 갱신 관리
Renew all certificates
certbot renew --quiet
Should be in cron or systemd timer
# Default: twice daily check, renews when within 30 days of expiry
Strong default Nginx HTTPS configuration:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
# SSL Certificate
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Modern SSL Configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# OCSP Stapling
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;
# Security Headers (see Section 3)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# ... rest of configuration
}
Redirect HTTP to HTTPS
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
구현 후 SSL Labs( ssllabs.com/ssltest/ ) 로 검증
목표 등급: A 또는 A+
수정이 필요한 항목: 프로토콜 취약점, 약한 암호, OCSP 누락, 인증서 체인 문제
보안 헤더는 브라우저가 강제하는 보호 계층을 추가합니다
Strict-Transport-Security (HSTS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
X-Frame-Options
add_header X-Frame-Options "SAMEORIGIN" always;
X-Content-Type-Options
add_header X-Content-Type-Options "nosniff" always;
Referrer-Policy
add_header Referrer-Policy "strict-origin-when-cross-origin" always;