아키텍처
디렉토리 구조
con24_cloudflare/
├── src/
│ ├── js/ # JavaScript Worker (메인)
│ │ ├── index.js # 워커 진입점
│ │ ├── config.js # 설정 (CORS, 임계값, 상수)
│ │ ├── auth.js # HMAC 토큰 검증
│ │ ├── utils.js # 유틸리티 (키 검증, 파일 추출)
│ │ ├── multipart.js # 스트리밍 멀티파트 업로드
│ │ └── handlers/
│ │ ├── put.js # PUT - 파일 업로드
│ │ ├── get.js # GET - 파일 다운로드
│ │ ├── delete.js # DELETE - 파일 삭제
│ │ └── post.js # POST - 토큰 검증
│ └── python/ # Python 참고 구현
│ ├── index.py
│ ├── config.py
│ ├── auth.py
│ ├── utils.py
│ └── handlers/
├── test/
│ └── index.spec.js # Vitest 테스트
├── wrangler.jsonc # Cloudflare Worker 설정
├── package.json
└── vitest.config.js
요청 처리 흐름
클라이언트 요청
│
├─ OPTIONS → CORS Preflight 응답 (토큰 불필요)
│
└─ 기타 메서드
│
├─ Authorization 헤더 확인
│ └─ 없으면: 401 "Missing token"
│
├─ 토큰 검증 (auth.js)
│ ├─ Base64URL 디코딩 → JSON 파싱
│ ├─ 필수 필드 확인 (sig, key, exp)
│ ├─ HMAC-SHA256 서명 검증 (상수 시간 비교)
│ └─ 만료 시간 확인
│
├─ CORS 헤더 설정
│
└─ 메서드별 핸들러 분기
├─ PUT → handlePut()
│ ├─ < 10MB: 단일 업로드
│ └─ ≥ 10MB: 멀티파트 업로드
│ └─ → Firebase 알림 (실패 시 R2 롤백)
├─ GET → handleGet()
├─ DELETE → handleDelete()
└─ POST → handlePost()
CORS 설정
허용 Origin
| Origin |
|---|
https://con24.co.kr |
https://niyang.co.kr |
https://kdid-con24.niyang.co.kr |
허용 메서드
GET, PUT, DELETE, OPTIONS, POST
허용 헤더
Content-Type, Authorization, x-filename
CORS 응답 헤더
Access-Control-Allow-Origin: <요청 origin>
Access-Control-Allow-Methods: GET, PUT, DELETE, OPTIONS, POST
Access-Control-Allow-Headers: Content-Type, Authorization, x-filename
Vary: Origin
Note
Access-Control-Allow-Origin은 와일드카드가 아닌 요청 origin을 그대로 반환합니다. 허용 목록에 없는 origin에서는 CORS 헤더가 포함되지 않습니다.
설정값
파일 크기 검증 (config.js)
| 상수 | 값 | 설명 |
|---|---|---|
FILE_SIZE_TOLERANCE_BYTES |
1,024 (1KB) | 파일 크기 오차 허용 절대값 |
FILE_SIZE_TOLERANCE_PERCENT |
0.01 (1%) | 파일 크기 오차 허용 상대값 |
실제 허용 오차: max(1KB, 예상 크기 × 1%)
멀티파트 업로드 (config.js)
| 상수 | 값 | 설명 |
|---|---|---|
MULTIPART_THRESHOLD |
10MB | 멀티파트 업로드 자동 분기 기준 |
MULTIPART_CHUNK_SIZE |
10MB | 파트당 청크 크기 |
외부 연동
| 항목 | 값 |
|---|---|
| Firebase 엔드포인트 | https://asia-northeast3-construction24-test.cloudfunctions.net/upload_report |
| R2 버킷 | con24-mysite |