Di mana token jwt php disimpan?

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

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 exp (tanggal dan waktu kedaluwarsa) dan nbf (tidak sebelum tanggal dan waktu), yang mengidentifikasi waktu di mana JWT akan mulai diterima untuk diproses. Contoh kami akan menyertakan kemampuan untuk menyertakan exp dannbf dalam pengujian Anda. Anda dapat melihat halaman Wikipedia untuk JWT untuk membaca tentang bidang standar lainnya

Tanda tangan adalah representasi hash dari header dan payload. Header dan payload masing-masing dikodekan base64url dan kemudian digabungkan bersama dengan period header.payload ke dalam variabel baru. Variabel itu kemudian di-hash, dalam kasus kami menggunakan algoritme HS256 dengan kunci rahasia, menjadi variabel baru yang kemudian juga dikodekan base64url ke dalam tanda tangan. Tanda tangan ditambahkan ke variabel header dan payload dengan periode lain header.payload.signature menjadi variabel akhir yaitu token kami, yang diteruskan kembali ke klien

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. html

Ini adalah laman landas sederhana yang menyediakan tombol yang menunjukkan berbagai contoh interaksi dengan file

$nbf = strtotime('2021-01-01 00:00:01');

$exp = strtotime('2021-01-01 00:00:01');
0 di server

  • Login yang Baik — mengirimkan POST dengan nama pengguna john. doe dan kata sandi foobar. Jika otentikasi berhasil, token dikembalikan. Klien dapat memutuskan bagaimana mereka ingin menyimpan token untuk digunakan di masa mendatang. Dalam kasus kami, kami akan menyimpannya di browser
    $nbf = strtotime('2021-01-01 00:00:01');

    $exp = strtotime('2021-01-01 00:00:01');
    1
  • Login Buruk — mengirimkan POST dengan nama pengguna john. doe dan kata sandi foobarfoobar yang tidak valid. Ini akan menyebabkan
    $nbf = strtotime('2021-01-01 00:00:01');

    $exp = strtotime('2021-01-01 00:00:01');
    2 menolak upaya otentikasi dengan kesalahan dan tanpa token. Setelah menerima kesalahan, klien menghapus token yang ada, dan pengguna akan diminta untuk mendapatkan token baru menggunakan tombol Good Login sebelum pengujian lebih lanjut akan berhasil.
  • Tes apakah Masuk — akan mengeluarkan GET menggunakan token yang disimpan di
    $nbf = strtotime('2021-01-01 00:00:01');

    $exp = strtotime('2021-01-01 00:00:01');
    1. Jika berhasil,
    $nbf = strtotime('2021-01-01 00:00:01');

    $exp = strtotime('2021-01-01 00:00:01');
    _2 akan mengembalikan user id yang telah kita simpan di payload token
  • Logout dan Hapus Token — cukup hapus token yang ada dari
    $nbf = strtotime('2021-01-01 00:00:01');

    $exp = strtotime('2021-01-01 00:00:01');
    1 dan paksa pengguna untuk mendapatkan token baru dengan tombol Good Login sebelum tes lebih lanjut akan berfungsi

app_client. php

File PHP sisi server ini menerima permintaan metode dari

$nbf = strtotime('2021-01-01 00:00:01');

$exp = strtotime('2021-01-01 00:00:01');
6 dan memprosesnya sesuai dengan itu

Permintaan 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');

$exp = strtotime('2021-01-01 00:00:01');
_7 disertakan (dijelaskan sedikit) untuk menangani semua fungsi token. Kemudian dibuat beberapa variabel yang digunakan dalam pembuatan JWT

Yang 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');

$exp = strtotime('2021-01-01 00:00:01');

Variabel

$nbf = strtotime('2021-01-01 00:00:01');

$exp = strtotime('2021-01-01 00:00:01');
8 dan
$nbf = strtotime('2021-01-01 00:00:01');

$exp = 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 pengujian

Dalam contoh di atas, token dibuat dengan tanggal exp (kedaluwarsa) yang ditetapkan ke 1 Januari 2021, pukul 12. 01 a. m. hanya akan berfungsi hingga tanggal dan waktu tersebut, pada saat itu akan kedaluwarsa dan tidak berlaku lagi. Anda dapat menguji ini di lingkungan pengembangan Anda dengan menghapus komentar pada baris ini dan menyetelnya ke tanggal dan waktu yang sesuai

Jika salah satu dari dua variabel tanggal/waktu ini dilanggar,

$nbf = strtotime('2021-01-01 00:00:01');

$exp = strtotime('2021-01-01 00:00:01');
2 akan mengembalikan kesalahan pengecualian ke
$serverKey = '5f2b5cdbe5194f10b3241568fe4e2b24';
3

Variabel 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');

$exp = strtotime('2021-01-01 00:00:01');
7 untuk pengkodean menjadi token

// create a token
$payloadArray = array();
$payloadArray['userId'] = $userId;
if (isset($nbf)) {$payloadArray['nbf'] = $nbf;}
if (isset($exp)) {$payloadArray['exp'] = $exp;}
$token = JWT::encode($payloadArray, $serverKey);

// return to caller
$returnArray = array('token' => $token);
$jsonEncodedReturnArray = json_encode($returnArray, JSON_PRETTY_PRINT);
echo $jsonEncodedReturnArray;

Token yang dihasilkan kemudian dikemas ke dalam larik pengembalian yang disandikan JSON dan dikembalikan ke

$nbf = strtotime('2021-01-01 00:00:01');

$exp = strtotime('2021-01-01 00:00:01');
6

jwt. php

Pustaka 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');

$exp = strtotime('2021-01-01 00:00:01');
7 menyediakan semua fungsi untuk menyandikan dan mendekode Token Web JSON, termasuk memproses bidang standar muatan

Cobalah

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.