1. 문제 배경
웹 기반 Storage 서비스에서 사용자가 파일을 끌어서(Drag), 바탕화면 또는 특정 폴더에 드롭(Drag-out)하면 그 위치에 곧바로 파일이 저장되길 원하는 요구가 존재한다.
직관적인 UX처럼 보이지만, 웹 기술·브라우저 구조·보안 모델·표준 API 범위를 고려하면 매우 복잡한 문제 영역이다.
2. 결론 요약
- 웹 브라우저에서는 Drag → OS 폴더에 직접 저장은 표준적으로 불가능
- 드래그하여 드롭한 “실제 로컬 경로(Desktop 등)”는 절대 획득할 수 없음
- DownloadURL은 Chrome만 동작하는 비표준 기능이며 서비스 품질을 보장할 수 없음
- 안정적인 다운로드 방식은 클릭/우클릭 기반
- Native 수준 Drag-out 구현은 Electron 등의 데스크톱 앱에서만 가능
3. 웹의 기본 구조(SPA)와 보안 전제
3-1. 웹(현재 작업 중인 프로그램)기반 Storage는 SPA 구조
SPA(Single Page Application)는 단일 HTML 페이지로 구성되며 React가 내부 화면을 동적 렌더링하는 구조다.
이 구조에서는 브라우저가 모든 파일 조작 권한을 제어하며, JS 코드가 OS의 파일시스템과 직접 상호작용하는 것은 원천적으로 제한된다.
3-2. 샌드박스(Sandbox) 보안 모델
브라우저는 웹 페이지를 샌드박스라는 격리 환경에서 실행한다. 악성 스크립트가 사용자의 컴퓨터 파일을 읽거나 수정하는 것을 막기 위한 장치다.
샌드박스에서 막히는 주요 행위
C:\Users\xxx\Desktop같은 실제 로컬 경로 접근- 파일 생성/쓰기 권한
- 로컬 시스템 폴더 구조 조회
- 드롭한 폴더의 경로 알아내기
즉, “Drag → OS 폴더 저장”은 보안상 고권한(high privilege) 행위이며 브라우저는 이를 허용하지 않는다.
4. 브라우저에서 공식적으로 허용되는 다운로드 방식
웹은 다운로드 시 다음 방식만 사용할 수 있다.
- <a href="..." download>
- Window.open(downloadURL)
- fetch → Blob → URL.createObjectURL → a.click()
공통 특징
- 저장 위치는 반드시 브라우저가 결정
- 기본 다운로드 폴더
- 또는 Save As 대화창
- 웹 코드가 임의로 “Desktop에 저장해라” 같은 경로 지정 불가
이 구조를 절대 벗어날 수 없기 때문에 drag-out 저장은 불가능하다.
5. DownloadURL 방식 — 비표준 Drag-out
Chrome 계열에서만 동작하는 비표준 MIME 타입: DownloadURL
e.dataTransfer.setData(
'DownloadURL',
`${mime}:${fileName}:${downloadUrl}`
);
장점
- 특정 환경에서는 drag-out 시 OS가 다운로드를 실행해주는 것처럼 보임
심각한 한계
- 표준 스펙 아님 (브라우저가 임의로 없앨 가능성 존재)
- 환경 따라 동작 완전히 다름 (일관성 없음)
- 일부 환경에서는
filename.url바로가기만 생성 - Firefox/Safari 미지원 → 멀티 브라우저 서비스 불가
- 보안 정책(DLP, Chrome Enterprise, Proxy 등)이 다운로드 자체를 차단할 수 있음
서비스 레벨(Service Quality)에서 지원하기엔 불가능에 가깝다.
6. File System Access API — 부분적 로컬 파일 접근
최근 Chrome에서 로컬 파일 접근을 허용하는 API가 등장했지만, Drag-out 시나리오에 적용할 수 없다.
가능한 기능
- 사용자가 다이얼로그로 직접 선택한 폴더에 파일 쓰기
- OPFS(Origin Private File System) 내부에 파일 생성
적용 불가 이유
- 드롭한 실제 경로를 API가 제공하지 않음
- 사용자의 사전 권한 부여가 필요 → drag-out UX와 완전히 다름
- 원격 파일을 drag-out하려면 결국 중간 저장이 필요
- 실서비스 크로스브라우저 지원이 불가능
Drag-out 저장 구현에는 구조적으로 부적합하다.
7. 왜 Dropbox / Google Drive 웹도 Drag-out을 쓰지 않는가?
대형 SaaS 서비스들도 동일한 결론에 도달했다.
- 브라우저·OS 간 행동 불일치
- 보안정책으로 인한 다운로드 차단
- 비표준 기능 기반으로는 서비스 레벨 보장 불가
- 사용자 문의 폭증 가능성
그래서 이들 서비스도 “클릭 다운로드”가 공식 UX이다.
8. 웹에서 구현 가능한 최대 기능 범위
✔ 구현 가능한 것
- 드래그 시작 시 다운로드 URL을 담아두는 정도
- 드래그 UI 제공 (시각적 효과)
- 클릭 기반, 우클릭 기반 다운로드
- “드래그 저장은 지원되지 않습니다” 안내 메시지
❌ 절대 불가능한 것
- 드롭한 위치(바탕화면·임의 폴더)의 실제 로컬 경로 획득
- OS의 특정 폴더에 직접 파일 생성
- 드롭 위치 기반으로 저장 동작 제어
- 모든 브라우저에서 일관된 drag-out 동작 보장
9. 완전한 Drag-out 저장을 가능하게 하는 방법 — Electron
Electron은 Chromium + Node.js를 기반으로 하는 데스크톱 앱 프레임워크다.
디자인은 웹 그대로 유지하면서 OS 파일시스템 권한까지 사용할 수 있다.
Electron에서 가능한 기능
- 사용자가 drag-out한 경로(바탕화면 등)에 실제 파일 생성
- Node.js로 임시 파일 생성 → native drag-out 제공
- 완전한 파일시스템 read/write
- VS Code, Slack, Discord, Notion이 사용하는 방식
웹에서는 절대로 불가능한 기능들을 Electron에서는 모두 구현할 수 있다.
10. 이 결론이 웹기반 Storage에 주는 의미
- 현재 나의 작업 프로그램 웹기반 Application(React SPA 웹 서비스)에서는 drag-out 저장 구현 자체가 불가능
- DownloadURL을 사용해도 서비스 수준의 안정성 제공 불가
- UX 요구가 있다면 “클릭 다운로드”가 유일한 정식 지원 방식
- 완전한 drag-out을 원한다면 Electron 기반 데스크톱 앱 추가가 필요
11. 핵심 요약 (5줄)
- 웹 브라우저는 보안 샌드박스 때문에 로컬 파일시스템에 직접 쓰기 불가하다.
- Drag-out으로 바탕화면·폴더에 직접 저장하는 기능은 웹 표준에서 제공되지 않는다.
- DownloadURL은 비표준이며 환경별 동작 불일치로 서비스 품질을 보장할 수 없다.
- 웹은 드롭 위치(로컬 경로)를 알 수 없으므로 동작 제어가 구조적으로 불가능하다.
- 완전한 drag-out UX는 Electron 같은 데스크톱 앱 환경에서만 가능하다.
12. 한 문장 정리
“웹에서는 Drag → OS 폴더 저장이 원천적으로 불가능하며, 이를 완전히 해결하려면 Electron 같은 데스크톱 앱이 필요하다.”

'React' 카테고리의 다른 글
| MIME 타입 완전 정리: 웹 서비스에서 왜 중요한가? (0) | 2025.11.18 |
|---|---|
| [React] React Query 사용법 | 데이터 캐싱과 리페칭 쉽게 정리 (0) | 2025.03.14 |
| [React] React와 TypeScript로 구현하는 다양한 텍스트 들여쓰기 기법 (0) | 2025.02.11 |
| [React] React 프로젝트마다 다른 버전 설치해도 괜찮을까? 완벽 정리 (0) | 2025.02.06 |
| [React] 구조 분해 할당(Destructuring Assignment) (0) | 2025.02.05 |
댓글