All Products
Search
Document Center

Object Storage Service:Tanda tangan POST V1

Last Updated:Aug 27, 2026

Tanda tangan POST V1 mengamankan permintaan unggah yang dikirimkan klien ke Object Storage Service (OSS) melalui operasi PostObject. Server aplikasi menghitung signature berdasarkan kebijakan unggah dan mengirimkannya bersama ke klien, yang kemudian mengirimkan keduanya sebagai field formulir. OSS memverifikasi signature pada setiap permintaan POST dan menolak permintaan dengan signature tidak valid.

Catatan

OSS mendukung algoritma signature V4 yang lebih aman. (Disarankan) Gunakan penandatanganan V4. Untuk informasi selengkapnya, lihat V4 signature.

Kapan tanda tangan POST V1 diperlukan

Permintaan HTTP POST ke OSS mendukung algoritma signature V1, yang dalam topik ini disebut sebagai penandatanganan POST V1. Sebelum menghitung tanda tangan POST V1, tinjau kondisi dan dependensi berikut:

  • Bucket ACL — Permintaan PostObject harus menyertakan signature jika ACL bucket tujuan adalah public-read atau private.

  • Field formulir — Sediakan field formulir OSSAccessKeyId, Signature, dan policy sebagai satu kelompok. Jika salah satu dari ketiga field tersebut ada dalam formulir, dua field lainnya juga wajib disertakan. Untuk deskripsi tiap field, lihat Form fields.

  • Lokasi perhitungan signature — Server aplikasi menghitung signature dan mengirimkannya bersama kebijakan unggah ke klien. Klien menggunakan informasi ini untuk menyusun permintaan PostObject.

  • Kredensial — Signature dihitung dari AccessKey secret. Field formulir OSSAccessKeyId membawa ID AccessKey dari Pasangan Kunci Akses yang sama.

Menghitung tanda tangan POST V1

Hitung tanda tangan POST V1 pada server aplikasi Anda dalam tiga langkah berikut:

  1. Buat kebijakan (policy). Buat policy dengan encoding UTF-8. Untuk sintaksis policy dan kondisi yang dapat Anda deklarasikan, lihat Policy structure.

  2. Buat string yang akan ditandatangani (StringToSign). Encode policy dalam Base64. String hasilnya merupakan string yang akan ditandatangani (StringToSign).

  3. Hitung signature. Gunakan AccessKey secret untuk menandatangani string yang akan ditandatangani. Rumus penandatanganan adalah Signature = base64(hmac-sha1(AccessKeySecret,base64(policy))).

Gambar berikut menunjukkan proses perhitungan tanda tangan POST V1.

Contoh: menghitung tanda tangan POST V1 dalam Java

Contoh Java berikut menjalankan tiga langkah penandatanganan POST V1 terhadap contoh policy yang dijelaskan dalam Policy structure. Langkah 3 memanggil OSS Java SDK, yang menerapkan rumus base64(hmac-sha1(AccessKeySecret,base64(policy))) pada string yang akan ditandatangani.

import org.apache.commons.codec.binary.Base64;

public class Demo {
    public static void main(String[] args) {
        // Sebelum menjalankan contoh kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_SECRET telah disetel.
        String accessKeySecret =  System.getenv().get("OSS_ACCESS_KEY_SECRET");

        // Langkah 1: Buat policy.
        String policy = "{\n" +
                "  \"expiration\": \"2023-12-03T13:00:00.000Z\",\n" +
                "  \"conditions\": [\n" +
                "    {\"bucket\": \"examplebucket\"},\n" +
                "    [\"content-length-range\", 1, 10],\n" +
                "    [\"eq\", \"$success_action_status\", \"201\"],\n" +
                "    [\"starts-with\", \"$key\", \"user/eric/\"],\n" +
                "    [\"in\", \"$content-type\", [\"image/jpeg\", \"image/png\"]],\n" +
                "    [\"not-in\", \"$cache-control\", [\"no-cache\"]]\n" +
                "  ]\n" +
                "}";

        // Langkah 2: Buat string yang akan ditandatangani (StringToSign).
        String stringToSign = new String(Base64.encodeBase64(policy.getBytes()));

        // Langkah 3: Hitung signature.
        String signature = com.aliyun.oss.common.auth.ServiceSignature.create().computeSignature(accessKeySecret, stringToSign);
        System.out.println("signature:" + signature);
    }
}

Signature dicetak dalam format berikut. Nilai yang dicetak merupakan string yang diencode Base64, yang bergantung pada AccessKey secret Anda dan byte eksak dari policy Anda, sehingga output Anda akan berbeda dari contoh berikut.

signature:****

Kirimkan nilai yang dihitung dalam field formulir Signature pada permintaan PostObject, bersama dengan field formulir OSSAccessKeyId dan policy.

Field formulir

Elemen formulir berikut khusus untuk penandatanganan POST V1. Untuk elemen formulir umum lainnya, lihat PostObject form elements. Untuk kondisi yang mewajibkan penggunaan field ini, lihat Kapan tanda tangan POST V1 diperlukan.

FieldTypeDescription
OSSAccessKeyIdStringID AccessKey dalam Pasangan Kunci Akses. Nilai default: Tidak ada.
SignatureStringSignature yang dihitung dari AccessKey secret dan policy. OSS menggunakan signature ini untuk memverifikasi validitas permintaan POST. Nama field formulir ini tidak peka huruf besar/kecil, tetapi nilainya peka huruf besar/kecil. Nilai default: Tidak ada. Untuk cara OSS memverifikasi signature permintaan POST, lihat PostObject.
policyStringKebijakan keamanan yang mendeklarasikan izin dan batasan unggah. Policy didefinisikan dalam format JSON dan harus mencakup field expiration dan conditions. Untuk detailnya, lihat Policy structure.

