Aliran token penyegaran JWT


129

Saya sedang membangun aplikasi seluler dan menggunakan JWT untuk otentikasi.

Sepertinya cara terbaik untuk melakukannya adalah dengan memasangkan token akses JWT dengan token penyegaran sehingga saya dapat mengakhiri token akses sesering yang saya inginkan.

  1. Seperti apa bentuk token penyegaran? Apakah itu string acak? Apakah string itu dienkripsi? Apakah itu JWT lain?
  2. Token penyegaran akan disimpan dalam database pada model pengguna untuk akses, benar? Sepertinya itu harus dienkripsi dalam kasus ini
  3. Apakah saya akan mengirim token penyegaran kembali setelah pengguna masuk, dan kemudian meminta klien mengakses rute terpisah untuk mengambil token akses?

3
Catatan, jika Anda menggunakan token penyegaran, Anda harus memberikan kemampuan bagi pengguna untuk membuat mereka tidak valid di UI. Juga disarankan untuk secara otomatis kedaluwarsa jika tidak digunakan misalnya selama sebulan.
Vilmantas Baranauskas

1
@jtmarmon: bagaimana Anda menyimpan token penyegaran di sisi klien? Maksud saya perangkat Android dengan keamanan?
j10

Jawaban:


39

Dengan asumsi ini tentang OAuth 2.0 karena ini tentang JWT dan token penyegaran ...:

  1. seperti token akses, pada prinsipnya token penyegaran dapat berupa apa saja termasuk semua opsi yang Anda gambarkan; JWT dapat digunakan saat Server Otorisasi ingin menjadi tanpa kewarganegaraan atau ingin menerapkan semacam semantik "bukti kepemilikan" ke klien yang menampilkannya; perhatikan bahwa token penyegaran berbeda dari token akses karena tidak disajikan ke Server Sumber Daya tetapi hanya ke Server Otorisasi yang menerbitkannya di tempat pertama, sehingga pengoptimalan validasi mandiri untuk JWTs-as-access-token tidak tidak tahan untuk token penyegaran

  2. itu tergantung pada keamanan / akses database; jika database dapat diakses oleh pihak / server / aplikasi / pengguna lain, maka ya (tetapi jarak tempuh Anda mungkin berbeda dengan di mana dan bagaimana Anda menyimpan kunci enkripsi ...)

  3. Server Otorisasi dapat mengeluarkan token akses dan token penyegaran pada saat yang sama, tergantung pada hibah yang digunakan oleh klien untuk mendapatkannya; spesifikasi berisi detail dan opsi untuk setiap hibah standar


31
2. Anda harus menyimpan hash token penyegaran di database Anda dan kemudian membandingkan hash token penyegaran pengguna dengan hash yang disimpan. Aturan "jangan simpan sandi teks biasa dalam database Anda" mengikuti di sini. Pertimbangkan token seperti kata sandi acak yang Anda buat untuk pengguna.
Rohmer

2
Selain itu, Jika Anda ingin memberikan keamanan lebih, lakukan juga rotasi token penyegaran. Pentingnya hal ini telah disebutkan dalam ITEF RFC 6749 . Jika diterapkan dengan benar, ini juga dapat membantu dalam mengidentifikasi skenario pencurian token, yaitu token penyegaran telah dicuri oleh penyerang. Jika Anda mencari penjelasan yang lebih baik,
kunjungi

83

Berikut adalah langkah-langkah untuk mencabut token akses JWT Anda:

  1. Saat Anda masuk, kirim 2 token (Token akses, Segarkan token) sebagai tanggapan ke klien.
  2. Token akses akan memiliki waktu kedaluwarsa yang lebih sedikit dan Penyegaran akan memiliki waktu kedaluwarsa yang lama.
  3. Klien (Front end) akan menyimpan token penyegaran di penyimpanan lokalnya dan token akses di cookie.
  4. Klien akan menggunakan token akses untuk memanggil API. Namun jika sudah habis masa berlakunya, pilih token penyegaran dari penyimpanan lokal dan panggil API server auth untuk mendapatkan token baru.
  5. Server autentikasi Anda akan mengekspos API yang akan menerima token penyegaran dan memeriksa validitasnya dan mengembalikan token akses baru.
  6. Setelah token penyegaran kedaluwarsa, Pengguna akan keluar.

