Tutorial Penggunaan JSON Web Token (JWT) Menggunakan PHP

Dipublikasikan oleh El Cicko pada

tutorial penggunaan json web token jwt menggunakan php

Pada artikel ini saya akan menjelaskan tentang JSON Web Token atau yang biasa disingkat dengan JWT dan kita juga akan membahas tentang apa itu JWT dan bagaimana cara kerjanya. Selain itu kita akan belajar bagaimana cara membuat JWT dengan PHP.

JSON Web Token (JWT) – Apa Itu JWT ?

Sebelum kita mulai, pertama kita harus memahami terlebih dahulu definisi dari JSON Web Token tersebut.

JSON Web Token (JWT) adalah sebuah JSON Object yang didefinisikan dalam RFC 7519 sebagai cara aman untuk mewakili sekumpulan informasi antara dua pihak. Token terdiri dari header, content, dan signature.

Sederhananya, JWT adalah sebuah string yang memiliki format sebagai berikut :

header.payload.signature

Untuk menunjukkan bagaimana dan mengapa JWT benar-benar digunakan, kita akan menggunakan contoh 3 entitas sederhana (lihat diagram di bawah). Entitas dalam contoh ini adalah user, server aplikasi, dan server otentikasi.

Server otentikasi akan menyediakan JSON Web Token kepada user. Dengan JWT, user dapat berkomunikasi dengan aplikasi dengan aman.

jwt

Pada gambar diatas, user pertama kali masuk ke server otentikasi menggunakan sistem masuk server otentikasi (contoh. username dan password login).

Server otentikasi kemudian membuat JWT dan mengirimkannya ke user. Ketika user membuat panggilan API ke aplikasi, user menyertakan JWT bersama dengan panggilan API tersebut.

Dalam pengaturan ini, server aplikasi akan dikonfigurasikan untuk memverifikasi bahwa JWT yang masuk dibuat oleh server otentikasi.

Jadi, ketika user membuat request API dengan JSON Web Token, aplikasi dapat menggunakan JSON Web Token untuk memverifikasi bahwa request berasal dari user yang diotentikasi.

Sekarang kita akan menggali lebih dalam tentang konsep JWT dan langkah-langkah membuat JWT dengan PHP dari pembuatan hingga proses verifikasi.

JSON Web Token (JWT) – Header

Header adalah sebuah komponen dari JWT yang berisi informasi tentang bagaimana proses kalkulasi & enkripsi untuk Signature dari JWT tersebut.

Header dari JWT itu sendiri adalah sebuah JSON Object dalam format sebagai berikut :

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

Dalam JSON diatas, value dari “typ” menentukan bahwa object adalah JSON Web Token, dan value “alg” menentukan algoritma hashing yang digunakan untuk membuat komponen Signature JSON Web Token.

Dalam contoh ini kita menggunakan algoritma HMAC-SHA256, algoritma hashing yang menggunakan secret key untuk menghitung signature (dibahas lebih rinci dalam langkah 3). Kode untuk membuat header diatas adalah sebagai berikut :

<?php

// Buat Array untuk header lalu convert menjadi JSON
$header = json_encode(['typ'=>'JWT','alg'=>'HS256']);

// Encode header menjadi Base64Url String
$base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header));

echo $base64UrlHeader;
?>

JSON Web Token (JWT) – Payload

Payload adalah salah satu komponen dari JSON Web Token yang berisikan data informasi yang dikirim dari user. Sebagai contoh, kita akan meyisipkan data useriD kedalam JSON Web Token sebagai berikut :

{
   "userId": 12
}

Pada contoh diatas saya hanya menyisipkan 1 data saja ke dalam payload. Kamu bisa menyisipkan data sebanyak apapun kedalam JSON Web Token dengan catatan bahwa semakin banyak data yang disisipkan maka ukuran dari JWT itu sendiri semakin besar. Kondisi ini dapat mempengaruhi kecepatan pengiriman data.

<?php 

// Buat Array payload lalu convert menjadi JSON
$payload = json_encode(['userId'=> 12]);

// Encode Payload menjadi Base64Url String
$base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload));	

echo $base64UrlPayload;

