웹 애플리케이션 보안 헤더: 완전 설정 가이드
파일 전송 웹 앱에 필수 보안 헤더를 구성하세요. CSP, HSTS, X-Frame-Options 등으로 일반적인 웹 공격을 방어하세요.
보안 헤더는 브라우저에게 페이지 동작 방식을 제한하도록 지시하는 HTTP 응답 필드입니다. 클라이언트 사이드 AES-256-GCM 암호화를 수행하는 파일 전송 앱에서 핵심적인 헤더는 여섯 가지입니다. HTTPS를 강제하는 Strict-Transport-Security, 스크립트 삽입을 차단하는 Content-Security-Policy, 클릭재킹을 방지하는 X-Frame-Options, URL 프래그먼트 유출을 막는 Referrer-Policy, 미사용 브라우저 API를 비활성화하는 Permissions-Policy, 그리고 브라우징 컨텍스트를 격리하는 Cross-Origin-Opener-Policy입니다. 이 여섯 가지를 올바르게 설정하면 JavaScript 한 줄 변경 없이 실용적인 클라이언트 사이드 공격의 80%를 차단합니다.
HSTS와 프리로드 목록
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload는 브라우저에게 앞으로 2년간 평문 HTTP로 절대 연결하지 말라고 지시합니다. preload 지시어는 Chrome의 HSTS 프리로드 목록(hstspreload.org) 등재 자격을 부여하며, 이 목록은 브라우저에 내장됩니다. 도메인으로의 첫 번째 요청조차 HTTPS로 이루어져 초기 MITM 창을 없앱니다. 제출은 일방통행이며 제거에는 수개월이 걸립니다. 먼저 며칠간 max-age=300으로 테스트하십시오. HSTS 프리로드 없는 파일 전송 서비스는 DNS 하이재킹 한 번으로 가짜 업로드 폼을 서빙할 수 있습니다.
실제로 작동하는 Content Security Policy
CSP는 배포하기 가장 어렵고 가장 가치 있는 헤더입니다. 파일 전송 앱의 엄격한 정책 예시입니다: default-src 'none'; script-src 'self' 'wasm-unsafe-eval'; connect-src 'self' https://upload.hexatransfer.com; style-src 'self'; img-src 'self' data:; font-src 'self'; frame-ancestors 'none'; base-uri 'none'; form-action 'self'. 인라인 스크립트 없음, wasm 외 eval 없음, 제3자 연결 없음. 인라인 이벤트 핸들러는 외부 파일의 addEventListener로 이전하십시오. 'wasm-unsafe-eval'은 libsodium.js에 필요합니다. 이것 없이는 Argon2id가 인스턴스화되지 않습니다.
모든 번들에 Subresource Integrity 적용
JavaScript가 jsDelivr나 unpkg 같은 CDN에서 로드된다면 모든 스크립트 태그에 integrity="sha384-..." 속성을 추가하십시오. 브라우저는 해시가 일치하지 않는 스크립트 실행을 거부합니다. 침해된 CDN이 조용히 백도어 번들을 전송할 수 없습니다. 자체 도메인에서 제공하는 자체 호스팅 스크립트의 경우 SRI의 중요도는 낮지만 여전히 방어적입니다. SRI를 빌드 파이프라인으로 강제하십시오. HexaTransfer는 릴리스별 해시를 게시하므로 의심스러운 사용자가 수동으로 검증할 수 있습니다.
X-Frame-Options와 frame-ancestors
클릭재킹 공격은 다른 페이지 위에 투명한 iframe으로 업로드 페이지를 로드하여 사용자가 의도하지 않은 파일을 공유하도록 속입니다. X-Frame-Options: DENY는 모든 프레이밍을 차단하며, 현대적 대안은 Content-Security-Policy: frame-ancestors 'none'입니다. 구형 브라우저는 레거시 헤더만 인식하고 신형 브라우저는 CSP를 선호하므로 둘 다 제공하십시오. 파일 전송 앱에는 절대 SAMEORIGIN을 사용하지 마십시오. 다른 페이지에서 업로드 UI를 프레임할 정당한 이유가 없습니다.
Referrer-Policy로 프래그먼트 유출 방지
브라우저는 Referer 헤더에서 URL 프래그먼트(복호화 키가 있는 #key=... 부분)를 기본적으로 제거하지만 경로 부분은 여전히 유출됩니다. Referrer-Policy: no-referrer는 모든 참조자 정보를 차단합니다. 아웃바운드 링크에 Referer 헤더가 없고, 외부 추적기가 URL을 핑거프린팅할 수 없습니다. /d/7Kj9xQmN2vP8rBwLsE4fT#k=abc의 다운로드 페이지에서 사용자가 클릭해서 이동하는 외부 도메인에 슬러그가 유출되지 않습니다. 헤더로 사이트 전체에 설정하고 링크별 rel="noreferrer"에 의존하지 마십시오.
Permissions-Policy: 심층 방어
앱이 카메라, 마이크, 위치 정보, USB API를 사용하지 않는다면 명시적으로 거부하십시오: Permissions-Policy: camera=(), microphone=(), geolocation=(), usb=(), bluetooth=(), accelerometer=(), magnetometer=(), gyroscope=(), payment=(). CSP를 뚫은 XSS도 웹캠을 켜서 사용자 얼굴을 녹화할 수 없습니다. 이 헤더는 배포하기 저렴하고 파일 전송 워크플로에 UX 영향이 없으며, 보안 검토자에게 샌드박싱을 고려했음을 알립니다.
교차 출처 격리 헤더
고해상도 타이머와 SharedArrayBuffer(일부 wasm 암호화 구현에 필요)에 접근하려면 Cross-Origin-Opener-Policy: same-origin 및 Cross-Origin-Embedder-Policy: require-corp를 통한 교차 출처 격리가 필요합니다. 이 헤더들은 AES 키를 인접 출처에서 유출할 수 있는 Spectre 유형의 사이드 채널 공격도 방지합니다. 단점은 내장된 제3자 리소스(YouTube 동영상, 결제 창)가 Cross-Origin-Resource-Policy: cross-origin을 제공하지 않으면 중단된다는 것입니다. 제3자 임베드가 없는 단일 목적 파일 전송 앱에서 격리는 무료입니다.
Cache-Control과 민감 페이지
다운로드 확인 페이지는 단기 복호화 키나 세션 토큰을 표시할 수 있습니다. 캐싱을 방지하십시오: Cache-Control: no-store, must-revalidate와 Pragma: no-cache. no-cache만으로는 충분하지 않습니다. 이것은 원본 서버에 대한 재검증을 허용하므로 캐싱이 여전히 발생합니다. 업로드 페이지의 JavaScript 번들에는 반대가 적용됩니다. 콘텐츠 해시된 파일명(/js/main-a7b3c9.js)으로 긴 max-age를 설정하면 무효화 없이 CDN 캐싱이 작동합니다.
X-Content-Type-Options와 CSP 보고
X-Content-Type-Options: nosniff는 브라우저가 내용을 기반으로 MIME 유형을 추측하는 것을 막습니다. 이것 없이는 <script>를 포함하는 공격자가 업로드한 .txt 파일이 다시 제공될 때 HTML로 렌더링될 수 있습니다. CSP는 report-only 모드로 먼저 배포하고, 일주일간 report-uri 엔드포인트에서 위반 사항을 수집한 뒤, 정당한 문제를 수정하고 나서 적용하십시오. Content-Security-Policy-Report-Only로 관찰하고 Content-Security-Policy로 전환합니다. Report URI나 자체 호스팅 Sentry로 보고서를 주간 단위로 검토하십시오. securityheaders.com과 Mozilla Observatory에서 프로덕션 URL을 실행해 등급을 확인하십시오. 대부분의 경쟁 서비스가 B 이하를 기록하는 이유는 Permissions-Policy를 빠뜨리거나 CSP에서 'unsafe-inline'을 허용하기 때문입니다.
hexatransfer.com에서 사용해 보세요 — 무료, 계정 불필요, 최대 10GB.
엔드투엔드 암호화로 대용량 파일을 안전하게 전송
엔드투엔드 암호화로 최대 10GB의 파일을 무료로 전송하세요. 계정이 필요하지 않습니다. 업로드 전에 브라우저에서 파일이 암호화되어 다른 사람은 읽을 수 없습니다.
파일 보내기