Apa itu Token Web JSON (JWT)? Mengapa API Menggunakannya?

  • Post author:
  • Post category:Tutorial

Standar JSON Web Tokens (JWT) menjelaskan metode ringkas untuk transfer data yang dapat diverifikasi. Setiap token berisi tanda tangan yang memungkinkan pihak penerbit untuk memeriksa integritas pesan.

Dalam artikel ini, Anda akan mempelajari apa yang termasuk dalam struktur JWT dan bagaimana Anda dapat menghasilkan token Anda sendiri. JWT adalah cara populer untuk mengamankan API dan mengautentikasi sesi pengguna karena sederhana dan mandiri.

Bagaimana JWT Bekerja

Salah satu tugas paling umum di API apa pun adalah memvalidasi bahwa pengguna adalah siapa yang mereka klaim. Otentikasi biasanya ditangani dengan meminta klien menyertakan kunci API dengan permintaan yang dikirimnya ke server. Kunci berisi informasi tertanam yang mengidentifikasi pengguna. Ini masih menyisakan satu pertanyaan besar: bagaimana server dapat memvalidasi bahwa ia mengeluarkan kunci di tempat pertama?

JWTs dengan mudah memecahkan masalah ini dengan menggunakan rahasia untuk menandatangani setiap token. Server dapat memeriksa validitas token dengan mencoba menghitung ulang tanda tangan yang disajikan menggunakan rahasia pribadinya. Setiap gangguan akan menyebabkan verifikasi gagal.

Format JWT

JWT dibentuk dari tiga komponen berbeda:

Header – Ini termasuk metadata tentang token itu sendiri, seperti algoritma penandatanganan yang digunakan.Payload – Muatan token dapat berupa data arbitrer yang relevan dengan sistem Anda. Ini dapat mencakup ID pengguna dan daftar fitur yang dapat berinteraksi dengan mereka. Tanda Tangan – Tanda tangan memungkinkan integritas token divalidasi di masa mendatang. Itu dibuat dengan menandatangani header dan payload menggunakan nilai rahasia yang hanya diketahui oleh server.

Ketiga komponen ini digabungkan dengan titik untuk menghasilkan JWT:

header.payload.signature

Setiap bagian dikodekan menggunakan Base-64. Token lengkap adalah string teks yang dapat dengan mudah digunakan di lingkungan pemrograman dan dikirim dengan permintaan HTTP.

Membuat JWT

Langkah-langkah untuk membuat JWT dapat diterapkan di semua bahasa pemrograman. Contoh ini menggunakan PHP tetapi prosesnya akan serupa di sistem Anda sendiri.

Mulailah dengan membuat header. Ini biasanya mencakup dua bidang, alg dan ketik:

alg – Algoritma hashing yang akan digunakan untuk membuat tanda tangan. Ini biasanya HMAC SHA256 (HS256).typ – Jenis token yang dihasilkan. Ini seharusnya JWT.

Inilah JSON yang mendefinisikan header:

{ "alg": "HS256", "typ": "JWT" ​​}

Header JSON harus dikodekan Base64 selanjutnya:

$headerData=["alg" =>"HS256","typ"=>"JWT"];
$header=base64_encode(json_encode($headerData));

Selanjutnya tentukan payload token Anda sebagai objek JSON lainnya. Ini khusus aplikasi. Contoh ini menawarkan detail akun pengguna yang diautentikasi, serta informasi tentang token itu sendiri. exp, iat, dan nbf adalah bidang yang digunakan oleh konvensi untuk menyatakan waktu kedaluwarsa token, dikeluarkan pada waktu, dan tidak valid sebelum waktu (mulai). Payload juga harus dikodekan Base64.

$payloadData=["userId"=>1001,"userName"=>"demo","licensedFeatures"=>["todos","calendar","invoicing"], "exp"=>(time()+900),"iat"=>time(),"nbf"=>time()];
$payload=base64_encode(json_encode($payloadData));

Yang tersisa adalah membuat tanda tangan. Untuk menghasilkan ini, pertama-tama Anda menggabungkan header dan payload menjadi satu string yang dipisahkan oleh . character:

$headerAndPayload="$header.$payload";

Selanjutnya Anda harus membuat rahasia unik untuk digunakan sebagai kunci penandatanganan Anda. Rahasia harus disimpan dengan aman di server Anda dan tidak boleh dikirim ke klien. Paparan nilai ini akan memungkinkan siapa pun untuk membuat tokens.

// metode PHP yang valid untuk menghasilkan 32 karakter acak
$secret=bin2hex(openssl_random_pseudo_bytes(16));

Anda menyelesaikan proses dengan menggunakan rahasia untuk menandatangani header gabungan dan string payload menggunakan algoritma hashing yang Anda tunjukkan di header. Tanda tangan keluaran harus dikodekan Base64 seperti komponen lainnya.

$signature=base64_encode(hash_hmac("sha256",$headerAndPayload,$secret,true));

Sekarang Anda memiliki header, payload, dan tanda tangan sebagai teks individual komponen. Bergabunglah dengan mereka semua bersama-sama dengan . pemisah untuk membuat JWT untuk dikirim ke klien Anda:

$jwt="$header.$payload.$signature";

Memverifikasi JWTs

