HTTP 보안 헤더

Nginx HTTP 보안 헤더 설정 — XSS, Clickjacking, MIME 스니핑 등 브라우저 수준 방어

마지막 수정: 2026-05

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-referrerReferer 헤더 미전송
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 탭 → 응답 헤더에서도 확인 가능하다.