All Products
Search
Document Center

Edge Security Acceleration:Konfigurasikan Penandatanganan URL

Last Updated:Jan 14, 2026

Topik ini menjelaskan cara mengimplementasikan tiga metode autentikasi untuk Edge Security Acceleration (ESA) menggunakan templat Edge Function. Dokumen ini mencakup algoritma signature, format URL, parameter, dan logika validasi sisi server untuk setiap metode. Metode-metode tersebut melindungi resource dalam kasus penggunaan seperti akses file terlindungi atau permintaan API yang diautentikasi. Contoh kode dan deskripsi parameter yang disediakan membantu Anda mengonfigurasi serta men-debug implementasi tersebut.

Cara kerja

Penandatanganan URL melindungi resource origin Anda dengan memblokir permintaan yang gagal dalam proses autentikasi.

Metode autentikasi

ESA menyediakan tiga metode autentikasi: A, B, dan C. Setiap metode memverifikasi permintaan dengan membandingkan hash MD5 dari URL dengan hash yang dihitung di Titik kehadiran (POP). Jika hash-nya cocok, POP memproses permintaan dan menyajikan resource tersebut. Jika tidak cocok, permintaan ditolak.

Metode A

  • Format signed URL: http://DomainName/Filename?auth_key={timestamp}-{rand}-{uid}-{md5hash}. Untuk deskripsi parameter-parameter ini, lihat Parameter.

  • Contoh kode

    import { createHash } from "node:crypto";
    
    async function handleRequest(request) {
      const url = new URL(request.url);
      const path = url.pathname;
      const delta = 3600;
    
      const authKeyTypeA = url.searchParams.get('auth_key');
    
      const privateKey = 'your_secret_key'
      const currentTimestamp = Math.floor(Date.now() / 1000);
    
      if (!authKeyTypeA) {
        return new Response('Unauthorized', { status: 401 });
      }
    
      const [timestamp, rand, uid, signature] = authKeyTypeA.split('-');
    
      if (currentTimestamp > parseInt(timestamp)+ delta) {
        return new Response('Link expired', { status: 403 });
      }
    
      const signString = [path, timestamp, rand, uid, privateKey].join('-');
    
      const md5 = createHash('md5').update(signString).digest('hex');
    
      if (md5 !== signature) {
        return new Response('Unauthorized', { status: 401 });
      }
    
      // Jika resource berada di domain lain, ambil dan kembalikan responsnya
      // const yourUrl = `https://your-dcdn-domain.com${path}${url.search}`
      // const cdnResponse = await fetch(yourUrl, request)
      // return new Response(cdnResponse.body, cdnResponse)
    
      // Dalam kebanyakan kasus, satu kali origin fetch sudah cukup
      return fetch(request.url)
    }
    
    export default {
      async fetch(request) {
        return handleRequest(request)
      }
    }

  • Pengujian dan verifikasi

    • Gunakan Command Line Interface (CLI) untuk menguji URL yang seharusnya lolos autentikasi: curl -I http://esa.aliyun.top/video/test.mp4?auth_key=1743388566-61b20a42d14f403ba3790d1b82502027-1-ee1c2c463a41ef4d72fcff5987f1e08c. Kode respons HTTP 200 menunjukkan bahwa autentikasi berhasil.

      image

    • Gunakan CLI untuk menguji URL yang seharusnya gagal dalam autentikasi: curl -I http://esa.aliyun.top/test.mp4. Kode respons HTTP 401 menunjukkan bahwa autentikasi gagal.

      image

Metode B

  • Format signed URL: http://DomainName/{timestamp}/{md5hash}/FileName. Untuk deskripsi parameter-parameter ini, lihat Parameter.

  • Contoh kode

    import { createHash } from "node:crypto";
    
    function handleRequest(request) {
      const url = new URL(request.url);
      const path = url.pathname;
      const parts = path.split('/');
      const delta = 3600;
      const privateKey = 'your_secret_key'
      const currentTimestamp = Math.floor(Date.now() / 1000);
      const timestamp = parts[1];
      const signature = parts[2];
    
      if (!timestamp || !signature) {
        return new Response('Unauthorized', { status: 401 });
      }
    
      const filePath = '/' + parts.slice(3).join('/');
      const signString = [privateKey, timestamp, filePath].join('');
      const md5 = createHash('md5').update(signString).digest('hex');
    
      if (md5 !== signature) {
        return new Response('Unauthorized', { status: 401 });
      }
    
      if (currentTimestamp > parseInt(timestamp)+ delta) {
        return new Response('Link expired', { status: 403 });
      }
    
      // Jika resource berada di domain lain, ambil dan kembalikan responsnya
      // const yourUrl = `https://your-dcdn-domain.com${path}${url.search}`
      // const cdnResponse = await fetch(yourUrl, request)
      // return new Response(cdnResponse.body, cdnResponse)
    
      // Untuk Metode Autentikasi B, rekonstruksi jalur file asli untuk origin fetch.
      return fetch(url.origin + filePath)
    }
    
    export default {
      async fetch(request) {
        return handleRequest(request)
      }
    }

  • Pengujian dan verifikasi

    • Gunakan CLI untuk menguji URL yang seharusnya lolos autentikasi: curl -I http://esa.aliyun.top/1743391454/f1415e282ae5ae650455e7b525231eff/test.mp4. Kode respons HTTP `200` menunjukkan bahwa autentikasi berhasil.

      image

    • Gunakan CLI untuk menguji URL yang seharusnya gagal dalam autentikasi: http://esa.aliyun.top/test.mp4. Kode respons HTTP `401` menunjukkan bahwa autentikasi gagal.

      image

