Ticketing
Dokumentasi

Auth Handshake

Langkah bersama yang dipakai identik byte demi byte oleh port klien dan port Raft milik cluster. Begitu koneksi terbentuk (setelah TLS handshake selesai, jika TLS dipakai), server berbicara lebih dulu dan mengirim challenge. Ini adalah pertukaran teks dua baris yang dipisahkan newline (\n), dilakukan sekali per koneksi.

Satu-satunya yang berbeda per port adalah set token mana yang dipakai untuk verifikasi — port klien memverifikasi terhadap client_tokens, port Raft terhadap cluster_tokens. Lihat Koneksi & Auth (Cluster) untuk aturan token spesifik port Raft (token mana yang dikirim, dan cara merotasi token tanpa downtime).

Alur

Penyambung (klien · peer)
Server
Koneksi TCP · (TLS handshake)
challenge: SHA-256 ␣ nonce
digest = SHA-256(token ∥ nonce) · 43 karakter
constant-time compare terhadap seluruh daftar token
sukses → tanpa balasan, protokol langsung dimulai
request pertama langsung dikirim (mis. A · acquire)
jika gagal
E · auth_failed → koneksi ditutup
permintaanrespons

1. Challenge (server → penyambung)

Strukturrefresh
<hash> <nonce>\n            mis. SHA-256 aB3dEf_g\n
FieldIsi
hashNama algoritma digest. Saat ini selalu SHA-256, dan server tidak menerima yang lain
nonceNilai acak base64url 8 karakter. Framing berbasis newline, jadi panjangnya bisa bertambah di kemudian hari — penyambung harus memperlakukan semua yang ada setelah spasi pertama sebagai nonce

2. Response (penyambung → server)

Strukturrefresh
<digest>\n

digest = base64url_nopad( SHA-256( token_bytes ∥ nonce_bytes ) )

( adalah penggabungan byte — byte ASCII string nonce ditambahkan langsung setelah byte mentah token)

  • base64url adalah alfabet url-safe tanpa padding (A–Z a–z 0–9 - _). Digest SHA-256 selalu berjumlah 43 karakter.
  • Server memverifikasi dengan constant-time compare terhadap seluruh daftar token yang dikonfigurasi — token mana yang cocok, atau seberapa jauh perbandingan berjalan, tidak pernah bocor lewat timing.
  • Server tanpa token yang dikonfigurasi menerima satu token kosong "". Dalam kasus itu, mengirim digest = base64url(SHA-256(nonce)) akan lolos. Langkah handshake itu sendiri tidak pernah bisa dilewati.
  • Baris respons yang dibaca server dibatasi maksimum 256 byte.

3. Hasil

  • Sukses: server tidak mengirim apa pun dan langsung beralih ke protokol utama — protokol binary frame lock di port klien, atau RPC length-prefix di port Raft. Kirim request pertama langsung.
  • Gagal: server mengirim E auth_failed lalu menutup koneksi. Jika koneksi putus atau baris tidak valid di tengah handshake, koneksi juga bisa langsung tertutup diam-diam tanpa frame error.

Terminologi

  • challenge-response — skema autentikasi di mana, alih-alih mengirim rahasia (token) secara langsung, server mengajukan challenge sekali pakai dan penyambung membuktikan tahu rahasianya dengan mengirim balik hanya jawabannya.
  • nonce — angka yang dipakai sekali (number used once). Berubah setiap koneksi, sehingga respons yang dicuri tidak bisa dipakai ulang dalam serangan replay.
  • constant-time compare — perbandingan yang selalu memakan waktu sama tidak peduli seberapa jauh kecocokannya, menutup serangan timing yang bisa membocorkan rahasia.
  • base64url — varian base64 yang hanya memakai alfabet url-safe (A–Z a–z 0–9 - _). Dipakai di sini tanpa padding (=).