Untuk tujuan mengamankan REST API menggunakan JWT, menurut beberapa materi (seperti panduan ini dan pertanyaan ini ), JWT dapat disimpan di Penyimpanan lokal atau Cookie . Berdasarkan pemahaman saya:
- localStorage tunduk pada XSS dan umumnya tidak disarankan untuk menyimpan informasi sensitif di dalamnya.
- Dengan Cookies kita dapat menerapkan bendera "httpOnly" yang mengurangi risiko XSS. Namun jika kami membaca JWT dari Cookie di backend, kami akan dikenai CSRF.
Jadi berdasarkan premis di atas - akan lebih baik jika kita menyimpan JWT dalam Cookies. Pada setiap permintaan ke server, JWT akan dibaca dari Cookies dan ditambahkan di header Otorisasi menggunakan skema Bearer. Server kemudian dapat memverifikasi JWT di header permintaan (bukan membacanya dari cookie).
Apakah pemahaman saya benar? Jika ya, apakah pendekatan di atas memiliki masalah keamanan? Atau sebenarnya kita bisa lolos dengan menggunakan localStorage di tempat pertama?
Jawaban:
Saya suka metode XSRF Double Submit Cookies yang disebutkan dalam artikel yang dikatakan @ pkid169, tetapi ada satu hal yang tidak diberitahukan artikel tersebut kepada Anda. Anda masih belum terlindungi dari XSS karena apa yang dapat dilakukan penyerang adalah menyuntikkan skrip yang membaca cookie CSRF Anda (yang bukan HttpOnly) dan kemudian membuat permintaan ke salah satu titik akhir API Anda menggunakan token CSRF ini dengan cookie JWT dikirim secara otomatis.
Jadi pada kenyataannya Anda masih rentan terhadap XSS, hanya saja penyerang tidak dapat mencuri token JWT Anda untuk digunakan nanti, tetapi dia tetap dapat membuat permintaan atas nama pengguna Anda menggunakan XSS.
Baik Anda menyimpan JWT di Penyimpanan lokal atau menyimpan token XSRF Anda bukan hanya dalam cookie http, keduanya dapat diambil dengan mudah oleh XSS. Bahkan JWT Anda dalam cookie HttpOnly dapat diambil dengan serangan XSS tingkat lanjut.
Jadi selain metode Double Submit Cookies, Anda harus selalu mengikuti praktik terbaik terhadap XSS termasuk meng-escape konten. Ini berarti menghapus kode yang dapat dieksekusi yang akan menyebabkan browser melakukan sesuatu yang tidak Anda inginkan. Biasanya ini berarti menghapus // <! [CDATA [tag dan atribut HTML yang menyebabkan JavaScript dievaluasi.
sumber
Html.AntiForgeryToken()
di ASP.NET MVC menggunakan cookie HttpOnly untuk token CSRF. Saya pikir Anda masih rentan terhadap XSS tertentu, tetapi menurut saya ini layak untuk disebutkan.Sebuah posting tepat waktu dari Stormpath telah menjelaskan banyak poin saya dan menjawab pertanyaan saya.
TL; DR
Simpan JWT dalam cookie, lalu berikan JWT di header Otorisasi pada setiap permintaan seperti yang saya sebutkan, atau seperti yang disarankan artikel, andalkan backend untuk mencegah CSRF (misalnya, menggunakan
xsrfToken
dalam kasus Angular).sumber
Sebagai gantinya, saat masuk, Anda dapat mengirimkan dua token: token akses dan token penyegaran. Token akses harus disimpan dalam memori Javascript dan token Segarkan harus disimpan di HttpOnly Cookie. Segarkan token hanya digunakan dan hanya untuk membuat token akses baru - tidak lebih.
Ketika pengguna membuka tab baru, atau pada penyegaran situs, Anda perlu melakukan permintaan untuk membuat token akses baru, berdasarkan token penyegaran yang disimpan dalam Cookie.
Saya juga sangat menyarankan untuk membaca artikel ini: https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/
sumber
secure
,samesite: strict
,http-only
?Untuk membantu mencegah serangan CSRF yang memanfaatkan cookie yang ada, Anda dapat mengatur cookie Anda dengan
SameSite
arahan. Setel kelax
ataustrict
.Ini masih berupa draf dan pada 2019 tidak sepenuhnya didukung oleh semua browser saat ini , tetapi tergantung pada sensitivitas data Anda dan / atau kontrol Anda atas browser yang digunakan pengguna Anda, ini mungkin merupakan opsi yang layak. Menyetel direktif dengan
SameSite=lax
akan memungkinkan "navigasi tingkat atas yang menggunakan metode HTTP 'aman' ...".sumber