HTTP 응답 보안 헤더에 관하여

HTTP 응답 보안 헤더(HTTP Security Response Headers)는 웹 서버가 브라우저에게 웹사이트의 콘텐츠를 어떻게 안전하게 처리하고 렌더링해야 하는지 지시하는 일종의 ‘보안 규칙’입니다. 브라우저가 웹 페이지를 요청하면 서버는 본문(HTML)과 함께 헤더 정보를 보냅니다. 이때 보안 헤더를 적절히 설정하면, 웹 애플리케이션의 코드를 크게 수정하지 않고도 크로스 사이트 스크립팅(XSS), 클릭재킹(Clickjacking), 데이터 탈취 등 다양한 웹 공격을 브라우저 수준에서 효과적으로 차단할 수 있습니다. 주요 보안 헤더들은 각각 서로 다른 보안 위협을 방어하는 역할을 합니다. 크게 다음과 같은 핵심 헤더들이 있습니다.

  1. Content-Security-Policy (CSP)
  2. HTTP Strict-Transport-Security (HSTS)
  3. X-Frame Options
  4. X-XSS-Protection
  5. X-Content-Type-Options
  6. Set-Cookie flags
  7. Referrer Policy
  8. Permissions-Policy
  9. X-Permitted-Cross-Domain Policies
  10. Cross-Origin Resource Sharing (CORS)

  1. 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>
      
  2. 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>
      
  3. 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>
      
  4. 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>
      
  5. 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>
      
  6. 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>
      
  7. 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>
      
  8. 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>
      
  9. 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>
      
  10. 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>
      

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다