docs: add scalability and commercial service roadmap to README
Document concurrent flash architecture (client-side Web Serial), bandwidth-based concurrency estimates, current MVP limitations, and phased roadmap for commercial deployment including HTTPS, auth, rate limiting, DB migration, S3 storage, and license model. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
85
README.md
85
README.md
@@ -193,11 +193,94 @@ curl -X POST http://localhost:3100/api/firmware/upload \
|
||||
|
||||
## 보안 고려사항
|
||||
|
||||
- 파일 업로드는 `.bin` 확장자 및 8 MB 크기 제한
|
||||
- 파일 업로드는 `.bin` 확장자 및 32 MB 크기 제한
|
||||
- XSS 방지를 위한 HTML 이스케이프 처리
|
||||
- 외부 배포 시 HTTPS 적용 필수
|
||||
- ESP32 Flash Encryption 활성화 권장 (펌웨어 덤프 방지)
|
||||
|
||||
---
|
||||
|
||||
## 동시 접속 및 상업 서비스 확장성
|
||||
|
||||
### 아키텍처 특성 — 서버는 플래싱에 관여하지 않음
|
||||
|
||||
플래싱은 **브라우저가 Web Serial API를 통해 USB로 직접** 처리합니다.
|
||||
서버는 manifest JSON과 펌웨어 .bin 파일을 제공하는 역할만 담당합니다.
|
||||
|
||||
```
|
||||
사용자 브라우저 → 서버에서 manifest + .bin 다운로드 (수초)
|
||||
사용자 브라우저 → USB → ESP32 (플래싱, 서버 무관)
|
||||
```
|
||||
|
||||
### 병목 지점 분석
|
||||
|
||||
| 구분 | 서버 부하 | 한계 |
|
||||
|------|---------|------|
|
||||
| HTML/JS/CSS 서빙 | Nginx — 매우 가벼움 | 수천 명 동시 가능 |
|
||||
| Manifest JSON | ~1 KB, 순간적 | 수천 건/초 |
|
||||
| **펌웨어 .bin 다운로드** | **← 실질 병목** | 네트워크 대역폭 |
|
||||
| 플래시 실행 | 서버 무관 (브라우저-USB) | 무제한 |
|
||||
|
||||
### 대역폭 기준 동시 플래시 추정
|
||||
|
||||
```
|
||||
merged.bin 16 MB 기준 (다운로드 시간 ~수초):
|
||||
|
||||
내부망 (1 Gbps) : 125 MB/s ÷ 16 MB ≈ 동시 7~8명 다운로드
|
||||
다운로드는 수초면 끝나므로 실질 50~100명 처리 가능
|
||||
인터넷 (100 Mbps 업로드): 12.5 MB/s ÷ 16 MB ≈ 동시 1명 한계
|
||||
인터넷 (1 Gbps 업로드) : 125 MB/s ÷ 16 MB ≈ 동시 7~8명
|
||||
|
||||
app.bin 단독 (~1 MB) 사용 시 약 16배 여유
|
||||
```
|
||||
|
||||
### 현재 구조의 한계 (MVP 수준)
|
||||
|
||||
| 항목 | 현재 상태 | 문제점 |
|
||||
|------|---------|------|
|
||||
| 메타데이터 | `_metadata.json` 파일 | 동시 쓰기 시 데이터 손상 위험 |
|
||||
| 인증 | 없음 | 누구나 업로드·삭제 가능 |
|
||||
| HTTPS | 없음 | 외부망에서 Web Serial API 불가 |
|
||||
| 펌웨어 저장 | 로컬 Docker 볼륨 | 서버 장애 시 소실 가능 |
|
||||
| Rate Limiting | 없음 | 무차별 다운로드 가능 |
|
||||
|
||||
### 상업 서비스 전환 로드맵
|
||||
|
||||
#### 단기 — 필수 적용
|
||||
|
||||
1. **HTTPS 적용** — 외부 접속 시 Web Serial API 동작 필수 조건
|
||||
2. **인증 추가** — 구매자에게만 플래시 토큰 발급
|
||||
3. **Rate Limiting** — IP당 다운로드 횟수 제한 (nginx `limit_req`)
|
||||
|
||||
#### 중기 — 확장성 확보
|
||||
|
||||
4. **메타데이터 DB화** — JSON 파일 → SQLite 또는 PostgreSQL
|
||||
5. **펌웨어 스토리지** — 로컬 볼륨 → S3 호환 오브젝트 스토리지 (CDN 연동 가능)
|
||||
6. **플래시 이력 로깅** — 판매 증거, 환불 분쟁 대응용
|
||||
|
||||
#### 장기 — 라이선스 모델
|
||||
|
||||
7. **1회용 플래시 토큰** — 구매 1건 = 플래시 1회
|
||||
8. **MAC 주소 바인딩** — 기기별 라이선스 잠금 (`esp_efuse_mac_get_default()`)
|
||||
9. **결제 연동** — Stripe / 토스페이먼츠
|
||||
|
||||
#### 권장 최종 아키텍처
|
||||
|
||||
```
|
||||
[결제] → [라이선스 서버] → 1회용 토큰 발급
|
||||
↓
|
||||
[웹 플래셔] → Web Serial → ESP32
|
||||
↓
|
||||
[플래시 로그] → MAC 바인딩 → 라이선스 활성화
|
||||
```
|
||||
|
||||
### 결론
|
||||
|
||||
> 현재 구조(내부망)로는 **50~100명 동시** 처리 무리 없음.
|
||||
> 인터넷 상업 서비스는 **HTTPS + 인증 + 스토리지 개선** 3가지 선행 후 운영 권장.
|
||||
|
||||
---
|
||||
|
||||
## 라이선스
|
||||
|
||||
MIT
|
||||
|
||||
Reference in New Issue
Block a user