Tolong beri tahu saya jika Anda memerlukan detail lebih lanjut, saya juga dapat membagikan kode (Java + Spring boot).

Untuk pertanyaan Anda:

Q1: Ini adalah JWT lain dengan lebih sedikit klaim yang dimasukkan dengan waktu kedaluwarsa yang lama.

T2: Ini tidak akan ada di database. Backend tidak akan disimpan di mana pun. Mereka hanya akan mendekripsi token dengan kunci privat / publik dan memvalidasinya dengan waktu kadaluwarsa juga.

T3: Ya, Benar


28
Saya pikir JWT harus disimpan localStoragedan refreshTokenharus disimpan dalam file httpOnly. The refreshToekndapat digunakan untuk mendapatkan JWT baru sehingga harus ditangani dengan ekstra hati-hati.
Tnc Andrei

2
Terima kasih apa yang Anda maksud dengan menyimpan di httpOnly? Mengapa tidak menyimpan keduanya di localStorage?
Jay

8
Saya kehilangan manfaat menggunakan token penyegaran, bukankah sama untuk memperpanjang validitas token akses?
pengguna2010955

3
@Jay Menurut Jaringan Pengembang Microsoft, HttpOnly adalah bendera tambahan yang disertakan dalam header respons HTTP Set-Cookie. Menggunakan bendera HttpOnly saat membuat cookie membantu mengurangi risiko skrip sisi klien mengakses cookie yang dilindungi (jika browser mendukungnya).
shadow0359

23
# 2 sangat tidak akurat. Token penyegaran HARUS disimpan di sisi server. Anda tidak boleh memanfaatkan properti "mandiri" JWT untuk token penyegaran. Melakukannya membuat Anda tidak memiliki cara untuk mencabut token penyegaran selain mengubah kunci pribadi Anda.
Jai Sharma

26

Berdasarkan implementasi ini dengan Node.js dari JWT dengan token penyegaran :

1) Dalam hal ini mereka menggunakan uid dan itu bukan JWT. Saat mereka menyegarkan token, mereka mengirim token penyegaran dan pengguna. Jika Anda menerapkannya sebagai JWT, Anda tidak perlu mengirim pengguna, karena itu akan berada di dalam JWT.

2) Mereka menerapkan ini dalam dokumen terpisah (tabel). Masuk akal bagi saya karena pengguna dapat masuk di aplikasi klien yang berbeda dan dapat memiliki token penyegaran berdasarkan aplikasi. Jika pengguna kehilangan perangkat dengan satu aplikasi terpasang, token penyegaran perangkat tersebut dapat menjadi tidak valid tanpa memengaruhi perangkat lain yang masuk.

3) Dalam implementasi ini, ia menanggapi metode masuk dengan token akses dan token penyegaran. Ini jahitan yang benar bagi saya.


Dengan mengatakan "1) Dalam hal ini mereka menggunakan uid ..." maksud Anda UUID?
ozanmuyes

Bagaimana dengan penerapan yang lebih sederhana ini - Terbitkan JWT - kirim JWT lama saat Anda ingin menyegarkan - (Anda dapat memeriksa iatdengan jendela)
terbitkan

@adonese dengan mengirimkan hanya yang JWTAnda maksudkan refresh_tokendi dalamnya? Jika demikian, OAuth RFC 6749 secara eksplisit mengatakan untuk tidak mengirim refresh_tokenke server sumber daya (dan JWTdikirim ke server sumber daya): tools.ietf.org/html/rfc6749#section-1.5
Brenno Costa
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.