Baru-baru ini saya ingin mempelajari lebih lanjut tentang JSON Web Token (JWT) dan cara kerjanya. Saya menemukan beberapa contoh sisi server dan beberapa contoh sisi klien, tetapi benar-benar tidak pernah menemukan satu tempat pun yang mendemonstrasikan seluruh siklus. Jadi saya buat sendiri dan saya bagikan di sini Show Secara historis, saya telah mengelola keamanan menggunakan variabel sesi PHP, yang merupakan metode yang memiliki beberapa kelemahan. Pertama, ini memerlukan manajemen sisi server jika Anda menyeimbangkan beban beberapa server web. Anda mungkin perlu mengimplementasikan solusi caching seperti Redis atau Memcache dan menentukan server caching untuk menyimpan sesi. Kedua, di sisi klien, PHP menyimpan cookie sesi yang memungkinkan pemaparan informasi variabel sesi yang digunakan dalam skema autentikasi Anda JWT menyelesaikan ini dengan menggunakan token yang dibuat di server dan berisi informasi spesifik tentang klien autentikasi yang di-hash dan disandikan. Token ini kemudian diserahkan kembali ke klien, yang dapat menggunakan token ini dengan permintaan API di masa mendatang dan tidak memerlukan autentikasi lebih lanjut Rincian JWT JWT dibangun dengan tiga komponen. header, payload, dan tanda tangan Header berisi informasi mengenai algoritma mana yang digunakan untuk mencirikan token. Dalam contoh kami, kami akan menggunakan HMAC-SHA256, algoritme yang menggunakan kunci rahasia Muatan (juga disebut klaim token) berisi data yang disimpan di dalam token. Dalam contoh kami, kami akan menyimpan id pengguna dari pengguna yang diautentikasi di payload. Meskipun kami hanya akan menyimpan satu item di payload, Anda dapat menyimpan klaim sebanyak yang Anda inginkan. Perlu diingat bahwa Anda harus mempertimbangkan kinerja saat melakukannya dan ingat bahwa token tidak dimaksudkan sebagai kendaraan untuk mentransfer permintaan data, melainkan hanyalah alat yang digunakan dalam otentikasi permintaan data Dalam contoh kami, id pengguna dalam token dapat digunakan di server sebagai kunci indeks untuk meminta informasi khusus untuk pengguna yang diautentikasi dalam permintaan berikutnya, tanpa meminta pengguna untuk mengidentifikasi dirinya lagi — misalnya, mengarahkan pengguna ke halaman Ada juga beberapa klaim standar yang dapat dimasukkan dalam muatan seperti Tanda tangan adalah representasi hash dari header dan payload. Header dan payload masing-masing dikodekan base64url dan kemudian digabungkan bersama dengan Dan begitulah cara kerjanya. Ada banyak artikel di luar sana yang juga menjelaskan hal ini, tetapi setidaknya kami telah menyiapkan panggung untuk contoh kami. Mari kita masuk ke dalamnya Contoh Contoh saya menggunakan tiga file yang dapat diunduh secara bebas dari repositori saya indeks. htmlIni adalah laman landas sederhana yang menyediakan tombol yang menunjukkan berbagai contoh interaksi dengan file $nbf = strtotime('2021-01-01 00:00:01'); 0 di server
app_client. phpFile PHP sisi server ini menerima permintaan metode dari $nbf = strtotime('2021-01-01 00:00:01'); 6 dan memprosesnya sesuai dengan ituPermintaan POST menerima bidang nama pengguna dan kata sandi dan memvalidasinya, mengembalikan kesalahan jika tidak valid. Jika valid, maka file $nbf = strtotime('2021-01-01 00:00:01'); _7 disertakan (dijelaskan sedikit) untuk menangani semua fungsi token. Kemudian dibuat beberapa variabel yang digunakan dalam pembuatan JWTYang pertama adalah user id yang digunakan sebagai claim pertama kita di payload $userId = 'USER123456'; _Ini hanya menunjukkan bahwa kami dapat memasukkan data apa pun yang kami inginkan dalam klaim. Dalam contoh ini, kami menyertakan sedikit informasi berguna yang dapat kami gunakan di server nanti untuk hal-hal seperti meminta data khusus untuk pengguna ini tanpa memerlukan autentikasi atau pemilihan lebih lanjut Dua variabel berikutnya digunakan untuk mengontrol umur token $nbf = strtotime('2021-01-01 00:00:01'); Variabel $nbf = strtotime('2021-01-01 00:00:01'); 8 dan $nbf = strtotime('2021-01-01 00:00:01'); 9 sesuai dengan pasangan bidang standarnya dalam muatan. Dalam contoh di atas, token dibuat dengan tanggal $serverKey = '5f2b5cdbe5194f10b3241568fe4e2b24'; 0(bukan sebelum) yang ditetapkan ke 1 Januari 2021, pukul 12. 01 a. m. tidak akan mengizinkan validasi sebelum tanggal tersebut. Anda dapat mengujinya di lingkungan pengembangan dengan menghapus komentar pada baris tersebut dan menyetelnya ke tanggal dan waktu yang sesuai untuk pengujianDalam contoh di atas, token dibuat dengan tanggal Jika salah satu dari dua variabel tanggal/waktu ini dilanggar, $nbf = strtotime('2021-01-01 00:00:01'); 2 akan mengembalikan kesalahan pengecualian ke$serverKey = '5f2b5cdbe5194f10b3241568fe4e2b24'; 3Variabel terakhir adalah kunci server (dalam hal ini GUID) yang akan kami gunakan untuk algoritme hashing kami di tanda tangan. Dalam contoh kami, hanya server yang mengetahui kuncinya; $serverKey = '5f2b5cdbe5194f10b3241568fe4e2b24'; Blok kode berikutnya mengemas variabel klaim kami ke dalam larik muatan dan kemudian meneruskannya bersama dengan kunci server ke $nbf = strtotime('2021-01-01 00:00:01'); 7 untuk pengkodean menjadi token// create a token Token yang dihasilkan kemudian dikemas ke dalam larik pengembalian yang disandikan JSON dan dikembalikan ke $nbf = strtotime('2021-01-01 00:00:01'); 6jwt. phpPustaka kelas ini didasarkan pada kode sumber Firebase/JWT asli yang ditulis oleh Neuman Vong dan Anant Narayanan yang ditemukan di sini. https. //github. com/firebase/php-jwt Untuk memfasilitasi contoh sederhana saya, saya telah menghapus kebutuhan akan dependensi komposer, referensi namespace, dan pengecualian kesalahan khusus. Semua fungsi dan antarmuka lainnya tetap sama. Setelah Anda memahami konsepnya, saya mendorong Anda untuk menginstal perpustakaan kelas JWT mereka karena itu akan memberi Anda pembaruan berkelanjutan untuk perpustakaan Pustaka kelas $nbf = strtotime('2021-01-01 00:00:01'); 7 menyediakan semua fungsi untuk menyandikan dan mendekode Token Web JSON, termasuk memproses bidang standar muatanCobalah Anda dapat mengunduh ketiga file ini dari GitHub. Tempatkan semuanya di folder yang sama di lingkungan pengembangan Anda dan cobalah. Kode sengaja ditulis untuk kejelasan dan kemudahan melangkah dengan debugger Saya harap ini membantu Anda mendapatkan pemahaman tentang bagaimana Token Web JSON dapat digunakan dalam tumpukan autentikasi Anda Di mana token JWT disimpan?JWT perlu disimpan di tempat yang aman di dalam browser pengguna . Bagaimanapun, Anda tidak boleh menyimpan JWT di penyimpanan lokal (atau penyimpanan sesi). Jika Anda menyimpannya di LocalStorage/SessionStorage maka dapat dengan mudah diambil oleh serangan XSS. Jika jawabannya bermanfaat, silakan klik "Terima Jawaban" dan upvote.
Apakah token JWT disimpan dalam DB?Jika dalam hal apa pun lebih dari satu JWT dapat dibuat untuk pengguna untuk satu tujuan seperti token verifikasi email, atau setel ulang token kata sandi dalam kasus tersebut kita harus menyimpan token . .
Apa otentikasi JWT di PHP?JSON Online Token (JWT) adalah metode yang aman untuk mengautentikasi pengguna dalam aplikasi web . Anda dapat mengirim informasi data terenkripsi antara komputer klien dan server menggunakan JWT. Memilih antara JWT dan Session lebih dari sekadar masalah preferensi.
Di mana token autentikasi disimpan?# Token yang disimpan di localStorage secara otomatis dilindungi dari serangan CSRF, karena item localStorage tidak secara otomatis dikirim ke server dengan setiap permintaan HTTP. Tetapi mereka rentan terhadap serangan XSS, di mana mereka dapat dengan mudah diakses oleh JavaScript. |