Metode C

  • Format signed URL: http://DomainName/{md5hash}/{timestamp}/FileName. Untuk deskripsi parameter-parameter ini, lihat Parameter.

  • Contoh kode

    import { createHash } from "node:crypto";
    
    function handleRequest(request) {
      const url = new URL(request.url);
      const path = url.pathname;
      const parts = path.split('/');
      const delta = 3600;
      const privateKey = 'your_secret_key'
      const currentTimestamp = Math.floor(Date.now() / 1000);
      const signature = parts[1];
      const hexTime = parts[2];
      const timestamp = parseInt(hexTime, 16);
    
      if (!hexTime || !signature) {
        return new Response('Unauthorized', { status: 401 });
      }
    
      const filePath = '/' + parts.slice(3).join('/');
      const signString = [privateKey, filePath, hexTime].join('-');
      const md5 = createHash('md5').update(signString).digest('hex');
    
      if (md5 !== signature) {
        return new Response('Unauthorized', { status: 401 });
      }
    
      if (currentTimestamp > parseInt(timestamp)+ delta) {
        return new Response('Link expired', { status: 403 });
      }
    
      // Jika resource berada di domain lain, ambil dan kembalikan responsnya
      // const yourUrl = `https://your-dcdn-domain.com${path}${url.search}`
      // const cdnResponse = await fetch(yourUrl, request)
      // return new Response(cdnResponse.body, cdnResponse)
    
      // Untuk Metode Autentikasi C, rekonstruksi jalur file asli untuk origin fetch.
      return fetch(url.origin + filePath)
    }
    
    export default {
      async fetch(request) {
        return handleRequest(request)
      }
    }

  • Pengujian dan verifikasi

    • Gunakan CLI untuk menguji URL yang seharusnya lolos autentikasi: curl -I http://esa.aliyun.top/e59c904c85f19a48413b6283fc9d2f5a/1743400480/test.mp4. Kode respons HTTP `200` menunjukkan bahwa autentikasi berhasil.

      image

    • Gunakan CLI untuk menguji URL yang seharusnya gagal dalam autentikasi: http://esa.aliyun.top/test.mp4. Kode respons HTTP `401` menunjukkan bahwa autentikasi gagal.

      image

Parameter

  • DomainName: Rekaman DNS untuk situs ESA Anda.

  • timestamp: Waktu saat signed URL dibuat, dinyatakan sebagai Unix timestamp (jumlah detik sejak epoch Unix). Nilai ini, bersama dengan TTL yang dikonfigurasi, menentukan waktu kedaluwarsa URL. Untuk Metode Autentikasi C, timestamp direpresentasikan sebagai string heksadesimal.

    Catatan

    Signed URL kedaluwarsa pada timestamp ditambah periode validitas yang dikonfigurasi. Periode validitas biasanya diatur di ESA. Kode contoh menggunakan nilai tetap untuk periode ini, yang diatur dalam variabel `delta`.

  • FileName: Jalur menuju file yang diminta di server origin. Jalur harus diawali dengan garis miring (/).

  • md5hash: String validasi 32 karakter yang dihasilkan menggunakan algoritma MD5, terdiri atas digit 0–9 dan huruf kecil a–z.

    Nilai md5hash dihitung sebagai berikut:

    • Metode Autentikasi A: getMd5(FileName + "-" + timestamp + "-" + rand + "-" + uid + "-" + your_secret_key).

    • Metode Autentikasi B: getMd5(your_secret_key + timestamp + FileName).

    • Metode Autentikasi C: getMd5(your_secret_key + "-" + FileName + "-" + timestamp).

    Catatan

    Anda harus mengimplementasikan fungsi getMd5 secara manual.

  • rand: String acak yang digunakan agar setiap signed URL unik. Gunakan identifier unik universal (UUID) tanpa tanda hubung untuk nilai ini. Contoh: 477b3bbc253f467b8def6711128c7bec.

  • uid: User ID (UID), yang dapat Anda atur sesuai kebutuhan bisnis Anda.

  • auth_key: Informasi autentikasi untuk permintaan, yang terdiri dari timestamp, rand, uid, dan md5hash.