Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Halaman ini memberikan ringkasan URL yang ditandatangani saat menggunakan proses penandatanganan V2, yang merupakan mekanisme untuk autentikasi string kueri untuk bucket dan objek.
URL yang ditandatangani menyediakan cara untuk memberikan akses baca atau tulis dalam waktu terbatas kepada siapa saja
yang memiliki URL, terlepas dari apakah mereka memiliki akun pengguna atau tidak.
Komponen string yang memerlukan penandatanganan
Saat membuat URL yang ditandatangani menggunakan program, program Anda akan membuat string
yang akan ditandatangani. String ini harus ditentukan dalam program Anda sebagai:
Komponen yang membentuk struktur ini dijelaskan dalam tabel berikut:
Komponen String
Contoh
Deskripsi
HTTP_Verb
GET
Wajib diisi. Kata kerja HTTP yang akan digunakan dengan URL bertanda tangan.
Catatan: Kata kerja HTTP POST tidak didukung dalam string URL yang ditandatangani, kecuali seperti yang disebutkan di atas. Anda dapat menggunakan POST untuk menentukan dokumen kebijakan yang ditandatangani, yang menentukan karakteristik objek yang dapat diupload ke bucket. Pelajari lebih lanjut di dokumentasi POST Object.
Content_MD5
rmYdCNHKFXam78uCt7xQLw==
Opsional. Nilai ringkasan MD5 dalam Base64. Jika Anda memberikannya dalam string, klien (biasanya browser) harus memberikan header HTTP ini dengan nilai yang sama dalam permintaannya.
Content_Type
text/plain
Sesuai kebutuhan. Jika Anda memberikan content-type, klien (browser) harus memberikan header HTTP ini yang ditetapkan ke nilai yang sama.
Expires
1388534400
Wajib diisi. Ini adalah stempel waktu (diwakili sebagai jumlah detik sejak Epoch Unix 00:00:00 UTC pada 1 Januari 1970) ketika tanda tangan berakhir. Server menolak semua permintaan yang diterima setelah stempel waktu ini, serta semua permintaan yang diterima setelah kunci yang digunakan untuk membuat URL yang ditandatangani dirotasi. Untuk keamanan dan kompatibilitas dengan proses penandatanganan V4, Anda harus menetapkan Expires agar sesuai dengan maksimum 1 minggu (604800 detik) di masa mendatang.
Canonicalized_Extension_Headers
x-goog-acl:public-read\nx-goog-meta-foo:bar,baz\n
Sesuai kebutuhan. Server memeriksa untuk memastikan klien memberikan nilai yang cocok dalam permintaan menggunakan URL yang ditandatangani. Untuk mengetahui informasi tentang cara membuat header kanonis untuk penandatanganan, lihat Header ekstensi kanonis.
Canonicalized_Resource
/bucket/objectname
Wajib diisi. Resource yang dirujuk dalam URL. Untuk mengetahui detail selengkapnya, lihat Referensi kanonis.
Menandatangani string dengan layanan App Identity App Engine
Saat membuat URL bertanda tangan menggunakan program, Anda dapat menandatangani string tersebut dari dalam program, atau dari dalam aplikasi App Engine menggunakan layanan App Engine Identity, yang menggunakan kredensial akun layanan App Engine Anda. Misalnya, menggunakan Python App Identity API, Anda dapat:
Menggunakan google.appengine.api.app_identity.sign_blob() untuk menandatangani byte dari
string yang Anda buat, menyediakan Signature yang Anda perlukan saat
menyusun URL yang ditandatangani.
Menggunakan google.appengine.api.app_identity.get_service_account_name()
untuk mengambil nama akun layanan, yang merupakan GoogleAccessId yang Anda perlukan
saat menyusun URL yang ditandatangani.
Layanan Identitas Aplikasi merotasi kunci pribadi saat menandatangani blob. URL yang ditandatangani
yang dihasilkan dari layanan Identitas Aplikasi valid selama minimal satu jam, dan paling cocok digunakan untuk
akses jangka pendek ke resource.
Header ekstensi kanonis
Saat membuat URL bertanda tangan menggunakan program, Anda harus membuat bagian Header Ekstensi Kanonis dari pesan dengan menyambungkan semua header ekstensi (kustom) yang diawali dengan x-goog-. Namun, Anda tidak dapat melakukan penggabungan
sederhana. Ingatlah algoritma berikut saat Anda membuat header:
Gunakan huruf kecil untuk semua nama header kustom.
Mengurutkan semua header kustom berdasarkan nama header menggunakan pengurutan leksikografis menurut nilai poin kode.
Jika ada, hapus header x-goog-encryption-key dan x-goog-encryption-key-sha256. Header ini berisi informasi sensitif yang tidak boleh disertakan
dalam string-to-sign; tetapi header ini tetap harus digunakan dalam
permintaan apa pun yang menggunakan URL bertanda tangan yang dihasilkan.
Hapus nama header duplikat dengan membuat satu nama header dengan daftar nilai yang dipisahkan koma. Pastikan tidak ada spasi kosong di antara nilai-nilai tersebut, dan pastikan urutan
daftar yang dipisahkan koma sesuai dengan urutan header yang muncul dalam permintaan Anda. Untuk mengetahui informasi
selengkapnya, lihat RFC 7230 bagian 3.2.
Ganti semua spasi kosong lipat atau baris baru (CRLF atau LF) dengan satu spasi. Untuk informasi selengkapnya tentang spasi kosong lipat, lihat RFC 7230, bagian 3.2.4..
Hapus spasi kosong di sekitar titik dua yang muncul setelah nama header.
Tambahkan baris baru "\n" (U+000A) ke setiap header kustom.
Sambungkan semua header kustom.
Resource kanonis
Ketika membuat URL bertanda tangan menggunakan program, Anda harus membuat bagian Resource yang Dikanonikalisasi dari pesan dengan menyambungkan jalur resource (bucket dan objek serta subresource) yang menjadi target permintaan. Perhatikan
hal-hal berikut saat Anda membuat resource:
Resource kanonis adalah segala hal setelah nama host. Misalnya,
jika URL Cloud Storage adalah https://storage.googleapis.com/example-bucket/cat-pics/tabby.jpeg,
resource kanonisnya adalah /example-bucket/cat-pics/tabby.jpeg.
Jika permintaan dicakup ke sub-resource, seperti ?cors, tambahkan sub-resource ini,
termasuk tanda tanya, ke akhir string.
Pastikan untuk menyalin jalur permintaan HTTP secara literal: artinya, Anda harus menyertakan semua encoding URL (tanda persen) dalam string yang Anda buat. Selain itu, pastikan Anda hanya menyertakan parameter string kueri yang menunjukkan subresource (misalnya cors). Anda tidak boleh menyertakan parameter string kueri seperti ?prefix, ?max-keys, ?marker, dan ?delimiter.
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Sulit dipahami","hardToUnderstand","thumb-down"],["Informasi atau kode contoh salah","incorrectInformationOrSampleCode","thumb-down"],["Informasi/contoh yang saya butuhkan tidak ada","missingTheInformationSamplesINeed","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 2025-09-05 UTC."],[],[],null,["# V2 Signing Process\n\n| **Important:** This page covers legacy material related to the V2 signing process. It is recommended that users work with the [V4 signing process](/storage/docs/access-control/signed-urls) instead.\n\nThis page provides an overview of signed URLs when working with the V2 signing\nprocess, which is a mechanism for query\nstring authentication for buckets and objects.\nSigned URLs provide a way to give time-limited read or write access to anyone\nin possession of the URL, regardless of whether they have a user account.\n| **Important:** Signed URLs can only be used to access resources in Cloud Storage through [XML API endpoints](/storage/docs/request-endpoints).\n\nComponents of the string that requires signing\n----------------------------------------------\n\nWhen creating a signed URL using a program, your program constructs a string\nthat will be signed. This string should be defined in your program as: \n\n```\nStringToSign = HTTP_Verb + \"\\n\" +\n Content_MD5 + \"\\n\" +\n Content_Type + \"\\n\" +\n Expires + \"\\n\" +\n Canonicalized_Extension_Headers +\n Canonicalized_Resource\n```\n\nThe components that make up this structure are described in the following table:\n\n| **Note:** Query String Parameters like `response-content-disposition` and `response-content-type` are not verified by the signature. To force a `Content-Disposition` or `Content-Type` in the response, [set those parameters in the object metadata](/storage/docs/viewing-editing-metadata#edit).\n\nSigning strings with the App Engine App Identity service\n--------------------------------------------------------\n\nWhen creating a signed URL using a program, you can either sign the string\nfrom within your program, or else from\nwithin a App Engine application using the App Engine Identity service,\nwhich uses App Engine's service account credentials. For example, using the\n[Python App Identity API](/appengine/docs/python/appidentity), you can:\n\n- Use `google.appengine.api.app_identity.sign_blob()` to sign the bytes from\n your constructed string, providing the `Signature` you need when\n assembling the signed URL.\n\n- Use `google.appengine.api.app_identity.get_service_account_name()`\n to retrieve a service account name, which is the `GoogleAccessId` you need\n when assembling the signed URL.\n\nFor support in other languages, see\n[App Identity API for Java Overview](/appengine/docs/java/appidentity),\n[App Identity API for PHP Overview](/appengine/docs/php/appidentity),\nand [App Identity Go Functions](/appengine/docs/go/appidentity).\n\nThe App Identity service rotates the private keys when it signs blobs. Signed URLs\ngenerated from the App Identity service are good for at least one hour, and are best used for\nshort-lived access to resources.\n\nCanonical extension headers\n---------------------------\n\nWhen creating a signed URL using a program, you construct the Canonical\nExtension Headers portion of the message by concatenating all\nextension (custom) headers that begin with `x-goog-`. However, you cannot perform a simple\nconcatenation. Keep the following algorithm in mind as you create the headers:\n\n1. Make all custom header names lowercase.\n\n2. Sort all custom headers by header name using a lexicographical sort by code point value.\n\n3. If present, remove the `x-goog-encryption-key` and `x-goog-encryption-key-sha256`\n headers. These headers contain sensitive information that must not be included\n in the string-to-sign; however, these headers must still be used in any\n requests that use the generated signed URL.\n\n4. Eliminate duplicate header names by creating one header name with a comma-separated list of\n values. Be sure there is no whitespace between the values, and be sure that the order of the\n comma-separated list matches the order that the headers appear in your request. For more\n information, see [RFC 7230 section 3.2](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2).\n\n5. Replace any folding whitespace or newlines (CRLF or LF) with a single space. For more\n information about folding whitespace, see\n [RFC 7230, section 3.2.4.](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4).\n\n6. Remove any whitespace around the colon that appears after the header name.\n\n7. Append a newline \"\\\\n\" (U+000A) to each custom header.\n\n8. Concatenate all custom headers.\n\n| **Important:** You must use both the header name and the header value when you construct the Canonical Extension Headers portion of the query string. Be sure to remove any whitespace around the colon that separates the header name and value. For example, using the custom header `x-goog-acl: private` without removing the space after the colon returns a `403 Forbidden` error, because the request signature you calculate does not match the signature Cloud Storage calculates.\n\nCanonical resources\n-------------------\n\nWhen creating a signed URL using a program, you construct the\nCanonicalized Resource portion of the message by concatenating the resource\npath (bucket and object and subresource) that the request is acting on. Keep\nthe following in mind as you create the resource:\n\n- The canonical resource is everything that follows the host name. For example,\n if the Cloud Storage URL is `https://storage.googleapis.com/example-bucket/cat-pics/tabby.jpeg`,\n then the canonical resource is `/example-bucket/cat-pics/tabby.jpeg`.\n\n- If the request is scoped to a subresource, such as `?cors`, add this subresource,\n including the question mark, to the end of the string.\n\n- Be sure to copy the HTTP request path literally: that is, you should include all URL encoding\n (percent signs) in the string that you create. Also, be sure that you include only query string\n parameters that designate subresources (such as `cors`). You should not include query string\n parameters such as `?prefix`, `?max-keys`, `?marker`, and `?delimiter`."]]