문서 작업 가이드

출시 전 마지막 응답 보안 헤더 점검하기

배포 엣지 응답을 캡처하고 시행 정책과 모니터링을 구분해 공개 출시 전 리다이렉트와 보안 헤더 동작을 확인합니다.

작성 및 검수 게시일: 검토일:

이 작업 흐름을 검증한 방법

보안 헤더 확인기로 “시행 기준선을 가진 마지막 프로덕션 HTML 응답” 샘플 입력을 정확히 재현했습니다. 결과 비교에는 “개발 서버가 아닌 배포 엣지 캡처하기”, “리다이렉트 경계를 보존하고 마지막 응답 확인하기” 단계를 포함했습니다. 이어서 연결된 테스트 근거에서 “Report-Only를 시행 CSP로 계산함”, “모든 하위 도메인 소유 없이 HSTS 옵션을 복사함” 조건을 점검했습니다.

최종 문서 응답에서 보안 헤더 7개, 누락 권장 헤더 0개, 경고 0개와 강제 적용 CSP를 확인했으며, localhost나 리디렉션 응답만으로는 같은 검사를 통과하지 못했습니다.

문제 상황

보안 헤더는 보통 한 파일이나 한 팀만 소유하지 않습니다. 애플리케이션 middleware가 CSP를 만들고 framework가 X-Content-Type-Options를 추가하며, 리버스 프록시가 Referrer-Policy를 바꾸고 CDN이 일부 호스트에만 HSTS를 붙일 수 있습니다. 그래서 로컬 페이지가 정상이어도 마지막 공개 HTML 응답에는 보호가 빠질 수 있습니다. 리다이렉트 캡처도 함정이 됩니다. 첫 301 응답은 강하지만 도착 페이지는 약할 수 있고, Report-Only는 위반을 막지 않는데도 CSP처럼 보입니다. 일반 템플릿을 복사하는 것만으로는 부족합니다. 보안 전송이 아닌 곳에서 받은 HSTS는 무시되고 includeSubDomains는 준비되지 않은 호스트를 막을 수 있으며, CSP는 필요한 리소스를 깨뜨리고 COOP나 COEP는 popup과 asset 동작을 바꿀 수 있습니다. 유효한 출시 점검은 실제 엣지 응답을 확인하고 어느 블록을 분석했는지 남기며, 존재와 시행을 구분하고, 내부 URL이나 Authorization 값을 외부에 노출하지 않으면서도 헤더 검토가 전체 애플리케이션 보안의 한 부분일 뿐임을 명확히 해야 합니다.

공식 출처와 표준

다음 공식 문서는 이 작업 흐름에서 다루는 형식과 보안 경계의 기준입니다. 도구별 실행 검증은 위에 별도로 기록합니다.

이럴 때 사용하세요

  • 공개 웹 앱, 문서 사이트, 관리자 화면, 로그인 페이지의 첫 프로덕션 출시가 다가왔을 때 사용합니다.
  • framework, middleware, CDN, load balancer, 리버스 프록시 이전으로 응답 헤더가 바뀌었을 가능성이 있을 때 사용합니다.
  • CSP를 Content-Security-Policy-Report-Only에서 시행 정책으로 전환할 때 사용합니다.
  • apex, www, 언어 경로, 리다이렉트, 오류, 인증 경로가 서로 다른 헤더를 보낼 수 있을 때 사용합니다.
  • 대상이 비공개이거나 민감해 원격 URL 스캐너 대신 로컬 붙여넣기 검토가 필요할 때 사용합니다.

단계

  1. 1단계

    출시를 대표할 응답 목록 정하기

    canonical HTML 페이지, apex와 www 호스트, 언어 경로, 로그인 또는 계정 화면, 오류 응답 하나, 리다이렉트 진입점을 적습니다. API 응답은 자체 정책 동작이 중요할 때만 넣으세요. 문서 전용 헤더를 모든 JSON이나 이미지 응답에 요구할 필요는 없습니다.

  2. 2단계

    개발 서버가 아닌 배포 엣지 캡처하기

    `curl -I https://example.com/path`를 실행하거나 브라우저 DevTools에서 응답 헤더를 복사합니다. CDN과 프록시를 지난 뒤 사용자가 받는 응답을 캡처하세요. 인증이 필요하면 승인된 로컬 명령이나 DevTools를 사용하고, 증거를 저장하거나 공유하기 전에 Cookie, Authorization, Set-Cookie, token, 내부 주소, request ID를 제거합니다.

  3. 3단계

    리다이렉트 경계를 보존하고 마지막 응답 확인하기

    `curl -IL`을 쓸 때 블록 경계와 상태 줄을 유지합니다. 체인을 보안 헤더 확인기에 붙여넣고 표시된 분석 블록이 마지막 응답인지 확인하세요. RFC 6797 HSTS는 보안 전송으로 받은 경우에만 유효하므로 앞선 HTTP-to-HTTPS 리다이렉트도 별도로 봅니다.

  4. 4단계

    표현 차이보다 시행 누락부터 해결하기

    HSTS max-age=0, 비었거나 효력이 없는 시행 CSP, 영향이 큰 unsafe CSP source, nosniff 누락, 문서 프레임 보호 누락 순으로 고위험과 경고를 처리합니다. Content-Security-Policy-Report-Only는 보호가 아니라 관찰로 취급하고 반복된 단일값 헤더가 여러 배포 계층에서 주입되는지 확인합니다.

  5. 5단계

    집중 분석기로 정책 세부 내용 확인하기

    directive, nonce, hash, source expression, 중복 directive는 CSP Header Analyzer에서 봅니다. 모든 hop, 비밀값 마스킹, 잘못된 줄, 중복 분류가 필요하면 보안 개요 대신 HTTP Header Parser를 함께 사용합니다.

  6. 6단계

    헤더 변경 뒤 실제 동작 시험하기

    실제 경로를 다시 열고 로그인, 인가 실패, form, upload, download, embed, popup, worker, font, analytics 동의, 제3자 asset을 실행합니다. CSP report와 브라우저 console도 확인하세요. 필요한 기능을 깨뜨리는 강한 헤더는 완료된 배포가 아닙니다.

  7. 7단계

    기록하고 프로덕션에서 같은 점검 반복하기

    비밀정보를 제거한 보고서에 release commit, 시각, host, path, status, 담당 배포 계층을 기록합니다. 프로덕션이 안정된 뒤 같은 행렬을 다시 실행하고 의존성 검토, 인증과 인가, session, TLS, 위협별 테스트는 별도 출시 게이트로 유지합니다.