Struktur policy

Field formulir policy adalah kebijakan keamanan yang mendefinisikan izin dan batasan untuk mengunggah objek ke OSS melalui formulir HTML. Policy didefinisikan dalam format JSON dan membatasi operasi unggah melalui beberapa parameter, seperti nama bucket yang diizinkan, awalan objek, waktu kedaluwarsa, metode HTTP yang diizinkan, batas ukuran konten, dan pembatasan tipe konten.

Policy harus mencakup field expiration dan conditions, seperti yang ditunjukkan pada contoh berikut.

{
  "expiration": "2023-12-03T13:00:00.000Z",
  "conditions": [
    {"bucket": "examplebucket"},
    ["content-length-range", 1, 10],
    ["eq", "$success_action_status", "201"],
    ["starts-with", "$key", "user/eric/"],
    ["in", "$content-type", ["image/jpeg", "image/png"]],
    ["not-in", "$cache-control", ["no-cache"]]
  ]
}

Policy berisi elemen-elemen berikut:

  • expiration — Menentukan waktu kedaluwarsa policy dalam format ISO 8601 GMT. Misalnya, 2023-12-03T13:00:00.000Z berarti permintaan POST harus diajukan sebelum pukul 13.00 GMT pada 3 Desember 2023.

  • conditions — Menentukan nilai yang valid untuk field formulir dalam permintaan POST.

Tabel berikut menjelaskan field yang dapat Anda deklarasikan dalam conditions.

FieldTypeRequiredDescriptionCondition matching modes
bucketStringTidakNama bucket.bucket
content-length-rangeStringTidakUkuran minimum dan maksimum objek yang diizinkan untuk diunggah, dalam byte.content-length-range
success_action_statusStringTidakKode status HTTP yang dikembalikan setelah unggah berhasil.eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci
keyStringTidakNama objek yang akan diunggah.eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci
content-typeStringTidakMembatasi tipe konten objek yang akan diunggah.eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci
cache-controlStringTidakMenentukan perilaku caching objek.eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci

Mode pencocokan kondisi

Tabel berikut menjelaskan mode pencocokan kondisi yang dapat Anda gunakan dalam field conditions pada policy POST V1.

Mode pencocokan kondisiDescription
content-length-rangeMenentukan ukuran objek minimum dan maksimum yang diizinkan untuk unggah. Misalnya, untuk mengizinkan ukuran objek dari 1 hingga 10 byte, tulis ["content-length-range", 1, 10].
eqMelakukan pencocokan eksak. Nilai field formulir harus persis sama dengan nilai yang dideklarasikan dalam kondisi. Misalnya, untuk mewajibkan nilai field formulir key menjadi a, tulis ["eq", "$key", "a"].
starts-withMelakukan pencocokan awalan. Nilai field formulir harus diawali dengan awalan yang ditentukan. Misalnya, untuk mewajibkan nilai field formulir key diawali dengan user/user1, tulis ["starts-with", "$key", "user/user1"].
inMemeriksa apakah nilai termasuk dalam daftar string tertentu. Misalnya, saat Anda mengunggah gambar melalui operasi PostObject dan ingin mengizinkan beberapa format gambar, gunakan ["in", "$content-type", ["image/jpeg", "image/png"]].
not-inMemeriksa apakah nilai tidak termasuk dalam daftar string tertentu. Misalnya, saat Anda mengunggah objek melalui operasi PostObject dan ingin melarang nilai no-cache untuk perilaku cache, gunakan ["not-in", "$cache-control", ["no-cache"]].
eq-ciMelakukan pencocokan eksak tanpa membedakan huruf besar/kecil. Nilai field formulir harus sesuai dengan nilai yang dideklarasikan dalam kondisi. Perbandingan dilakukan dalam huruf kecil. Misalnya, untuk ["eq-ci", "$key", "AbC"], nama objek seperti abc, ABC, dan aBc semuanya cocok.
starts-with-ciMelakukan pencocokan awalan tanpa membedakan huruf besar/kecil. Nilai field formulir harus diawali dengan awalan yang ditentukan. Perbandingan dilakukan dalam huruf kecil. Misalnya, untuk ["starts-with-ci", "$key", "User/"], nilai yang diawali dengan user/, USER/, atau User/ semuanya cocok.
in-ciMelakukan pemeriksaan tanpa membedakan huruf besar/kecil untuk menentukan apakah nilai termasuk dalam daftar string tertentu. Perbandingan dilakukan dalam huruf kecil. Misalnya, untuk ["in-ci", "$content-type", ["IMAGE/JPEG", "image/PNG"]], nilai seperti image/jpeg dan IMAGE/PNG semuanya cocok.
not-in-ciMelakukan pemeriksaan tanpa membedakan huruf besar/kecil untuk menentukan apakah nilai tidak termasuk dalam daftar string tertentu. Perbandingan dilakukan dalam huruf kecil. Misalnya, untuk ["not-in-ci", "$cache-control", ["No-Cache"]], nilai seperti no-cache, NO-CACHE, dan No-Cache semuanya dikecualikan.

Karakter escape policy

Dalam policy POST, tanda dolar ($) merepresentasikan variabel. Untuk menyertakan tanda dolar literal, gunakan karakter escape \$. Tabel berikut menjelaskan karakter yang harus di-escape dalam JSON policy.

Karakter escapeDescription
\/Garis miring maju
\\Garis miring terbalik
\"Tanda kutip ganda
\$Tanda dolar
\bSpasi
\fForm feed
\nLine break
\rCarriage return
\tTab Horizontal
\uxxxxKarakter Unicode