안전한 링크 공유 모범 사례: 다운로드 URL 보호
안전한 다운로드 링크 공유 모범 사례. URL 토큰 보안, 링크 만료, 다운로드 제한.
안전한 다운로드 링크는 URL 자체를 키의 일부로 취급합니다. 슬래시 뒤의 슬러그는 최소 128비트 엔트로피(예: hexatransfer.com/d/7Kj9xQmN2vP8rBwLsE4fT)를 가져야 하고, 며칠이 아닌 몇 시간 안에 만료되어야 하며, 다운로드를 한두 번으로 제한하고, 결정적으로 유일한 비밀이어서는 안 됩니다. URL 프래그먼트(# 뒤)에 위치해 서버 로그에 도달하지 않는 비밀번호 파생 AES-256-GCM 키와 함께 사용하면 Slack 미리보기부터 기업 프록시 아카이브까지 가장 일반적인 링크 유출 벡터를 막을 수 있습니다.
엔트로피: 추측 가능성의 수학
문자와 숫자로 이루어진 6자 슬러그는 36^6 = 21억 가지 조합을 가집니다. 봇넷이 CDN에 초당 100,000개의 URL을 테스트할 수 있다는 것을 알기 전까지는 많아 보입니다. 즉, 인증되지 않은 공격자가 약 6시간 안에 전체 공간을 열거할 수 있습니다. 128비트(base64url 22자)로 늘리면 추측 시간이 우주의 열적 죽음을 초과합니다. crypto.getRandomValues()를 사용하고, 절대 Math.random()을 사용하지 마세요. 데이터베이스 ID를 인코딩하는 것도 금물입니다. 순차 토큰은 일주일 간격으로 두 샘플을 수집하는 누구에게나 전송량을 노출합니다.
키를 경로가 아닌 프래그먼트에 넣기
URL에서 # 뒤의 모든 것은 프래그먼트 식별자입니다. 브라우저는 이것을 서버에 전송하지 않습니다. 복호화 키를 거기에 저장하는 것은 Firefox Send가 개척한 패턴입니다: /#k=abc123xyz. 서버는 불투명한 다운로드 슬러그만 볼 뿐이므로 액세스 로그, SIEM 내보내기, 침해 덤프에 키 자료가 포함되지 않습니다. CDN 엣지 캐시도 페이로드를 복호화할 수 없습니다. Slack 언펄이 URL을 프로빙할 때 프래그먼트를 삭제하므로 미리보기 봇은 절대 키를 볼 수 없습니다. 이 단 하나의 방법이 실용적인 링크 가로채기 공격의 80%를 차단합니다.
위협에 맞는 만료 기간
기본 7일 만료는 대부분의 사용 사례에 너무 관대합니다. 워크플로우에 맞게 조정하세요: 은행으로 보내는 전신 송금 .pdf는 15분, 계약 검토는 4시간, 사진 앨범은 24시간, 비동기 국제 협업에만 7일. 만료를 서명된 URL 페이로드의 절대 UTC 타임스탬프로 표현하고 서버 측에서 적용하세요. 클라이언트 측 시계를 절대 신뢰하지 마세요. 만료 시 NVMe의 blkdiscard를 통해 이상적으로는 디스크의 암호문을 0으로 덮어씌워 이후 디스크 포렌식이 아무것도 찾지 못하게 하세요.
실제로 작동하는 다운로드 카운터
단일 다운로드 링크는 브라우저가 부분 전송을 공격적으로 재시도한다는 것을 깨닫기 전까지 완벽해 보입니다. Chrome이 80%에서 끊기고 새 Range 요청으로 재개하면 두 번의 다운로드로 계산될까요? 카운터를 HTTP 요청이 아닌 파일 완료 경계에서 구현하세요. 최종 바이트가 전송되고 인증 태그가 검증될 때만 증가시키세요. 또는 10분 윈도우에서 고유 세션 ID를 추적하세요: Range 요청이 몇 번 발생하든 하나의 세션 = 하나의 다운로드. WeTransfer는 이것을 혼동해 링크가 잘못 소모된 것으로 표시한다는 비판을 받았습니다.
단기 토큰을 사용한 서명된 URL
엔터프라이즈 흐름의 경우 HMAC-SHA256 서명(슬러그, 만료, 최대 다운로드 수, 발급자 ID 포함)으로 다운로드 URL을 래핑하세요. 서버는 바이트를 제공하기 전에 서명을 검증합니다. S3 사전 서명 URL은 이것을 기본적으로 수행합니다; R2와 Backblaze B2도 같은 패턴을 따릅니다. Slack으로 유출된 서명된 URL은 여전히 위험하지만 짧은 만료(예: 5분)가 피해를 제한합니다. IP 바인딩을 함께 사용하면 서명에 예상 /24 접두사가 포함되어 지역 간 링크 전달을 막을 수 있습니다.
리퍼러 및 미리보기 유출 방지
다운로드 페이지에 Referrer-Policy: no-referrer를 설정하지 않으면 브라우저는 외부 링크를 클릭할 때 Referer 헤더에 전체 URL(프래그먼트 제외)을 전송합니다. 이 헤더 없이는 다운로드 페이지에서 외부 링크를 클릭하면 목적지의 모든 트래커에 슬러그가 노출됩니다. Googlebot이 포럼에 실수로 붙여넣어진 링크를 보관하지 못하도록 X-Robots-Tag: noindex, nofollow와 /d/를 차단하는 robots.txt도 설정하세요. Slack 및 Teams 미리보기의 경우, 언펄 봇에 해당하는 User-Agent에 204 No Content를 반환하세요.
전달 제어와 수신자 바인딩
Alice가 Bob에게 링크를 보내면 Bob은 누구에게든 전달할 수 있습니다. 이를 방지하려면 링크를 Bob의 신원에 바인딩하세요. 강도 순 옵션: 이메일 인증(bob@firm.com으로 일회용 토큰), SMS 인증(+1-415 번호로 OTP), 첫 방문 시 패스키 등록, 또는 Bob의 Google Workspace를 통한 OIDC 로그인. 각 단계는 마찰을 대가로 억제력을 얻습니다. GDPR 제15조 정보주체 접근 응답에는 이메일 인증이 대개 충분합니다. GDPR 및 PIPA(개인정보 보호법)가 모두 적용되는 규제 환경에서 HIPAA 적용 실험실 결과에는 패스키 또는 OIDC가 적합합니다.
즉시 취소하기
모든 가드가 있어도 문제가 생길 수 있습니다. 노트북 도난, 계약 종료, 잘못된 수신자. 링크를 즉시 무력화하는 취소 버튼이 중요합니다. 구현: 모든 다운로드에서 확인되는 슬러그 해시 기반 취소 목록을 유지하세요. Cloudflare의 /zones/:id/purge_cache를 통해 60초 내에 CDN 엣지로 전파하세요. HexaTransfer는 발신자 대시보드를 통해 취소를 제공합니다. Dropbox Transfer와 Smash도 지원하지만 추가 비용이 듭니다. 사고 중 작동하지 않는 버튼은 버튼이 없는 것보다 나쁩니다.
감시 없는 텔레메트리
남용을 감지하기에 충분한 정보(IP 해시, User-Agent 계열, 타임스탬프, 제공된 바이트)를 기록하되 수신자 신원을 재구성할 수 있는 정보는 기록하지 마세요. IP를 일일 교체 키로 해시하면 상관관계 기간이 짧게 유지됩니다. URL 프래그먼트는 절대 기록하지 마세요. 30일 보존 기간은 감시 아카이브를 만들지 않으면서 SOC 2 공통 기준 7.2를 충족합니다. 발신자에게 대시보드에서 남용 카운터를 노출해 "AS15169에서 비밀번호 시도 3회 실패"를 확인하고 취소할 수 있게 하세요.
hexatransfer.com에서 사용해 보세요 — 무료, 계정 불필요, 최대 10GB.
엔드투엔드 암호화로 대용량 파일을 안전하게 전송
엔드투엔드 암호화로 최대 10GB의 파일을 무료로 전송하세요. 계정이 필요하지 않습니다. 업로드 전에 브라우저에서 파일이 암호화되어 다른 사람은 읽을 수 없습니다.
파일 보내기