プロダクト開発中
24H Space
24時間を基本単位とする一時共有型ファイルスペース。Cloudflare の Workers・R2・D1 を利用し、モバイル中心で大容量ファイルの期限付き共有を扱います。
課題
写真や動画などの大きなファイルを一時的に渡したいとき、恒久的なクラウドストレージに置き続けるのは管理の負担やリスクになります。 必要な期間だけ共有し、期限が来たら確実に消える仕組みが求められます。
何を作っているか
24時間を基本単位とした、一時共有型のファイルスペースです。スマートフォンからの利用を中心に設計しています。 結婚式や旅行の写真集め、パソコンとの受け渡し、ペアリングした相手への直接送信に使えます。
技術的アプローチ
- ファイルの通り道を用途で分ける:共有スペースへのアップロードは、サーバー(Cloudflare Workers)が認証・権限・容量を確かめながら受け取り、ストレージ(Cloudflare R2)へ書き込みます。ダウンロードと、ペアリングした端末への送信・大容量リンクでは、サーバーが短時間だけ有効な署名付きURLを発行し、端末とストレージのあいだで直接やりとりします。ストレージの鍵は、サーバーだけが持ちます。
- 大容量を、止まっても続きから:大きなファイルは分割して送り、途中で通信が切れても、送り終えた部分から再開できます。ペアリングした端末への送信では、分割した部分を4つずつ同時に送ります。複数ファイルの受信は同時に3件までにして、端末のメモリや通信を圧迫しないようにしています。
- 受け取ったものを確かめる:ペアリングした端末への送信では、受信側で内容の SHA-256 とサイズを計算し、送信元の値と一致しなければ失敗として扱います。
- 近距離の直接送信:近くにある端末どうしで、インターネットを経由せずに送る方式(Android・iOS それぞれの近距離通信)を研究しています。つながらないときは、通常の送信方法に切り替えます。
セキュリティの考え方
- ストレージは非公開で、ダウンロード用のURLは「ダウンロードする」と操作したときにだけ、短い有効期限つきで発行します。共有の期限を過ぎて使えるURLは発行しません。
- 共有スペースで受け付けるのは写真・動画だけです。アップロード後、サーバーがファイル先頭の中身(JPEG・PNG・WebP の識別バイト、HEIF・MP4・MOV の形式名)を拡張子と照合し、確認が終わるまでは配布しません。これは形式の確認で、ウイルス検査ではありません。
- 共有リンクの鍵はサーバーにハッシュ化して保存し、元の値は保存しません。
- アプリからの通信は Firebase の認証と App Check で確かめ、ストレージの鍵をアプリに持たせません。
- 期限が来たスペースのファイルは、サーバー側の定期処理(Cron)で消去します。
現在の状態
開発中です。近距離の直接送信など、機能の一部は研究・検証の段階にあります。
今後
公開に向けて、安全性と使いやすさ、転送速度の実測による改善を進めます。
つかっている技術
- Cloudflare Workers
- R2
- D1
- Android
- Kotlin
- iOS
- Swift
- SwiftUI


