HTTP 보안 헤더
브라우저가 응답 헤더를 보고 보안 정책을 적용하도록 지시한다.
서버 코드 변경 없이 Nginx 설정만으로 적용할 수 있다.
전체 설정 예시
# /etc/nginx/snippets/security-headers.conf
# Clickjacking 방어
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 "camera=(), microphone=(), geolocation=()" always;
# HTTPS 강제 (HSTS) — HTTPS 운영 시 활성화
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# /etc/nginx/conf.d/your-site.conf
server {
listen 443 ssl;
server_name example.com;
include /etc/nginx/snippets/security-headers.conf;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
헤더별 설명
X-Frame-Options
클릭재킹(Clickjacking) 공격 방어. 페이지가 <iframe>에 삽입되는 것을 제어한다.
| 값 | 설명 |
|---|---|
DENY | 어떤 도메인에서도 iframe 불가 |
SAMEORIGIN | 같은 도메인에서만 iframe 허용 (권장) |
add_header X-Frame-Options "SAMEORIGIN" always;
X-Content-Type-Options
브라우저가 응답의 Content-Type을 무시하고 내용을 분석해 타입을 추측하는 MIME 스니핑을 차단한다.
공격자가 .jpg로 위장한 스크립트 파일을 실행하는 것을 방지한다.
add_header X-Content-Type-Options "nosniff" always;
X-XSS-Protection
IE, 구버전 Chrome의 내장 XSS 필터를 활성화한다.
최신 브라우저는 CSP로 대체되었으나 레거시 브라우저 대응을 위해 유지한다.
add_header X-XSS-Protection "1; mode=block" always;
Referrer-Policy
다른 사이트로 이동할 때 Referer 헤더에 포함되는 URL 정보 범위를 제어한다.
내부 URL, 세션 토큰 등이 외부로 유출되는 것을 방지한다.
| 값 | 동작 |
|---|---|
no-referrer | Referer 헤더 미전송 |
strict-origin | 동일 프로토콜일 때 오리진(도메인)만 전송 |
strict-origin-when-cross-origin | 같은 오리진은 전체 URL, 외부는 오리진만 전송 (권장) |
unsafe-url | 항상 전체 URL 전송 (비권장) |
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
Permissions-Policy
카메라, 마이크, 위치 정보 등 브라우저 기능에 대한 접근을 제한한다.
사용하지 않는 기능은 명시적으로 빈 값(())으로 비활성화한다.
# 카메라/마이크/위치 정보 접근 전면 차단 예시
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
사용하는 기능이 있으면 해당 항목만 허용 도메인을 지정한다.
# 자사 도메인에서만 카메라 허용
add_header Permissions-Policy "camera=(self), microphone=(), geolocation=()" always;
Strict-Transport-Security (HSTS)
브라우저가 해당 도메인에 HTTP로 접속 시도 시 자동으로 HTTPS로 업그레이드하도록 강제한다.
HTTPS가 완전히 구성된 후에만 적용한다. 잘못 설정하면 사이트 접속이 불가능해진다.
# max-age: 1년(초 단위), includeSubDomains: 서브도메인 포함
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
HSTS 적용 전 체크리스트
- HTTPS 인증서 정상 발급 및 자동 갱신 확인
- 모든 서브도메인 HTTPS 지원 여부 확인 (includeSubDomains 사용 시)
적용 방법
sudo nginx -t && sudo nginx -s reload
헤더 적용 확인
# curl로 응답 헤더 확인
curl -I https://example.com
# 특정 헤더만 확인
curl -sI https://example.com | grep -i "x-frame\|x-content\|x-xss\|referrer\|permissions\|strict-transport"
브라우저 개발자 도구 → Network 탭 → 응답 헤더에서도 확인 가능하다.