(muncul dari utas ini karena ini benar-benar pertanyaannya sendiri dan tidak khusus untuk NodeJS dll)
Saya menerapkan server REST API dengan otentikasi, dan saya telah berhasil menerapkan penanganan token JWT sehingga pengguna dapat masuk melalui / login endpoint dengan nama pengguna / kata sandi, di mana token JWT dibuat dari rahasia server dan dikembalikan ke klien. Token kemudian diteruskan dari klien ke server di setiap permintaan API yang diautentikasi, di mana rahasia server digunakan untuk memverifikasi token.
Namun, saya mencoba untuk memahami praktik terbaik tentang bagaimana dan sejauh mana token harus divalidasi, untuk membuat sistem yang benar-benar aman. Persis apa yang harus dilibatkan dalam "memvalidasi" token? Apakah cukup bahwa tanda tangan dapat diverifikasi menggunakan rahasia server, atau haruskah saya juga memeriksa ulang token dan / atau muatan token terhadap beberapa data yang disimpan di server?
Sistem otentikasi berbasis token hanya akan seaman meneruskan nama pengguna / kata sandi di setiap permintaan asalkan sama atau lebih sulit untuk mendapatkan token daripada mendapatkan kata sandi pengguna. Namun, dalam contoh yang saya lihat, satu-satunya informasi yang diperlukan untuk menghasilkan token adalah nama pengguna dan rahasia sisi server. Bukankah ini berarti bahwa dengan asumsi selama satu menit bahwa pengguna yang jahat memperoleh pengetahuan tentang rahasia server, dia sekarang dapat menghasilkan token atas nama pengguna mana pun , sehingga memiliki akses tidak hanya untuk satu pengguna tertentu seperti halnya fakta jika kata sandi digunakan. diperoleh, tetapi sebenarnya untuk semua akun pengguna?
Ini membawa saya pada pertanyaan:
1) Apakah validasi token JWT harus dibatasi untuk memverifikasi tanda tangan token itu sendiri, mengandalkan integritas rahasia server saja, atau disertai dengan mekanisme validasi terpisah?
Dalam beberapa kasus saya telah melihat penggunaan gabungan dari token dan sesi server di mana setelah berhasil masuk melalui / login endpoint sesi dibuat. Permintaan API memvalidasi token, dan juga membandingkan data yang didekodekan yang ditemukan di token dengan beberapa data yang disimpan dalam sesi. Namun, menggunakan sesi berarti menggunakan cookie, dan dalam beberapa hal hal itu mengalahkan tujuan penggunaan pendekatan berbasis token. Ini juga dapat menyebabkan masalah bagi klien tertentu.
Dapat dibayangkan server menyimpan semua token yang saat ini digunakan di memcache atau yang serupa, untuk memastikan bahwa meskipun rahasia server dikompromikan sehingga penyerang dapat menghasilkan token "valid", hanya token persis yang dihasilkan melalui titik akhir / login akan diterima. Apakah ini masuk akal atau hanya berlebihan / berlebihan?
2) Jika verifikasi tanda tangan JWT adalah satu-satunya cara untuk memvalidasi token, yang berarti integritas rahasia server adalah titik puncaknya, bagaimana seharusnya rahasia server dikelola? Membaca dari variabel lingkungan dan dibuat (diacak?) Sekali per tumpukan yang diterapkan? Dibarui kembali atau dirotasi secara berkala (dan jika demikian, bagaimana menangani token valid yang ada yang dibuat sebelum rotasi tetapi perlu divalidasi setelah rotasi, mungkin cukup jika server menyimpan rahasia saat ini dan sebelumnya pada waktu tertentu) ? Sesuatu yang lain?
Mungkin saya hanya terlalu paranoid ketika menghadapi risiko rahasia server disusupi, yang tentu saja merupakan masalah yang lebih umum yang perlu ditangani dalam semua situasi kriptografi ...
RSAPrivateKey privateKey
??