Dalam konteks JWT , Stormpath telah menulis artikel yang cukup membantu menguraikan cara-cara yang mungkin untuk menyimpannya, dan keuntungan (dis-) yang berkaitan dengan masing-masing metode.
Ini juga memiliki gambaran singkat tentang serangan XSS dan CSRF, dan bagaimana Anda dapat memerangi mereka.
Saya telah melampirkan beberapa cuplikan singkat dari artikel di bawah ini, jika artikel mereka diambil offline / situs mereka turun.
Penyimpanan lokal
Masalah:
Penyimpanan Web (localStorage / sessionStorage) dapat diakses melalui JavaScript pada domain yang sama. Ini berarti bahwa setiap JavaScript yang berjalan di situs Anda akan memiliki akses ke penyimpanan web, dan karena ini dapat rentan terhadap serangan lintas situs (XSS). Singkatnya, XSS adalah jenis kerentanan di mana penyerang dapat menyuntikkan JavaScript yang akan berjalan di halaman Anda. Serangan XSS dasar berupaya menyuntikkan JavaScript melalui input formulir, tempat penyerang memberi peringatan ('Anda Dibajak'); ke dalam formulir untuk melihat apakah itu dijalankan oleh browser dan dapat dilihat oleh pengguna lain.
Pencegahan:
Untuk mencegah XSS, respons umum adalah melarikan diri dan menyandikan semua data yang tidak dipercaya. Tapi ini jauh dari cerita lengkap. Pada 2015, aplikasi web modern menggunakan JavaScript yang diinangi pada CDN atau infrastruktur luar. Aplikasi web modern termasuk perpustakaan JavaScript pihak ketiga untuk pengujian A / B, analisis saluran / pasar, dan iklan. Kami menggunakan manajer paket seperti Bower untuk mengimpor kode orang lain ke dalam aplikasi kami.
Bagaimana jika hanya satu dari skrip yang Anda gunakan yang dikompromikan? JavaScript berbahaya dapat disematkan pada halaman, dan Penyimpanan Web dikompromikan. Jenis serangan XSS ini dapat membuat Penyimpanan Web semua orang yang mengunjungi situs Anda, tanpa sepengetahuan mereka. Ini mungkin sebabnya banyak organisasi menyarankan untuk tidak menyimpan sesuatu yang bernilai atau mempercayai informasi apa pun dalam penyimpanan web. Ini termasuk pengidentifikasi dan token sesi.
Sebagai mekanisme penyimpanan, Penyimpanan Web tidak menerapkan standar aman apa pun selama transfer. Siapa pun yang membaca Penyimpanan Web dan menggunakannya harus melakukan uji tuntas untuk memastikan mereka selalu mengirim JWT melalui HTTPS dan tidak pernah HTTP.
Kue
Masalah:
Cookie, ketika digunakan dengan bendera cookie HttpOnly, tidak dapat diakses melalui JavaScript, dan kebal terhadap XSS. Anda juga dapat mengatur bendera cookie Aman untuk menjamin cookie hanya dikirim melalui HTTPS. Ini adalah salah satu alasan utama bahwa cookie telah diungkit di masa lalu untuk menyimpan token atau data sesi. Pengembang modern ragu-ragu untuk menggunakan cookie karena mereka secara tradisional mengharuskan negara untuk disimpan di server, sehingga melanggar praktik terbaik yang tenang. Cookie sebagai mekanisme penyimpanan tidak mengharuskan status disimpan di server jika Anda menyimpan JWT dalam cookie. Ini karena JWT merangkum semua yang dibutuhkan server untuk melayani permintaan.
Namun, cookie rentan terhadap berbagai jenis serangan: pemalsuan permintaan lintas situs (CSRF). Serangan CSRF adalah jenis serangan yang terjadi ketika situs web berbahaya, email, atau blog menyebabkan browser web pengguna untuk melakukan tindakan yang tidak diinginkan pada situs tepercaya di mana pengguna saat ini diautentikasi. Ini adalah eksploitasi bagaimana browser menangani cookie. Cookie hanya dapat dikirim ke domain yang diizinkan. Secara default, ini adalah domain yang awalnya mengatur cookie. Cookie akan dikirim untuk permintaan terlepas dari apakah Anda berada di galaxies.com atau hahagonnahackyou.com.
Pencegahan:
Browser modern mendukung SameSite
bendera , selain HttpOnly
dan Secure
. Tujuan dari bendera ini adalah untuk mencegah cookie dari ditransmisikan dalam permintaan lintas situs, mencegah berbagai jenis serangan CSRF.
Untuk browser yang tidak mendukung SameSite
, CSRF dapat dicegah dengan menggunakan pola token yang disinkronkan. Ini terdengar rumit, tetapi semua kerangka kerja web modern memiliki dukungan untuk ini.
Misalnya, AngularJS memiliki solusi untuk memvalidasi bahwa cookie hanya dapat diakses oleh domain Anda. Langsung dari AngularJS docs:
Saat melakukan permintaan XHR, layanan $ http membaca token dari cookie (secara default, XSRF-TOKEN) dan menetapkannya sebagai header HTTP (X-XSRF-TOKEN). Karena hanya JavaScript yang berjalan di domain Anda yang dapat membaca cookie, server Anda dapat yakin bahwa XHR berasal dari JavaScript yang berjalan di domain Anda. Anda dapat membuat perlindungan CSRF ini tanpa kewarganegaraan dengan memasukkan xsrfToken
klaim JWT:
{
"iss": "http://galaxies.com",
"exp": 1300819380,
"scopes": ["explorer", "solar-harvester", "seller"],
"sub": "tom@andromeda.com",
"xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e"
}
Memanfaatkan perlindungan CSRF kerangka kerja aplikasi web Anda membuat cookie sangat kuat untuk menyimpan JWT. CSRF juga dapat dicegah sebagian dengan memeriksa tajuk HTTP Referer dan Origin dari API Anda. Serangan CSRF akan memiliki header Referer dan Origin yang tidak terkait dengan aplikasi Anda.
Artikel lengkap dapat ditemukan di sini:
https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/
Mereka juga memiliki artikel bermanfaat tentang cara terbaik merancang dan mengimplementasikan JWT, berkaitan dengan struktur token itu sendiri:
https://stormpath.com/blog/jwt-the-right-way/