JSON Web Token (JWT): penyelesaian popular untuk pengesahan merentas domain
Artikel ini memperkenalkan prinsip dan penggunaan JSON Web Token (JWT), penyelesaian pengesahan merentas domain yang paling popular pada masa ini.
1. Cabaran pengesahan merentas domain
Perkhidmatan Internet tidak dapat dipisahkan daripada pengesahan pengguna. Proses tradisional adalah seperti berikut:
Model ini mempunyai kebolehskalaan yang lemah: persekitaran mesin tunggal adalah baik, tetapi kluster pelayan atau seni bina berorientasikan perkhidmatan merentas domain memerlukan perkongsian data sesi dan setiap pelayan boleh membaca sesi. Sebagai contoh, tapak web A dan tapak web B adalah perkhidmatan berkaitan syarikat yang sama Selepas pengguna log masuk ke salah satu tapak web, mereka boleh log masuk secara automatik apabila mereka melawat tapak web yang lain. Satu penyelesaian adalah untuk mengekalkan data sesi, menulisnya ke pangkalan data atau lapisan kegigihan lain dan meminta data daripada lapisan kegigihan selepas setiap perkhidmatan menerima permintaan. Penyelesaian ini mempunyai seni bina yang jelas, tetapi beban kerja adalah besar, dan kegagalan lapisan kegigihan akan membawa kepada satu titik kegagalan. Pilihan lain ialah pelayan tidak menyimpan data sesi sama sekali, semua data disimpan pada klien dan dihantar semula ke pelayan dengan setiap permintaan. JWT mewakili pendekatan ini.
2. Prinsip JWT
Prinsip JWT ialah pelayan menjana objek JSON selepas pengesahan dan mengembalikannya kepada pengguna, contohnya:
<code class="language-json">{"name": "Alice", "role": "admin", "expiration time": "2024年7月1日0:00"}</code>
Kemudian, apabila pengguna berkomunikasi dengan pelayan, objek JSON ini perlu dikembalikan dan pelayan menentukan sepenuhnya identiti pengguna berdasarkan objek ini. Untuk mengelakkan pengguna daripada mengganggu data, pelayan menambah tandatangan apabila menjana objek ini (butiran diterangkan kemudian). Pelayan tidak lagi menyimpan sebarang data sesi, iaitu pelayan menjadi tidak bernegara dan lebih mudah untuk skala.
3. Struktur data JWT
JWT sebenar kelihatan seperti ini:
Ia adalah rentetan panjang yang dipisahkan kepada tiga bahagian oleh titik (.). Ambil perhatian bahawa tiada pemisah baris di dalam JWT, pemisah baris di sini hanyalah untuk kemudahan paparan. Tiga bahagian JWT adalah seperti berikut:
Satu baris dinyatakan sebagai: Pengepala. Muatan. Tandatangan
Tiga bahagian ini diperkenalkan di bawah.
Bahagian Pengepala ialah objek JSON yang menerangkan metadata JWT, biasanya seperti berikut:
<code class="language-json">{"alg": "HS256", "typ": "JWT"}</code>
Atribut alg mewakili algoritma tandatangan, lalai ialah HMAC SHA256 (HS256); atribut taip mewakili jenis token ini dan token JWT ditulis secara seragam sebagai JWT. Objek JSON ini akhirnya ditukar kepada rentetan menggunakan algoritma Base64URL (butiran di bawah).
Bahagian Payload juga merupakan objek JSON yang digunakan untuk menyimpan data sebenar yang perlu dihantar. JWT mentakrifkan 7 medan pilihan rasmi:
Selain medan rasmi, medan persendirian juga boleh disesuaikan. Contohnya:
<code class="language-json">{"name": "Alice", "role": "admin", "expiration time": "2024年7月1日0:00"}</code>
Perhatikan bahawa JWT tidak disulitkan secara lalai dan boleh dibaca oleh sesiapa sahaja, jadi jangan letak maklumat rahsia dalam bahagian ini. Objek JSON ini juga perlu ditukar kepada rentetan menggunakan algoritma Base64URL.
Bahagian Tandatangan ialah tandatangan dua bahagian pertama, digunakan untuk mengelakkan gangguan data. Pertama, anda perlu menentukan rahsia ini hanya diketahui oleh pelayan dan tidak boleh dibocorkan kepada pengguna. Kemudian gunakan algoritma tandatangan yang dinyatakan dalam Pengepala (lalai ialah HMAC SHA256) untuk menjana tandatangan mengikut formula berikut:
<code class="language-json">{"alg": "HS256", "typ": "JWT"}</code>
Selepas tandatangan dikira, tiga bahagian Pengepala, Muatan dan Tandatangan digabungkan menjadi rentetan, dan setiap bahagian dipisahkan dengan "titik" (.), yang boleh dikembalikan kepada pengguna.
Seperti yang dinyatakan sebelum ini, algoritma siri Pengepala dan Muatan ialah Base64URL. Algoritma ini pada asasnya serupa dengan algoritma Base64, tetapi mempunyai beberapa perbezaan kecil. Sebagai tanda, JWT kadangkala boleh diletakkan dalam URL (seperti api.example.com/?token=xxx Tiga aksara dalam Base64, / dan = mempunyai makna istimewa dalam URL dan perlu diganti: = is ditinggalkan dan digantikan dengan Digantikan dengan -, / digantikan dengan _. Ini ialah algoritma Base64URL.
4. Cara menggunakan JWT
Selepas pelanggan menerima JWT yang dikembalikan oleh pelayan, ia boleh menyimpannya dalam Cookie atau localStorage. Pelanggan perlu membawa JWT ini setiap kali ia berkomunikasi dengan pelayan. Ia boleh diletakkan dalam kuki dan dihantar secara automatik, tetapi ini tidak boleh dilakukan merentas domain. Pendekatan yang lebih baik ialah meletakkannya dalam medan Kebenaran pengepala permintaan HTTP:
Kebenaran: Pembawa
Pendekatan lain ialah meletakkan JWT dalam kandungan permintaan POST apabila melintasi domain.
5. Beberapa ciri JWT
(1) JWT tidak disulitkan secara lalai, tetapi boleh disulitkan. Selepas Token asal dijana, ia boleh disulitkan semula dengan kunci.
(2) Jika JWT tidak disulitkan, data rahsia tidak boleh ditulis.
(3) JWT boleh digunakan bukan sahaja untuk pengesahan identiti, tetapi juga untuk pertukaran maklumat. Penggunaan JWT yang berkesan boleh mengurangkan bilangan kali pelayan menanyakan pangkalan data.
(4) Kelemahan terbesar JWT ialah pelayan tidak menyimpan keadaan sesi dan tidak boleh membatalkan token atau menukar kebenaran token semasa penggunaan. Iaitu, sebaik sahaja JWT dikeluarkan, ia kekal sah sehingga tamat tempoh melainkan pelayan menggunakan logik tambahan.
(5) JWT sendiri mengandungi maklumat pengesahan, dan apabila bocor, sesiapa sahaja boleh mendapatkan semua kebenaran token. Untuk mengurangkan kecurian, tempoh sah JWT hendaklah ditetapkan secara relatifnya singkat. Untuk beberapa kebenaran yang lebih penting, pengguna harus mengesahkan semula apabila menggunakannya.
(6) Untuk mengurangkan kecurian, JWT tidak boleh dihantar dalam teks yang jelas menggunakan protokol HTTP, tetapi harus dihantar menggunakan protokol HTTPS.
Leapcell: Platform Pengehosan Web Tanpa Pelayan Terbaik
Akhir sekali, saya mengesyorkan platform terbaik untuk menggunakan perkhidmatan web: Leapcell
Ketahui lebih lanjut dalam dokumentasi!
Twitter Leapcell: https://www.php.cn/link/7884effb9452a6d7a7a79499ef854afd
Atas ialah kandungan terperinci Menguasai JWT (Token Web JSON): A Deep Dive. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!