예시

시행 기준선을 가진 마지막 프로덕션 HTML 응답

입력

HTTP/2 200
content-type: text/html; charset=utf-8
strict-transport-security: max-age=63072000; includeSubDomains
content-security-policy: default-src 'self'; object-src 'none'; frame-ancestors 'none'
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
cross-origin-opener-policy: same-origin
cross-origin-embedder-policy: require-corp

출력

마지막 응답 블록: 1
응답 종류: 문서
감지된 보안 헤더: 7
누락된 권장 헤더: 0
경고: 0
고위험: 0
시행 CSP와 완성된 COOP/COEP 격리 쌍이 있습니다.

흔한 실수

공개 엣지 대신 localhost를 캡처함

로컬 middleware만으로 CDN, 프록시, cache, hosting platform이 보내는 값을 증명할 수 없습니다. 배포 호스트와 중요한 대체 경로를 직접 캡처하세요.

Report-Only를 시행 CSP로 계산함

Report-Only는 전환 중 관찰에 유용하지만 위반 리소스나 frame-ancestors를 시행하지 않습니다. Content-Security-Policy로 옮기는 단계를 명시적으로 남기세요.

모든 하위 도메인 소유 없이 HSTS 옵션을 복사함

긴 max-age와 includeSubDomains는 오래 지속되는 브라우저 동작을 만듭니다. HTTPS 범위, 인증서 자동화, 복구 담당자, 하위 도메인 목록을 확인한 뒤 배포하세요.

첫 리다이렉트 블록만 확인함

강한 301 응답이 약한 도착 페이지를 보호하지는 않습니다. 마지막 응답을 확인하고 HTTP-to-HTTPS 리다이렉트, 대체 호스트, 오류 경로를 별도로 검증하세요.

헤더 보고서에서 점검을 끝냄

깨끗한 헤더 개요로 잘못된 인가, 안전하지 않은 session, 취약한 의존성, 서버 결함, 비즈니스 로직 악용을 찾을 수 없습니다. 이 테스트를 명시적으로 유지하세요.

자주 묻는 질문

비공개 staging URL을 도구에 붙여넣어야 하나요?

URL은 필요하지 않습니다. 직접 헤더를 캡처하고 민감한 값을 제거한 블록만 붙여넣으세요. 확인기는 로컬에서 실행되며 대상에 로그인하거나 요청하거나 스캔하지 않습니다.

왜 리다이렉트 상태 줄을 유지하나요?

상태 줄이 응답 경계를 보존해 마지막 응답을 식별할 수 있습니다. HTTP-to-HTTPS 리다이렉트와 도착 페이지를 따로 검토하는 데도 필요합니다.

Content-Security-Policy-Report-Only만으로 출시해도 되나요?

전환 중에는 유용하지만 관찰만 합니다. CSP 보호를 출시 기준으로 삼는다면 테스트를 마친 Content-Security-Policy 시행 헤더가 필요합니다.

모든 사이트에 COOP, COEP, CORP를 추가해야 하나요?

아니요. COOP와 COEP는 교차 출처 격리가 필요한 경우에 쓰며 popup이나 제3자 asset에 영향을 줄 수 있습니다. CORP는 리소스 정책입니다. 구조상 이유와 테스트가 있을 때만 추가하세요.

왜 반복 CSP는 허용하고 반복 HSTS는 경고하나요?

CSP는 여러 시행 정책을 누적 제한으로 정의합니다. RFC 6797은 한 HSTS 필드를 보내도록 요구하고 user agent는 반복됐을 때 첫 필드만 처리합니다.

깨끗한 헤더 보고서와 함께 무엇을 확인해야 하나요?

실제 경로, TLS와 리다이렉트, CSP 동작, 의존성, 인증과 인가, session 제어, 서비스에 해당하는 위협 테스트를 함께 유지하세요.