?>

JSON Web Token (JWT) – Signature

Pada bagian ini kita akan membuat signature untuk JSON Web Token. Signature adalah hasil dari enkripsi dari header dan payload dengan menggunakan metode enkripsi HMAC-SHA256.

// algoritma signature
data = base64urlEncode( header ) + “.” + base64urlEncode( payload )

hashedData = hash( data, secret )

signature = base64urlEncode( hashedData )

Pada algoritma diatas signature dibuat dengan mengenkripsi header dan payload yang sudah dibuat pada langkah 1 dan 2 dengan menggunakan metode base64encode.

hasil dari enkripsi tersebut lalu di enkripsi kembali dengan menggunakan metode HMAC-SHA256 lalu yang terakhir di enkripsi kembali ke bentuk base64encode.

<?php
// Buat Signature dengan metode HMAC256
$signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, 'secretkey', true);

// Encode Signature menjadi Base64Url String
$base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature));

echo base64UrlSignature;

?>

JSON Web Token (JWT) – Penggabungan

Pada langkah yang terakhir kita tinggal menggabungkan 3 komponen barusan yang sudah kita encode dengan menggunakan tanda titik (.) sebagai pemisah antar komponen tersebut. Hasilnya maka akan seperti dibawah ini:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyfQ.K4zOu1IABok6NbqksXzC9CtAWAvP1ZS85p3kJBIdXLU

Setelah ini maka kita sudah bisa mengirimkan JSON Web Token (JWT) ke server.

<?php 

// Buat Array untuk header lalu convert menjadi JSON
$header = json_encode(['typ'=>'JWT','alg'=>'HS256']);
// Encode header menjadi Base64Url String
$base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header));

// Buat Array payload lalu convert menjadi JSON
$payload = json_encode(['userId'=> 12]);
// Encode Payload menjadi Base64Url String
$base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload));	

// Buat Signature dengan metode HMAC256
$signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, 'secretkey', true);
// Encode Signature menjadi Base64Url String
$base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature));

// Gabungkan header, payload dan signature dengan tanda titik (.)
$jwt = $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;

// Tampilkan JWT
echo $base64UrlHeader;

?>

Data JWT yang sudah dikirim ke server dapat disimpan ke dalam database untuk keperluan otentikasi, untuk caranya kamu bisa mengunjungi artikel saya sebelumnya yang membahas tentang bagaimana cara untuk menyimpan data json kedalam database MySQL.

Kamu juga dapat memanfaatkan library khusus untuk membuat JWT di https://jwt.io. Selain PHP tersedia juga untuk bahasa pemrograman yang lainnya.

Semoga Bermanfaat


El Cicko

Nama saya Riky Fahri Hasibuan, Saya yang biasa nulis di blog ini. Blog ini adalah sarana dokumentasi dari apa yang saya kerjakan dan tidak ada salahnya juga saya sebarkan. Jika artikel di blog bermanfaat, kamu bisa memberikan apresiasi pada blog ini dengan memberikan donasi pada blog ini.

4 Komentar

Arjun · Januari 23, 2020 pada 9:05 am

Langkahnya kurang jelas. Nggak ada step by step dari awal. Cuma dijelasin codingan aja. Kan yang pemula bingung pertama harus ngapain. Jelek banget sih

    El Cicko · Januari 25, 2020 pada 4:49 am

    penjelasannya udah ada di gambar diagram, untuk codingnya sendiri sebenarnya udah yang paling simple.

      bambang · Februari 1, 2020 pada 12:41 am

      mungkin maksudnya persiapan file2 php apa saja yg disiapkan, misal signature.php dan sebagainya, kemudian prosesnya bagaimana dalam kodingnya dari awal sampai bisa terkoneksi dan berhasil menampilkan data berupa json dari api server….

Wawan · Maret 8, 2020 pada 10:36 pm

Berbaginya jgn setengah-setengah mas, kalo lengkap kan bisa jadi amal jariyah buat mas sendiri juga, kalo yg mas sampaikan bisa selalu dipake orang lain.. kalo kayak gini nanggung, cuman angin lalu aja.. cuman sekedar saran aja mas..

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *