

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Otentikasi Permintaan: Menggunakan Parameter Kueri (AWS Versi Tanda Tangan 4)
<a name="sigv4-query-string-auth"></a>

Seperti dijelaskan dalam ikhtisar otentikasi (lihat[Metode Autentikasi](sig-v4-authenticating-requests.md#auth-methods-intro)), Anda dapat memberikan informasi otentikasi menggunakan parameter string kueri. Menggunakan parameter kueri untuk mengotentikasi permintaan berguna ketika Anda ingin mengungkapkan permintaan sepenuhnya dalam URL. Metode ini juga disebut sebagai penandatanganan URL. 

Skenario kasus penggunaan untuk URL yang ditandatangani sebelumnya adalah Anda dapat memberikan akses sementara ke sumber daya Amazon S3 Anda. Misalnya, Anda dapat menyematkan URL yang telah ditandatangani sebelumnya di situs web Anda atau menggunakannya di klien baris perintah (seperti Curl) untuk mengunduh objek.

**catatan**  
Anda juga dapat menggunakan AWS CLI untuk membuat URL yang ditandatangani sebelumnya. Untuk informasi selengkapnya, lihat [`presign`](https://docs.aws.amazon.com/cli/latest/reference/s3/presign.html) dalam *AWS CLI Referensi Perintah*.

Berikut ini adalah contoh URL yang ditandatangani sebelumnya. 

 

```
https://examplebucket.s3.amazonaws.com/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential={{<your-access-key-id>}}/20130721/us-east-1/s3/aws4_request
&X-Amz-Date=20130721T201207Z
&X-Amz-Expires=86400
&X-Amz-SignedHeaders=host
&X-Amz-Signature={{<signature-value>}}
```



Dalam contoh URL, perhatikan hal berikut:

 
+ Umpan baris ditambahkan untuk keterbacaan.
+ `X-Amz-Credential`Nilai dalam URL menunjukkan karakter “/” hanya untuk keterbacaan. Dalam praktiknya, itu harus dikodekan sebagai`%2F`. Contoh:

   

  ```
  &X-Amz-Credential={{<your-access-key-id>}}%2F20130721%2Fus-east-1%2Fs3%2Faws4_request
  ```

  

Tabel berikut menjelaskan parameter kueri di URL yang menyediakan informasi otentikasi. 


| Nama Parameter String Kueri | Nilai Contoh | 
| --- | --- | 
| X-Amz-Algorithm | Mengidentifikasi versi T AWS anda Tangan dan algoritma yang Anda gunakan untuk menghitung tanda tangan. <br />Untuk AWS Signature Version 4, Anda menetapkan nilai parameter ini ke`AWS4-HMAC-SHA256`. String ini mengidentifikasi AWS Signature Version 4 (AWS 4) dan HMAC-SHA256 algoritma (HMAC-SHA256).  | 
| X-Amz-Credential | Selain ID kunci akses Anda, parameter ini juga menyediakan ruang lingkup (Wilayah AWS dan layanan) yang tanda tangannya valid. Nilai ini harus sesuai dengan cakupan yang Anda gunakan dalam perhitungan tanda tangan, dibahas di bagian berikut. Bentuk umum untuk nilai parameter ini adalah sebagai berikut:<br /> <pre>{{<your-access-key-id>}}/{{<date>}}/{{<Wilayah AWS>}}/{{<AWS-service>}}/aws4_request</pre><br />Contoh: <br /> <pre>AKIAIOSFODNN7EXAMPLE/20130721/us-east-1/s3/aws4_request</pre><br />Untuk Amazon S3, {{AWS-service}} string adalah`s3`. Untuk daftar `AWS-region` string S3, lihat Wil [ ayah dan Titik Akhir ](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) di *Referensi Umum AWS*. | 
| X-Amz-Date | Format tanggal dan waktu harus mengikuti standar ISO 8601, dan harus diformat dengan format "{{yyyyMMdd}}T {{HHmmss}} Z”. Misalnya jika tanggal dan waktu adalah "08/01/2016 15:32:41.982-700" maka pertama-tama harus dikonversi ke UTC (Waktu Universal Terkoordinasi) dan kemudian dikirimkan sebagai “20160801T223241Z”.  | 
| X-Amz-Expires | Menyediakan periode waktu, dalam detik, di mana URL yang telah ditandatangani sebelumnya valid. Misalnya, `86400` (24 jam). Nilai ini adalah bilangan bulat. Nilai minimum yang dapat Anda tetapkan adalah 1, dan maksimum adalah 604800 (tujuh hari).<br />URL yang telah ditandatangani dapat berlaku maksimal tujuh hari karena kunci penandatanganan yang Anda gunakan dalam perhitungan tanda tangan berlaku hingga tujuh hari.  | 
| X-Amz-SignedHeaders | Daftar header yang Anda gunakan untuk menghitung tanda tangan. Header berikut diperlukan dalam perhitungan tanda tangan:<br /> +  `host`Header HTTP. <br />+  Setiap `x-amz-*` header yang Anda rencanakan untuk ditambahkan ke permintaan. <br />   Untuk keamanan tambahan, Anda harus menandatangani semua header permintaan yang Anda rencanakan untuk disertakan dalam permintaan Anda.  | 
| X-Amz-Signature | Menyediakan tanda tangan untuk mengotentikasi permintaan Anda. Tanda tangan ini harus sesuai dengan tanda tangan yang dihitung Amazon S3; jika tidak, Amazon S3 menolak permintaan tersebut. Sebagai contoh, ` 733255ef022bec3f2a8701cd61d4b371f3f28c9f193a1f02279211d48d5193d7`.<br />Perhitungan tanda tangan dijelaskan di bagian berikut. | 
| X-Amz-Security-Token | Parameter kredensi opsional jika menggunakan kredenSIAL yang bersumber dari layanan STS. | 



## Menghitung Tanda Tangan
<a name="query-string-auth-v4-signing"></a>

Diagram berikut menggambarkan proses perhitungan tanda tangan. 

 

![AWS Proses penandatanganan Signature Versi 4 dengan permintaan kanonik, string untuk ditandatangani, dan langkah-langkah pembuatan tanda tangan.](https://docs.aws.amazon.com/id_id/AmazonS3/latest/developerguide/images/sigV4-using-query-params.png)




Tabel berikut menjelaskan fungsi yang ditunjukkan dalam diagram. Anda perlu menerapkan kode untuk fungsi-fungsi ini.


| Fungsi | Deskripsi | 
| --- | --- | 
| Lowercase() | Ubah string menjadi huruf kecil. | 
| Hex() | Pengkodean huruf kecil 16. | 
| SHA256Hash() | Fungsi hash kriptografi Secure Hash Algorithm (SHA). | 
| HMAC-SHA256() | Menghitung HMAC dengan menggunakan algoritma SHA256 dengan kunci penandatanganan yang disediakan. Ini adalah tanda tangan terakhir. | 
| Trim() | Hapus spasi kosong di depan atau di belakang.  | 
| UriEncode() | URI mengkodekan setiap byte. UriEncode() harus menegakkan aturan berikut:+  URI mengkodekan setiap byte kecuali karakter tanpa syarat: 'A'-'Z', 'a'-'z', '0'-'9', '-', ' . ',' \_ ', dan '\~'.  <br />+ Karakter spasi adalah karakter yang dicadangkan dan harus dikodekan sebagai “%20" (dan bukan sebagai “\+”). <br />+ Setiap byte yang dikodekan URI dibentuk oleh '%' dan nilai heksadesimal dua digit byte. <br />+ Huruf dalam nilai heksadesimal harus huruf besar, misalnya “%1A”. <br />+ Enkode karakter garis miring ke depan, '/', di mana-mana kecuali dalam nama kunci objek. Misalnya, jika nama kunci objek adalah`photos/Jan/sample.jpg`, garis miring ke depan dalam nama kunci tidak dikodekan.   UriEncode Fungsi standar yang disediakan oleh platform pengembangan Anda mungkin tidak berfungsi karena perbedaan dalam implementasi dan ambiguitas terkait dalam RFC yang mendasarinya. Kami menyarankan Anda menulis UriEncode fungsi kustom Anda sendiri untuk memastikan bahwa pengkodean Anda akan berfungsi. <br />Berikut ini adalah contoh fungsi UriEncode () di Java.<pre>public static String UriEncode(CharSequence input, boolean encodeSlash) {<br />          StringBuilder result = new StringBuilder();<br />          for (int i = 0; i < input.length(); i++) {<br />              char ch = input.charAt(i);<br />              if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') {<br />                  result.append(ch);<br />              } else if (ch == '/') {<br />                  result.append(encodeSlash ? "%2F" : ch);<br />              } else {<br />                  result.append(toHexUTF8(ch));<br />              }<br />          }<br />          return result.toString();<br />      }</pre> | 

Untuk informasi selengkapnya tentang proses penandatanganan (detail pembuatan permintaan kanonik, string untuk ditandatangani, dan perhitungan tanda tangan), lihat[Perhitungan Tanda Tangan untuk Header Otorisasi: Mentransfer Payload dalam Satu Potongan (AWS Versi Tanda Tangan 4)](sig-v4-header-based-auth.md). Prosesnya umumnya sama kecuali bahwa pembuatan ** CanonicalRequest ** dalam URL yang telah ditandatangani berbeda sebagai berikut:

 
+ Anda tidak menyertakan hash payload di ** Canonical Request**, karena ketika Anda membuat URL yang telah ditandatangani sebelumnya, Anda tidak mengetahui konten payload karena URL digunakan untuk mengunggah payload sewenang-wenang. Sebagai gantinya, Anda menggunakan string konstan`UNSIGNED-PAYLOAD`. 
+ **Canonical Query String ** harus menyertakan semua parameter kueri dari tabel sebelumnya kecuali untuk`X-Amz-Signature`. 
+ Untuk S3, Anda harus menyertakan parameter ku `X-Amz-Security-Token` eri di URL jika menggunakan kredenSIAL yang bersumber dari layanan STS.
+ **Header kanonik ** harus menyertakan header HTTP`host`. Jika Anda berencana untuk menyertakan salah satu `x-amz-* ` header, header ini juga harus ditambahkan untuk perhitungan tanda tangan. Anda dapat secara opsional menambahkan semua header lain yang Anda rencanakan untuk disertakan dalam permintaan Anda. Untuk keamanan tambahan, Anda harus menandatangani header sebanyak mungkin. Jika Anda menambahkan header yang ditandatangani yang juga merupakan parameter kueri yang ditandatangani, dan nilainya berbeda, Anda akan menerima `InvalidRequest` kesalahan karena input bertentangan.

## Sebuah contoh
<a name="query-string-auth-v4-signing-example"></a>

Misalkan Anda memiliki objek `test.txt` di `examplebucket` ember Anda. Anda ingin berbagi objek ini dengan orang lain untuk jangka waktu 24 jam (86400 detik) dengan membuat URL yang telah ditandatangani sebelumnya. 

 

```
https://examplebucket.s3.amazonaws.com/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request
&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host
&X-Amz-Signature={{<signature-value>}}
```

Langkah-langkah berikut menggambarkan terlebih dahulu perhitungan tanda tangan dan kemudian konstruksi URL yang telah ditandatangani sebelumnya. Contoh membuat asumsi tambahan berikut:

 
+ Stempel waktu permintaan adalah. `Fri, 24 May 2013 00:00:00 GMT`
+ Bucket berada di wilayah AS Timur (Virginia Utara), dan kreden `Scope` si serta `Signing Key` perhitungan digunakan `us-east-1` sebagai penentu wilayah.  Untuk informasi selengkapnya, lihat [ Wilayah dan Titik Ak ](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) hir di *Referensi Umum AWS*. 

Anda dapat menggunakan contoh ini sebagai kasus uji untuk memverifikasi tanda tangan yang dihitung kode Anda; namun, Anda harus menggunakan nama bucket yang sama, kunci objek, stempel waktu, dan kredenSIAL contoh berikut:


| Parameter | Nilai | 
| --- | --- | 
| AWSAccessKeyId | AKIAIOSFODNN7EXAMPLE | 
| AWSSecretAccessKey | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY | 

1. 

**StringToSign**

   1. 

**CanonicalRequest**

       

      ```
      GET
      /test.txt
      X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host
      host:examplebucket.s3.amazonaws.com
      
      host
      UNSIGNED-PAYLOAD
      ```

       

   1. 

**StringToSign**

       

      ```
      AWS4-HMAC-SHA256
      20130524T000000Z
      20130524/us-east-1/s3/aws4_request
      3bfa292879f6447bbcda7001decf97f4a54dc650c8942174ae0a9121cf58ad04
      ```

       

1. 

**SigningKey**

    

   ```
   signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "{{<YourSecretAccessKey>}}","20130524"),"us-east-1"),"s3"),"aws4_request")
   ```

    

1. 

**Tanda tangan**

    

   ```
   aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404
   ```

    

   Sekarang Anda memiliki semua informasi untuk membangun URL yang telah ditandatangani sebelumnya. URL yang dihasilkan untuk contoh ini ditampilkan sebagai berikut (Anda dapat menggunakan ini untuk membandingkan URL yang telah ditandatangani sebelumnya):

   ```
   https://examplebucket.s3.amazonaws.com/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404
   ```

## Contoh 2
<a name="query-string-auth-v4-signing-example-2"></a>

Berikut ini adalah contoh (tidak terkait dengan contoh sebelumnya) yang menunjukkan URL yang ditandatangani sebelumnya dengan `X-Amz-Security-Token` parameter.

```
https://examplebucket.s3.us-east-1.amazonaws.com/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request
&X-Amz-Date=20200524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host
&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEMv%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJGMEQCIBSUbVdj9YGs2g0HkHsOHFdkwOozjARSKHL987NhhOC8AiBPepRU1obMvIbGU0T%2BWphFPgK%2Fqpxaf5Snvm5M57XFkCqlAgjz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDQ3MjM4NTU0NDY2MCIM83pULBe5%2F%2BNm1GZBKvkBVslSaJVgwSef7SsoZCJlfJ56weYl3QCwEGr2F4BmCZZyFpmWEYzWnhNK1AnHMj5nkfKlKBx30XAT5PZGVrmq4Vkn9ewlXQy1Iu3QJRi9Tdod8Ef9%2FyajTaUGh76%2BF5u5a4O115jwultOQiKomVwO318CO4l8lv%2F3HhMOkpdanMXn%2B4PY8lvM8RgnzSu90jOUpGXEOAo%2F6G8OqlMim3%2BZmaQmasn4VYRvESEd7O72QGZ3%2BvDnDVnss0lSYjlv8PP7IujnvhZRnj0WoeOyMe1lL0wTG%2Fa9usH5hE52w%2FYUJccOn0OaZuyROuVsRV4Q70sbWQhUvYUt%2B0tUMKzm8vsFOp4BaNZFqobbjtb36Y92v%2Bx5kY6i0s8QE886jJtUWMP5ldMziClGx3p0mN5dzsYlM3GyiJ%2FO1mWkPQDwg3mtSpOA9oeeuAMPTA7qMqy9RNuTKBDSx9EW27wvPzBum3SJhEfxv48euadKgrIX3Z79ruQFSQOc9LUrDjR%2B4SoWAJqK%2BGX8Q3vPSjsLxhqhEMWd6U4TXcM7ku3gxMbzqfT8NDg%3D
&X-Amz-Signature={{<signature-value>}}
```