Saya mencoba menerapkan otentikasi tanpa kewarganegaraan dengan JWT untuk API SISA saya.
AFAIK, JWT pada dasarnya adalah string terenkripsi yang dilewatkan sebagai header HTTP selama panggilan REST.
Tapi bagaimana jika ada penyadap yang melihat permintaan dan mencuri token ? Lalu dia akan bisa memalsukan permintaan dengan identitas saya?
Sebenarnya, masalah ini berlaku untuk semua otentikasi berbasis token .
Bagaimana cara mencegahnya? Saluran aman seperti HTTPS?
authentication
access-token
jwt
smwikipedia
sumber
sumber
trade-off
antarahaving finer control of token expiration
danhaving better scalability
.Jawaban:
Saya penulis perpustakaan simpul yang menangani otentikasi cukup mendalam, express-stormpath , jadi saya akan berpadu dengan beberapa informasi di sini.
Pertama, JWT biasanya TIDAK dienkripsi. Meskipun ada cara untuk mengenkripsi JWT (lihat: JWEs ), ini tidak umum dalam praktik karena banyak alasan.
Selanjutnya, segala bentuk otentikasi (menggunakan JWT atau tidak), terkena serangan MitM (man-in-the-middle). Serangan-serangan ini terjadi ketika seorang penyerang dapat MELIHAT lalu lintas JARINGAN saat Anda membuat permintaan melalui internet. Inilah yang dapat dilihat ISP Anda, NSA, dll.
Inilah yang membantu SSL mencegah: dengan mengenkripsi lalu lintas NETWORK Anda dari komputer Anda -> beberapa server saat mengautentikasi, pihak ketiga yang memantau lalu lintas jaringan Anda TIDAK dapat melihat token, kata sandi, atau hal-hal seperti itu kecuali mereka entah bagaimana dapat melakukannya untuk mendapatkan salinan kunci SSL pribadi server (tidak mungkin). Ini adalah alasan SSL WAJIB untuk semua bentuk otentikasi.
Katakanlah, bagaimanapun, bahwa seseorang dapat mengeksploitasi SSL Anda dan dapat melihat token Anda: jawaban untuk pertanyaan Anda adalah YA , penyerang akan dapat menggunakan token itu untuk menyamar sebagai Anda dan membuat permintaan ke server Anda.
Sekarang, di sinilah protokol masuk
JWT hanyalah satu standar untuk token otentikasi. Mereka dapat digunakan untuk apa saja. Alasan JWT agak keren adalah karena Anda dapat menanamkan informasi tambahan di dalamnya, dan Anda dapat memvalidasi bahwa tidak ada yang mengacaukannya (menandatangani).
NAMUN, JWT sendiri tidak ada hubungannya dengan 'keamanan'. Untuk semua maksud dan tujuan, JWT kurang lebih sama dengan kunci API: hanya string acak yang Anda gunakan untuk mengautentikasi terhadap beberapa server di suatu tempat.
Yang membuat pertanyaan Anda lebih menarik adalah protokol yang digunakan (kemungkinan besar OAuth2).
Cara OAuth2 bekerja adalah bahwa ia dirancang untuk memberikan token TEMPORARY kepada klien (seperti JWT!) Untuk otentikasi untuk PERIODE WAKTU SINGKAT SAJA SAJA!
Idenya adalah bahwa jika token Anda dicuri, penyerang hanya dapat menggunakannya untuk waktu yang singkat.
Dengan OAuth2, Anda harus mengautentikasi ulang diri Anda sendiri dengan server sesekali dengan memberikan nama pengguna / kata sandi ATAU kredensial API dan kemudian mendapatkan token kembali sebagai imbalan.
Karena proses ini terjadi sesekali, token Anda akan sering berubah, membuatnya lebih sulit bagi penyerang untuk terus-menerus menyamar sebagai Anda tanpa melalui masalah besar.
Semoga ini membantu ^^
sumber
Saya tahu ini adalah pertanyaan lama tapi saya pikir saya bisa menjatuhkan $ 0,50 saya di sini, mungkin seseorang dapat meningkatkan atau memberikan argumen untuk benar-benar menolak pendekatan saya. Saya menggunakan JWT dalam API yang tenang lebih dari HTTPS (ofc).
Agar ini berfungsi, Anda harus selalu mengeluarkan token yang berumur pendek (tergantung pada kebanyakan kasus, di aplikasi saya, saya sebenarnya menetapkan
exp
klaim menjadi 30 menit, danttl
hingga 3 hari, sehingga Anda dapat menyegarkan token ini selamattl
masih token valid dan token belum dimasukkan daftar hitam )Untuk itu
authentication service
, untuk membatalkan token, saya suka menggunakan lapisan cache dalam memori ( redis dalam kasus saya) sebagai aJWT blacklist
/ban-list
di depan, tergantung pada beberapa kriteria: (Saya tahu itu melanggar filosofi tenang, tetapi dokumen yang disimpan adalah benar-benar berumur pendek, karena saya daftar hitam untuk sisa waktu mereka untuk hidup -ttl
klaim-)Catatan: token daftar hitam tidak dapat di-refresh secara otomatis
user.password
atauuser.email
telah diperbarui (memerlukan konfirmasi kata sandi), layanan auth mengembalikan token yang di-refresh dan membatalkan (blacklist) yang sebelumnya, jadi jika klien Anda mendeteksi bahwa identitas pengguna entah bagaimana telah dikompromikan, Anda dapat meminta pengguna itu untuk mengubah kata sandi . Jika Anda tidak ingin menggunakan daftar hitam untuk itu, Anda bisa (tapi saya tidak mendorong Anda untuk) memvalidasiiat
klaim (dikeluarkan pada) terhadapuser.updated_at
bidang (jikajwt.iat < user.updated_at
JWT tidak valid).Akhirnya Anda memvalidasi token secara normal seperti yang dilakukan semua orang.
Catatan 2: daripada menggunakan token itu sendiri (yang sangat panjang) sebagai kunci cache, saya sarankan membuat dan menggunakan token UUID untuk
jti
klaim. Mana yang baik dan saya pikir (tidak yakin karena baru saja muncul di pikiran saya) Anda dapat menggunakan UUID yang sama dengan token CSRF juga, dengan mengembalikansecure
/non-http-only
cookie dengan itu dan menerapkanX-XSRF-TOKEN
header dengan benar menggunakan js. Dengan cara ini Anda menghindari pekerjaan komputasi menciptakan token lain untuk pemeriksaan CSRF.sumber
Maaf agak terlambat dalam hal ini, tetapi memiliki masalah yang sama dan sekarang ingin berkontribusi sesuatu yang sama.
1) rdegges menambahkan poin yang sangat baik, bahwa JWT tidak ada hubungannya dengan "keamanan" dan hanya memvalidasi, jika ada yang mengacaukan payload atau tidak (penandatanganan); ssl membantu mencegah dari pelanggaran.
2) Sekarang, jika ssl juga entah bagaimana terganggu, penyadap apa pun dapat mencuri token pembawa kami (JWT) dan menyamar sebagai pengguna asli, langkah selanjutnya yang bisa dilakukan adalah, untuk mencari "bukti kepemilikan" JWT dari klien. .
3) Sekarang, dengan pendekatan ini, presenter JWT memiliki kunci Proof-Of-Possession (POP) tertentu, yang penerima dapat secara kriptografis mengkonfirmasi apakah permintaan tersebut berasal dari pengguna asli yang sama atau tidak.
Saya merujuk artikel Proof of Possesion untuk ini dan saya yakin dengan apporach.
Saya akan senang, jika bisa berkontribusi apa pun.
Cheers (y)
sumber
Tidak bisakah kita menambahkan ip host awal yang telah meminta untuk menghasilkan token JWT ini sebagai bagian dari klaim? Sekarang ketika JWT dicuri dan digunakan dari mesin yang berbeda, ketika server memvalidasi token ini, kami dapat memverifikasi apakah mesin yang diminta sesuai dengan yang ditetapkan sebagai bagian dari klaim. Ini tidak akan cocok dan karenanya token dapat ditolak. Juga jika pengguna mencoba memanipulasi token dengan mengatur ipnya sendiri ke token, token akan ditolak ketika token diubah.
sumber