Aplikasi klien dapat menentukan fitur yang tersedia bagi pengguna dengan mendekode muatan token. Berikut ini contoh dalam JavaScript:

const tokenComponents = jwt.split(".");
const payload = token[1];
const payloadDecoded = JSON.parse(atob(payload)); 
// ["todos", "calendar", "invoicing"] 
console.log(payloadDecoded.licensedFeatures);

Seorang penyerang mungkin menyadari bahwa data ini adalah teks biasa dan terlihat mudah dimodifikasi. Mereka dapat mencoba meyakinkan server bahwa mereka memiliki fitur bonus dengan mengubah payload token di permintaan berikutnya:

// Buat komponen payload baru
const modifiedPayload = btoa(JSON.stringify({ ...payloadDecoded, licenseFeatures:[" todos", "kalender", "faktur", "Fitur ExtraPremium"]})); 
// Jahit kembali JWT dengan header asli dan signature
const newJwt = `${token[0]}.${modifiedPayload}.${token[2]}`

Jawaban tentang bagaimana server bertahan dari serangan ini terletak pada metode yang digunakan untuk menghasilkan tanda tangan. Nilai tanda tangan memperhitungkan header dan muatan token. Memodifikasi payload, seperti dalam contoh ini, berarti tanda tangan tidak lagi valid.

Kode sisi server memverifikasi JWT yang masuk dengan menghitung ulang tanda tangannya. Token telah diubah jika tanda tangan yang dikirim oleh klien tidak cocok dengan nilai yang dihasilkan di server.

$tamperedToken=$_POST["apiKey"];list($header,$payload,$signature)=$tamperedToken ; // Tentukan tanda tangan yang dimiliki token ini *harus* // ketika rahasia server digunakan sebagai kunci$expectedSignature=hash_hmac("sha256","$header.$payload",$secret,true); // Token telah dirusak karena // tanda tangannya salah untuk data yang disertakanif($signature!==$expectedSignature){ http_response_code(403);}// Tanda tangan cocok - kami membuat token // ini dan dapat dengan aman mempercayai dataelse{$user= fetchUserById($payload["userId"]);}

Penyerang tidak mungkin membuat token yang valid tanpa akses ke rahasia server. Ini juga berarti bahwa kehilangan yang tidak disengaja – atau rotasi yang disengaja – dari rahasia akan segera membatalkan semua token yang dikeluarkan sebelumnya.

Dalam situasi dunia nyata, kode autentikasi Anda juga harus memeriksa kedaluwarsa dan cap waktu “bukan sebelum” dalam muatan token. Ini digunakan untuk menentukan apakah sesi pengguna masih valid.

Kapan Menggunakan JWTs

JWT sering digunakan untuk autentikasi API karena mudah diterapkan di server, mudah digunakan di klien, dan mudah dikirim melintasi batas jaringan. Terlepas dari kesederhanaannya, mereka memiliki keamanan yang baik karena setiap token ditandatangani menggunakan kunci rahasia server.

JWTs adalah mekanisme tanpa kewarganegaraan sehingga Anda tidak perlu mencatat informasi tentang token yang diterbitkan di server Anda. Anda bisa mendapatkan informasi tentang klien yang menyajikan JWT dari payload token, daripada harus melakukan pencarian di database. Informasi ini dapat dipercaya dengan aman setelah Anda memverifikasi tanda tangan token.

Menggunakan JWT adalah pilihan yang baik kapan pun Anda perlu bertukar informasi antara dua pihak tanpa risiko gangguan. Ada titik lemah yang harus diperhatikan: seluruh sistem akan dikompromikan jika kunci rahasia server Anda bocor, atau kode verifikasi tanda tangan Anda mengandung bug. Untuk alasan ini banyak pengembang memilih untuk menggunakan perpustakaan sumber terbuka untuk mengimplementasikan pembuatan dan validasi JWT. Opsi tersedia untuk semua bahasa pemrograman populer. Mereka menghilangkan risiko pengawasan saat Anda memverifikasi token sendiri.

Kesimpulan

Standar JWT adalah format pertukaran data yang mencakup verifikasi integritas bawaan. JWT biasanya digunakan untuk mengamankan interaksi antara server API dan aplikasi klien. Server dapat mempercayai token yang masuk jika dapat mereproduksi tanda tangannya. Hal ini memungkinkan tindakan dilakukan dengan aman menggunakan informasi yang diperoleh dari payload token.

JWT nyaman tetapi memiliki beberapa kelemahan. Representasi tekstual yang disandikan Base64 JWT dapat dengan cepat menjadi besar jika Anda memiliki lebih dari beberapa bidang muatan. Ini bisa menjadi biaya tambahan yang tidak dapat diterima ketika klien Anda perlu mengirim JWT dengan setiap permintaan.

Ketidakbernegaraan JWT juga merupakan potensi kerugian lain: setelah dikeluarkan, token tidak dapat diubah dan harus digunakan apa adanya sampai kedaluwarsa. Klien yang menggunakan muatan JWT untuk menentukan izin pengguna atau fitur berlisensi perlu mendapatkan token baru dari backend setiap kali penetapan mereka berubah.

Itulah berita seputar Apa itu Token Web JSON (JWT)? Mengapa API Menggunakannya?, semoga bermanfaat. Disadur dari HowToGeek.com.