HTTP 응답 보안 헤더에 관하여
HTTP 응답 보안 헤더(HTTP Security Response Headers)는 웹 서버가 브라우저에게 웹사이트의 콘텐츠를 어떻게 안전하게 처리하고 렌더링해야 하는지 지시하는 일종의 ‘보안 규칙’입니다. 브라우저가 웹 페이지를 요청하면 서버는 본문(HTML)과 함께 헤더 정보를 보냅니다. 이때 보안 헤더를 적절히 설정하면, 웹 애플리케이션의 코드를 크게 수정하지 않고도 크로스 사이트 스크립팅(XSS), 클릭재킹(Clickjacking), 데이터 탈취 등 다양한 웹 공격을 브라우저 수준에서 효과적으로 차단할 수 있습니다. 주요 보안 헤더들은 각각 서로 다른 보안 위협을 방어하는 역할을 합니다. 크게 다음과 같은 핵심 헤더들이 있습니다.
- Content-Security-Policy (CSP)
- HTTP Strict-Transport-Security (HSTS)
- X-Frame Options
- X-XSS-Protection
- X-Content-Type-Options
- Set-Cookie flags
- Referrer Policy
- Permissions-Policy
- X-Permitted-Cross-Domain Policies
- Cross-Origin Resource Sharing (CORS)
- Content-Security-Policy (CSP)
- 역할: 웹 페이지가 로드하고 실행할 수 있는 리소스(스크립트, 이미지, 스타일시트 등)의 안전한 출처를 브라우저에 알려주는 강력한 정책 지침서입니다.
- 방어하는 위협: 🚫XSS(크로스 사이트 스크립팅) 공, 데이터 주입 공격, 패킷 감청 등
- Nginx 설정(nginx.conf)
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://api.example.com;" always;
- Apache 설정(httpd.conf)
LoadModule headers_module modules/mod_headers.so <IfModule mod_headers.c> Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://api.example.com;" </IfModule>
- HTTP Strict-Transport-Security (HSTS)
- 역할: 브라우저에게 “앞으로 이 사이트에 접속할 때는 주소창에
http://라고 입력해도 무조건https://로 암호화하여 접속하라”고 강제하는 규칙입니다. - 방어하는 위협: 🚫인간 중간자 공격(MitM), 프로토콜 다운그레이드 공격
- Nginx 설정(nginx.conf)
# 1년(31536000초) 동안 HTTPS 접속을 강제하며, 서브도메인까지 모두 적용 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
- Apache 설정(httpd.conf)
LoadModule headers_module modules/mod_headers.so # Header always set을 사용하면 301/302 리다이렉트 응답을 보낼 때도 헤더가 누락되지 않고 브라우저에 확실하게 전달됩니다. <IfModule mod_headers.c> Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" </IfModule>
- 역할: 브라우저에게 “앞으로 이 사이트에 접속할 때는 주소창에
- X-Frame-Options
- 역할: 현재 웹 페이지가 다른 사이트의 <iframe>, <frame>, <object> 태그 내부에 삽입되어 렌더링되는 것을 허용할지 여부를 결정합니다.
- 방어하는 위협: 🚫클릭재킹(Clickjacking)
- Nginx 설정(nginx.conf)
add_header X-Frame-Options "SAMEORIGIN" always;
- Apache 설정(httpd.conf)
LoadModule headers_module modules/mod_headers.so <IfModule mod_headers.c> Header set X-Frame-Options "SAMEORIGIN" </IfModule>
- X-XSS-Protection
- 역할: 옛날 브라우저(IE 등)에 내장된 XSS 필터를 활성화하여, 공격이 감지되면 페이지 로드를 강제로 중단하거나 정화(sanitize)하는 기능입니다. 다만, 최신 브라우저에서는 이 필터가 오히려 취약점을 만들 수 있어 대부분 지원이 중단되었으며, 현재는 대안으로 앞서 배운 CSP를 강력히 권장합니다.
- 방어하는 위협: 🚫구형 브라우저에서의 XSS 공격
- Nginx 설정(nginx.conf)
# 1; mode=block은 XSS 감지 시 페이지 렌더링을 중단하라는 의미입니다. add_header X-XSS-Protection "1; mode=block" always;
- Apache 설정(httpd.conf)
LoadModule headers_module modules/mod_headers.so <IfModule mod_headers.c> Header set X-XSS-Protection "1; mode=block" </IfModule>
- X-Content-Type-Options
- 역할: 브라우저가 파일의 실제 내용(MIME 타입)을 임의로 추측해서 실행하는 ‘MIME 스니핑(MIME Sniffing)’을 금지하고, 서버가 보낸 Content-Type 헤더에 적힌 형식대로만 파일을 처리하도록 강제합니다.
- 방어하는 위협: 🚫악성 파일 실행 (XSS 공격 유도)
- Nginx 설정(nginx.conf)
add_header X-Content-Type-Options "nosniff" always;
- Apache 설정(httpd.conf)
LoadModule headers_module modules/mod_headers.so <IfModule mod_headers.c> Header set X-Content-Type-Options "nosniff" </IfModule>
- Set-Cookie flags
- 역할: 웹 서버가 브라우저에 쿠키를 저장할 때 보안 설정을 추가하는 것입니다. 대표적으로 Secure(HTTPS로만 쿠키 전송), HttpOnly(자바스크립트로 쿠키 접근 금지), SameSite(교차 사이트 요청 시 쿠키 전송 제한) 플래그가 있습니다.
- 방어하는 위협: 세션 ID나 개인정보가 담긴 🚫쿠키 탈취 및 XSS 공격, 🚫CSRF(사이트 간 요청 위조) 공격
- Nginx 설정(nginx.conf)
proxy_cookie_path / "/; Secure; HttpOnly; SameSite=Strict";
- Apache 설정(httpd.conf)
LoadModule headers_module modules/mod_headers.so <IfModule mod_headers.c> # 기존 쿠키 설정에 Secure, HttpOnly, SameSite 속성을 강제로 추가합니다. Header edit Set-Cookie ^(.*)$ "$1; Secure; HttpOnly; SameSite=Strict" </IfModule>
- Referrer-Policy
- 역할: 사용자가 현재 페이지의 링크를 클릭하여 다른 페이지로 이동할 때, 브라우저가 이전 페이지의 주소(Referer)를 얼마나 전송할지 제어합니다.
- 방어하는 위협: URL 경로에 포함될 수 있는 세션 ID, 개인정보, 혹은 내부 시스템 구조 정보가 외부 사이트로 흘러 들어가는 🚫정보 유출
- Nginx 설정(nginx.conf)
# strict-origin-when-cross-origin: 동일 도메인은 전체 주소를 보내지만, 외부 사이트에는 도메인(Origin)만 보냅니다. add_header Referrer-Policy "strict-origin-when-cross-origin" always;
- Apache 설정(httpd.conf)
LoadModule headers_module modules/mod_headers.so <IfModule mod_headers.c> Header set Referrer-Policy "strict-origin-when-cross-origin" </IfModule>
- Permissions-Policy
- 역할: 기존의
Feature-Policy가 이름이 바뀐 것으로, 해당 웹 페이지 및 내부 프레임에서 브라우저의 특정 기능(카메라, 마이크, 위치 정보, 지문 인식 등)에 접근할 수 있는지를 세부적으로 제어합니다. - 방어하는 위협: 악성 광고나 제3자 스크립트가 사용자의 동의 없이 하드웨어에 접근하여 정보를 빼가는 🚫개인정보 침해 및 원격 제어 취약점
- Nginx 설정(nginx.conf)
# 카메라와 마이크 기능은 사용하지 않고, 위치 정보는 본인 도메인에서만 허용하는 설정 예시입니다. add_header Permissions-Policy "camera=(), microphone=(), geolocation=('self')" always; - Apache 설정(httpd.conf)
LoadModule headers_module modules/mod_headers.so <IfModule mod_headers.c> Header set Permissions-Policy "camera=(), microphone=(), geolocation=('self')" </IfModule>
- 역할: 기존의
- X-Permitted-Cross-Domain-Policies
- 역할: 어도비 플래시(Adobe Flash)나 PDF 리더 같은 클라이언트 제품이 다른 도메인의 데이터를 요청할 때 사용할 ‘교차 도메인 정책 파일(
crossdomain.xml)’의 허용 범위를 제한합니다. (현재 플래시는 공식 서비스 종료되었으나, 레거시 시스템 보안을 위해 여전히 설정하는 경우가 있습니다.) - 방어하는 위협: 웹 브라우저가 아닌 플래시/PDF 같은 플러그인을 통한 🚫데이터 무단 가로채기 및 크로스 도메인 공격
- Nginx 설정(nginx.conf)
# master-only: 이 웹 서버의 루트에 있는 crossdomain.xml 파일만 마스터 정책 파일로 인정합니다. add_header X-Permitted-Cross-Domain-Policies "master-only" always;
- Apache 설정(httpd.conf)
LoadModule headers_module modules/mod_headers.so <IfModule mod_headers.c> Header set X-Permitted-Cross-Domain-Policies "master-only" </IfModule>
- 역할: 어도비 플래시(Adobe Flash)나 PDF 리더 같은 클라이언트 제품이 다른 도메인의 데이터를 요청할 때 사용할 ‘교차 도메인 정책 파일(
- Cross-Origin Resource Sharing (CORS)
- 역할: 기본적으로 브라우저는 보안상의 이유로 자신이 접속한 도메인이 아닌 다른 도메인(교차 출처)으로의 Ajax 요청을 차단합니다(SOP 정책).
CORS 헤더는 예외적으로 다른 도메인에서 우리 API 서버의 자원에 접근할 수 있도록 허용하는 규칙을 정의합니다. - 방어하는 위협: 무분별한 다른 도메인으로의 자원 요청을 통제하여 🚫데이터 무단 탈취 및 원치 않는 자원 사용 방지
- Nginx 설정(nginx.conf)
# 특정 외부 사이트(https://allowed-site.com)만 우리 서버에 접근할 수 있게 허용합니다. add_header Access-Control-Allow-Origin "https://allowed-site.com" always; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS" always;
- Apache 설정(httpd.conf)
LoadModule headers_module modules/mod_headers.so <IfModule mod_headers.c> Header set Access-Control-Allow-Origin "https://allowed-site.com" Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" </IfModule>
- 역할: 기본적으로 브라우저는 보안상의 이유로 자신이 접속한 도메인이 아닌 다른 도메인(교차 출처)으로의 Ajax 요청을 차단합니다(SOP 정책).
