Lewati ke konten utama
menjadi.dev
Chapter 40.2 Data & Storage Lanjutan

Multipart Upload & S3 Presigned URLs

Mengupload file besar dengan aman — tanpa membebani server application

Tujuan Pembelajaran

  • Mampu mengimplementasikan presigned URL untuk direct upload ke S3/R2
  • Mampu menangani multipart upload untuk file >100MB
  • Memahami keamanan presigned URLs: expiration, scope, access control

Analogi

Diagram

      Presigned URL = Tiket Masuk Terbatas:

Tanpa presigned URL:
Semua orang bisa masuk ke S3 bucket → upload file sembarangan → chaos

Dengan presigned URL:
Server generate tiket masuk dengan:
- Expiry: 5 menit (tidak bisa dipakai nanti)
- Scope: hanya file 'user-123/photo.jpg' (tidak bisa upload ke tempat lain)
- Permission: hanya PUT (tidak bisa DELETE, GET)

Client pakai tiket untuk upload langsung → tidak perlu lewat server.
    

Presigned URL seperti tiket masuk terbatas — waktu terbatas, lokasi spesifik, permission terbatas.

Penjelasan Konsep

Presigned URL memungkinkan client upload langsung ke object storage (S3, R2) tanpa lewat server — mengurangi beban server dan mempercepat upload.

Flow: (1) Client request presigned URL dari server (dengan filename, size, type). (2) Server validasi request (apakah user authorized? size dalam limit?). (3) Server generate presigned URL dengan expiry singkat (5-15 menit). (4) Client gunakan URL untuk PUT file langsung ke S3. (5) (Opsional) Client notify server setelah upload selesai.

Multipart Upload: Untuk file besar (>100MB), upload dipecah menjadi parts (5MB-5GB per part). Kelebihan: (1) Parallel upload — parts bisa di-upload bersamaan (lebih cepat). (2) Resumable — kalau gagal di tengah, retry hanya part yang gagal. (3) Progress tracking — bisa track per part.

Security presigned URL: (1) Short expiry (5-15 menit). Jangan 1 jam — attacker bisa brute-force URL. (2) Scope spesifik — satu URL hanya untuk satu file path. (3) Permission minimal — PUT only, jangan kasih DELETE atau GET. (4) Content-Type restriction — tetapkan content type di URL. (5) Size limit — gunakan S3 bucket policy untuk batasi max upload size.

Inti yang Perlu Dipahami

Bagian ini berfokus pada mampu mengimplementasikan presigned URL untuk direct upload ke S3/R2., mampu menangani multipart upload untuk file >100MB., dan memahami keamanan presigned URLs: expiration, scope, access control. Jangan terburu-buru menghafal istilahnya. Lebih penting untuk memahami peran setiap konsep dan kapan konsep itu muncul dalam pekerjaan web development.

Saat membaca Multipart Upload & S3 Presigned URLs, gunakan tujuan belajar sebagai penanda arah. Kalau kamu sudah bisa menjelaskan tujuan itu dengan kata-katamu sendiri, berarti fondasinya mulai terbentuk.

Cara Membayangkannya

Presigned URL seperti tiket masuk terbatas — waktu terbatas, lokasi spesifik, permission terbatas. Analogi ini dipakai supaya konsep teknis tidak terasa melayang. Hubungkan setiap istilah dengan perannya: siapa yang meminta, siapa yang memproses, data apa yang berpindah, dan hasil apa yang diharapkan.

Kalau analoginya sudah terasa masuk akal, barulah lihat istilah teknisnya. Cara ini membuat materi lebih mudah dipahami daripada langsung menghafal definisi.

Saat Melihat Contoh Kode

Contoh kode pada chapter ini memakai bahasa typescript. Bacalah contoh kode sebagai ilustrasi alur, bukan sebagai bagian yang harus langsung dihafal.

Perhatikan nama fungsi, urutan langkah, dan data yang berpindah. Biasanya tiga hal itu sudah cukup untuk memahami hubungan antara teori dan praktik.

Konteks dalam Perjalanan Belajar

Setiap konsep di platform ini dipilih karena dipakai di industri. Fokus pada pemahaman, bukan hafalan.

Kamu sudah di bagian lanjutan. Mulai pikirkan bagaimana konsep ini dipakai di dunia kerja — bukan hanya untuk belajar, tapi untuk membangun produk nyata.

Gunakan pertanyaan reflektif dan prompt AI di akhir chapter sebagai latihan aktif. Membaca saja tidak cukup — kamu perlu menjelaskan ulang dengan kata-katamu sendiri.

Contoh Kode

typescript
// Generate presigned URL dengan AWS SDK
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';

const s3 = new S3Client({ region: 'auto', endpoint: R2_ENDPOINT });

async function getPresignedUrl(userId: string, filename: string, contentType: string) {
  const key = `uploads/${userId}/${Date.now()}-${filename}`;
  
  const command = new PutObjectCommand({
    Bucket: BUCKET_NAME,
    Key: key,
    ContentType: contentType,
    Metadata: { userId },
  });
  
  const url = await getSignedUrl(s3, command, { expiresIn: 600 }); // 10 menit
  
  return { url, key };
}

// Frontend: upload langsung ke S3
await fetch(presignedUrl, {
  method: 'PUT',
  body: file,
  headers: { 'Content-Type': file.type },
});

Prompt AI

Implementasi presigned URL upload untuk aplikasi berbagi foto. Requirements: file max 10MB, hanya gambar (jpg/png/webp), presigned URL expires 5 menit, user hanya bisa upload ke folder miliknya sendiri.

Pertanyaan Reflektif

Apakah aplikasi-mu pakai presigned URL? Atau semua file lewat server application (yang membebani server dengan upload/download)?