Pendahuluan


AWS S3 adalah salah satu layanan object storage paling populer dengan fitur keamanan yang kuat.

Namun, sering kali aplikasi membutuhkan cara aman untuk mengunggah atau mengunduh file tanpa memberikan akses langsung ke kredensial AWS atau menjadikan bucket publik.

Di sinilah Pre-Signed URL menjadi solusi ideal.


📌 Apa Itu Pre-Signed URL ?


Pre-Signed URL adalah URL sementara yang dihasilkan oleh aplikasi menggunakan kredensial AWS (IAM user atau IAM role).

URL ini memberikan akses terbatas kepada seseorang untuk melakukan operasi GET, PUT, atau operasi spesifik lainnya ke objek S3.

Kunci penting: 👉 URL hanya valid selama durasi tertentu 👉 URL memberikan izin hanya untuk objek dan aksi tertentu

Contoh penggunaan:

  • Mengizinkan user meng-upload file langsung ke S3 (client → S3)
  • Memberikan akses download file tanpa menjadikan bucket publik
  • Transfer file besar tanpa membebani backend server

🔍 Cara Kerja Pre-Signed URL


  • Aplikasi server (dengan IAM role/user) membuat pre-signed URL.
  • Server mengembalikan URL tersebut ke client.
  • Client menggunakan URL itu untuk upload/download langsung ke S3.
  • Setelah expirasi, URL otomatis tidak valid.

Diagram alurnya :

Client → Server → (Generate Presigned URL) → Client → S3

Keuntungan utama:

Server tidak perlu menjadi proxy file, sehingga lebih efisien dan murah.


🎯 Kapan Harus Menggunakan Pre-Signed URL?


Pre-Signed URL ideal untuk:

  • Upload file dari web/mobile langsung ke S3
  • Membagikan dokumen privat sementara
  • Sistem foto/berkas untuk aplikasi:
  • HR system record document
  • Mengurangi biaya server karena file tidak perlu melewati backend

⚖️ Kelebihan dan Kekurangan


✔️ Kelebihan

  • Akses aman tanpa membuka bucket
  • Privileged access dengan batas waktu
  • Menghemat bandwidth server
  • Integrasi mudah dengan aplikasi web/mobile
  • Mendukung file besar

❌ Kekurangan

  • Jika URL bocor selama masa valid, siapa pun dapat menggunakannya
  • Kontrol akses terbatas ke objek saja
  • manajemen expirasi untuk keamanan optimal

🔐 Security Best Practices


  • Limit expiration. Gunakan durasi pendek, misalnya 5–30 menit.
  • Gunakan IAM Role (bukan IAM user dengan access key statis)
  • Validasi file type dan size di sisi server sebelum membuat URL
  • Jangan simpan pre-signed URL dalam jangka panjang
  • Gunakan private bucket
  • Jangan kombinasikan presigned URL dengan bucket publik.

Contoh Implementasi Pre-Signed URL


Python (boto3) – Generate Pre-Signed URL Upload & Download :


import boto3

s3 = boto3.client('s3')

bucket = "my-bucket"
key = "uploads/photo.jpg"

# Generate upload URL
upload_url = s3.generate_presigned_url(
    ClientMethod="put_object",
    Params={"Bucket": bucket, "Key": key},
    ExpiresIn=300  # 5 minutes
)

print("Upload URL:", upload_url)

# Generate download URL
download_url = s3.generate_presigned_url(
    ClientMethod="get_object",
    Params={"Bucket": bucket, "Key": key},
    ExpiresIn=300
)

print("Download URL:", download_url)


Java (AWS SDK v2) – Generate Pre-Signed URL PUT


import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest;

public class PresignUpload {

    public static void main(String[] args) {

        S3Presigner presigner = S3Presigner.create();

        PutObjectRequest req = PutObjectRequest.builder()
                .bucket("my-bucket")
                .key("uploads/data.txt")
                .build();

        PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
                .signatureDuration(java.time.Duration.ofMinutes(5))
                .putObjectRequest(req)
                .build();

        String url = presigner.presignPutObject(presignRequest).url().toString();
        System.out.println("Pre-Signed URL: " + url);

        presigner.close();
    }
}


JavaScript (Node.js) – Generate Pre-Signed URL


import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";

const client = new S3Client({ region: "ap-southeast-1" });

const command = new PutObjectCommand({
  Bucket: "my-bucket",
  Key: "uploads/file.png"
});

const url = await getSignedUrl(client, command, { expiresIn: 300 });

console.log("Presigned URL:", url);


🏗️ Arsitektur Umum Penggunaan Pre-Signed URL


[Client]
   |
   | request upload permission
   v
[Backend/API Server]
   - Validasi user
   - Validasi file extension/size
   - Generate presigned URL
   |
   v
[Client Upload File]
   → langsung ke S3

Kesimpulan


AWS Pre-Signed URL adalah mekanisme aman dan efisien untuk memberikan akses sementara ke objek S3 tanpa mengekspos kredensial AWS atau menjadikan bucket publik.

Fitur ini sangat cocok untuk:

  • upload/download file besar
  • aplikasi web/mobile modern
  • sistem yang membutuhkan controlled access