Tambahkan Segarkan Token


Dalam artikel sebelumnya, saya berbicara tentang dasar-dasar JWT . Jika dengan jari Anda, maka ini hanya kunci yang kami gunakan untuk membuka pintu ke sumber daya pribadi. Tetapi bagaimana jika kunci ini dicuri (lebih tepatnya, mereka akan membuat duplikat). Maka orang lain akan dapat masuk ke server dengan nama Anda, dan kami mungkin bahkan tidak mengetahuinya. Kami tidak ingin mengizinkan skenario seperti itu. Tetapi apa yang harus dilakukan?


Tingkatkan keamanan


Saya menyarankan pembaca, sebelum melanjutkan secara mandiri, untuk memikirkan apa yang dapat kita lakukan dengan keamanan.


Berikut adalah beberapa pendekatan yang dapat meningkatkan keamanan. Anda dapat menulis di komentar apa pendekatan lain yang ada - saya akan menambahkannya.


  1. Menggunakan protokol https , yang melindungi saluran data melalui Internet. Bahkan, ini adalah pembungkus lebih dari http , yang memberlakukan protokol kriptografi tambahan - SSL dan TLS
  2. Menambahkan informasi IP ke payload . Maka token dari IP lain tidak akan lulus verifikasi. Tetapi IP dapat dipalsukan, dan apa yang harus dilakukan dengan alamat IP dinamis atau ketika pengguna terhubung dari telepon di kafe atau metro. Karena itu, kami tidak akan menggunakan pendekatan ini.
  3. Gunakan RS256 . Ini memastikan keamanan kunci privat itu sendiri. Tetapi dengan token, semuanya tetap seperti biasa. Kami membutuhkan RS256 ketika kami takut untuk memberikan kunci rahasia ke server lain, yang mungkin tidak dapat diandalkan. Kami hanya memberi mereka alat otentikasi token, yang sama sekali tidak berguna bagi penyerang.
  4. Gunakan token berumur pendek. Tetapi kemudian pengguna harus login ulang setiap kali ia kedaluwarsa. Pengguna cepat atau lambat akan bosan dan dia akan meninggalkan sumber daya kami.
  5. Tetapi bagaimana jika Anda menggunakan token berumur pendek, tetapi berikan token lain, yang tujuannya hanya untuk mendapatkan token berumur pendek baru tanpa otorisasi baru? Token seperti itu disebut token Segarkan dan dimungkinkan untuk menggunakannya hanya sekali. Ini akan menjadi artikel saya.

Ingat Apa JWT Itu


JWT mengambil keuntungan dari JWE pengkodean JWS (Tanda Tangan) dan JWE (Enkripsi). Tanda tangan tidak memungkinkan seseorang memalsukan token tanpa informasi tentang kunci rahasia, dan pengodean melindungi terhadap pembacaan data oleh pihak ketiga.


Mari kita lihat bagaimana mereka dapat membantu kami untuk mengotentikasi dan mengotorisasi pengguna di situs.


Otentikasi (otentikasi bahasa Inggris; dari bahasa Yunani. Αὐθεντικός [authentikos] - nyata, asli; dari αὐθέντης [otentikasi] - penulis) - prosedur otentikasi. Dalam kasus kami, kami memeriksa login + kata sandi untuk kecocokan dengan entri dalam database data pengguna.

Otorisasi ( Otorisasi Bahasa Inggris - izin, otorisasi) - memberi pengguna hak untuk melakukan tindakan tertentu; dan juga proses memeriksa (mengonfirmasi) hak-hak ini ketika mencoba melakukan tindakan ini.

Dengan kata lain, otentikasi memeriksa legalitas pengguna, dan kemudian, jika semuanya baik-baik saja, pengguna menjadi diotorisasi, yaitu, ia dapat melakukan tindakan yang diizinkan dengan database. Biasanya, kedua proses ini digabungkan, dan karena itu ada kebingungan yang terkenal.

Jenis Token


  • Access Tokens (JWTs) adalah token yang dapat digunakan untuk mengakses sumber daya yang dilindungi. Mereka berumur pendek , tetapi dapat digunakan kembali . Mereka mungkin berisi informasi tambahan, seperti masa pakai, atau alamat IP dari mana permintaan itu berasal. Itu semua tergantung keinginan pengembang.
  • Refresh Token (RT) - token ini hanya melakukan satu tugas khusus - mendapatkan token akses baru. Dan kali ini Anda tidak dapat melakukannya tanpa server otorisasi. Mereka berumur panjang , tetapi sekali pakai .

Kasus penggunaan utama adalah ini: begitu JWT lama kedaluwarsa, kami tidak dapat lagi menerima data pribadi dengannya, lalu kami mengirim RT dan kami menerima sepasang JWT+RT . Dengan JWT baru JWT kita dapat kembali beralih ke sumber daya pribadi. Tentu saja, token penyegaran juga bisa menjadi buruk, tetapi itu tidak akan terjadi segera, karena dia hidup lebih lama daripada saudaranya.



Gagasan kunci pemisahan token adalah bahwa, di satu sisi , token otorisasi memungkinkan kami untuk dengan mudah memverifikasi pengguna tanpa server otorisasi, hanya dengan membandingkan tanda tangan.


 const validateToken = token => { const [ header, payload, signature ] = token.split('.'); return signature === HS256(`${header}.${payload}`, SECRET_KEY); } 

Di sisi lain , kami memiliki yang memungkinkan kami untuk memperbarui token akses tanpa memasukkan kata sandi dari pengguna, tetapi dalam hal ini, kami masih perlu melakukan operasi mahal untuk mengakses server otorisasi.


Kesimpulannya


Berkat pendekatan ini, kami mengurangi waktu tunda untuk mengakses server latency , dan logika server itu sendiri menjadi jauh lebih sederhana. Dan dari sudut pandang keamanan, jika token akses dicuri dari kami, hanya waktu yang terbatas yang akan dapat menggunakannya - tidak lebih dari masa pakainya. Agar penyerang dapat menggunakan lebih lama, ia juga perlu mencuri penyegaran, tetapi kemudian pengguna yang sebenarnya akan tahu bahwa ia telah diretas karena ia akan dikeluarkan dari sistem. Dan sekali pengguna tersebut masuk lagi, ia akan menerima sepasang JWT+RT diperbarui, dan yang dicuri akan berubah menjadi labu.


Tautan yang bermanfaat


  1. Mengapa saya perlu Segarkan Token jika saya memiliki Akses Token?
  2. Segarkan Token: Kapan Menggunakan Mereka dan Bagaimana Mereka Berinteraksi dengan JWT
  3. Lebih Banyak Kejutan OAuth 2.0: The Refresh Token

Source: https://habr.com/ru/post/id466929/


All Articles