YAML

**YAML** adalah format serialisasi data terbaca-manusia yang mengambil konsep dari bahasa-bahasa seperti XML, C, Python, Perl, serta format surat elektronik seperti yang tercantum dalam RFC 2822. YAML pertama kali diusulkan oleh Clark Evans pada tahun 2001  yang merancang format ini bersama dengan Ingy döt Net dan Oren Ben-Kiki. YAML tersedia bagi beberapa bahasa dan skrip pemrograman.

## Sejarah
YAML dikembangkan oleh Clark Evans, Oren Ben-Kiki, dan Ingy dot Net. Draf pertama YAML resmi dirilis sebagai versi 0.1 pada Mei 2001. YAML mencapai rilis lengkap dalam versi 1.0 pada awal 2004. Sebelum versi 1.0 selesai, YAML telah diimplementasikan lebih dulu seperti dalam Perl pada 2001 dan Ruby pada 2003.

YAML aslinya merupakan kepanjangan dari "Yet Another Markup Language", tetapi pada April 2002 kepanjangannya telah berubah menjadi akronim rekursif dari "YAML Ain't Markup Language".

Pada 2024, RFC  menetapkan tipe MIME `application/yaml` untuk berkas YAML.
## Fitur
YAML dirancang untuk mudah dibaca dan ditulis oleh manusia dengan menerapkan penggunaan sensitif terhadap indentasi dan spasi kosong (*whitespace*). Indentasi YAML harus menggunakan spasi, bukan tab.

### Contoh
Berikut ini adalah contoh metadata buku dalam YAML. Data `judul` dan `pengarang` merupakan bentuk pasangan kunci-nilai, sementara `bahasa` merupakan bentuk larik yang dinotasikan dengan daftar berbutir.

```yaml
judul: 1984
pengarang: "George Orwell"
bahasa:
    - Inggris
    - Indonesia
```


### Struktur data
YAML menetapkan tiga jenis struktur data, yaitu *[[Prosesor skalar|scalar]]*, *sequence*, dan *mapping*. *Scalar* meliputi string, bilangan, stempel waktu, boolean, dan null. *Sequence* merupakan larik atau daftar yang urut. *Mapping* merupakan pasangan kunci-nilai yang tidak urut.

Sebuah *scalar* bisa diapit dengan tanda petik, khususnya ketika nilai mengandung bilangan tetapi diharuskan menjadi tipe string seperti `1984`:
```yaml
"judul": "1984"
"pengarang": "George Orwell"
"bahasa":
    - "Inggris"
    - "Indonesia"
```


#### Tag
*Tag* digunakan untuk mengenali tipe data. Sebuah data bisa diberi *tag* secara jelas (eksplisit) dengan `!`, sementara data biasa akan diberikan *tag* secara tersirat oleh implementasi saat diproses. Contoh berikut menggunakan *tag* eksplisit, `!!str` pada nilai `1984` untuk mencegah diartikan sebagai bilangan bulat:
```yaml
judul: !!str 1984 # sama dengan "1984"
pengarang: "George Orwell"
bahasa:
    - Inggris
    - Indonesia
```


### Ekspresi blok dan alir
YAML memungkinkan dua gaya ekspresi, yaitu gaya blok (*block*) yang berbasis indentasi dan gaya alir (*flow*) yang mirip JSON. Contoh berikut menggunakan `---` untuk menandakan dokumen baru:
```yaml
---
# Gaya blok
judul: 1984
pengarang: "George Orwell"
bahasa:
    - Inggris
    - Indonesia
   
---
# Gaya alir 
judul: 1984
pengarang: "George Orwell"
bahasa: [ "Inggris", "Indonesia" ]  # atau juga bisa { Inggris, Indonesia }
```


### ''Anchor'' dan ''alias''
*Anchor* dan *alias* adalah fitur YAML yang memungkinkan pengguna "menggunakan kembali" data tanpa harus mengulang penulisannya. *Anchor* ditandai dengan `&` dan *alias* ditandai dengan `*`.
```yaml
- buku_1:
    judul: 1984
    pengarang: "George Orwell"
    bahasa: &bahasa
      [ "Inggris", "Indonesia" ]

# Nilai bahasa di sini sama dengan nilai bahasa pada buku_1
- buku_2:
    judul: "Art of War"
    pengarang: "Sun Tzu"
    bahasa: *bahasa
```


## Penggunaan
YAML luas digunakan sebagai berkas konfigurasi untuk otomasi DevOps. khususnya Kubernetes untuk konfigurasi berbagai sumber daya yang akan dipakai berbagai kontainer. GitHub Actions dan GitLab CI/CD juga menggunakan YAML untuk konfigurasi alur kerja pembangunan perangkat lunak. 

TensorFlow sebelumnya mendukung konfigurasi model berbasis YAML hingga 2021.

## Keamanan implementasi
Beberapa implementasi kerap menghadapi celah keamanan karena rancangan YAML membolehkan tipe data yang ditentukan sendiri sehingga rentan disalahgunakan untuk eksekusi kode jarak jauh. Pada 2017, para ahli keamanan melaporkan celah pada implementasi Python PyYAML sebelum versi 5.1, CVE-2017-18342, bahwa API `yaml.load()` dapat dieksploitasi untuk menjalankan kode jarak jauh. Kendati telah ditanggapi, perbaikannya tidak sepenuhnya tuntas karena masih bisa dieksploitasi melalui *tag* konstruktor PyYAML yang spesifik seperti `!!python/object/apply`. Celah ini dilaporkan dalam CVE-2019-20477.

Sebuah penelitian dari 2019 menunjukkan bahwa fitur *anchor* dan *alias* bisa dieksploitasi sebagai serangan kegagalan layanan (*denial-of-service*) dengan cara kerja yang mirip bom zip.

## Referensi

## Daftar pustaka
* 
* 

## Pranala luar
*  Situs web resmi
*  Repositori di GitHub
*  Laman pengembangan spesifikasi terbaru