Apa perbedaan utama antara JWT dan otentikasi OAuth?

356

Saya memiliki SPA baru dengan model otentikasi stateless menggunakan JWT. Saya sering diminta untuk merujuk OAuth untuk aliran otentikasi seperti meminta saya untuk mengirim 'Bearer token' untuk setiap permintaan alih-alih tajuk token sederhana tetapi saya berpikir bahwa OAuth jauh lebih kompleks daripada otentikasi berbasis JWT sederhana. Apa perbedaan utama, haruskah saya membuat otentikasi JWT berperilaku seperti OAuth?

Saya juga menggunakan JWT sebagai XSRF-TOKEN saya untuk mencegah XSRF tetapi saya diminta untuk memisahkan mereka? Haruskah saya memisahkan mereka? Bantuan apa pun di sini akan dihargai dan dapat mengarah pada serangkaian pedoman bagi masyarakat.

Tech Junkie
sumber

Jawaban:

330

TL; DR Jika Anda memiliki skenario yang sangat sederhana, seperti aplikasi klien tunggal, API tunggal maka mungkin tidak ada untungnya untuk pergi OAuth 2.0, di sisi lain, banyak klien yang berbeda (berbasis browser, ponsel asli, sisi server) , dll) kemudian berpegang teguh pada aturan OAuth 2.0 mungkin membuatnya lebih mudah dikelola daripada mencoba menggulir sistem Anda sendiri.


Seperti yang dinyatakan dalam jawaban lain, JWT ( Pelajari JSON Web Token ) hanyalah format token, itu mendefinisikan mekanisme yang kompak dan mandiri untuk mentransmisikan data antara pihak-pihak dengan cara yang dapat diverifikasi dan dipercaya karena ditandatangani secara digital. Selain itu, aturan penyandian JWT juga membuat token ini sangat mudah digunakan dalam konteks HTTP.

Menjadi mandiri (token yang sebenarnya berisi informasi tentang subjek yang diberikan) mereka juga merupakan pilihan yang baik untuk menerapkan mekanisme otentikasi stateless (alias Lihat ibu, tidak ada sesi! ). Saat menempuh rute ini dan satu-satunya hal yang harus disajikan oleh suatu pihak untuk diberikan akses ke sumber daya yang dilindungi adalah token itu sendiri, token yang dimaksud dapat disebut token pembawa.

Dalam praktiknya, apa yang Anda lakukan sudah dapat diklasifikasikan berdasarkan token pembawa. Namun, pertimbangkan bahwa Anda tidak menggunakan token pembawa sebagaimana ditentukan oleh spesifikasi terkait OAuth 2.0 (lihat RFC 6750 ). Itu akan menyiratkan, mengandalkan Authorizationheader HTTP dan menggunakanBearer skema otentikasi.

Mengenai penggunaan JWT untuk mencegah CSRF tanpa mengetahui detail pastinya, sulit untuk memastikan keabsahan praktik itu, tetapi jujur ​​saja itu tampaknya tidak benar dan / atau tidak berharga. Artikel berikut ( Cookies vs Token: The Definitive Guide ) dapat menjadi bacaan bermanfaat tentang hal ini, khususnya bagian Perlindungan XSS dan XSRF .

Satu saran terakhir, bahkan jika Anda tidak perlu menggunakan OAuth 2.0 penuh, saya akan sangat menyarankan untuk melewatkan token akses Anda di dalam Authorizationheader daripada menggunakan header kustom . Jika mereka benar-benar token yang mengikuti aturan RFC 6750, jika tidak, Anda selalu dapat membuat skema otentikasi khusus dan masih menggunakan header itu.

Header otorisasi diakui dan diperlakukan secara khusus oleh proxy HTTP dan server. Dengan demikian, penggunaan header semacam itu untuk mengirim token akses ke server sumber daya mengurangi kemungkinan kebocoran atau penyimpanan yang tidak diinginkan dari permintaan yang diautentikasi secara umum, dan terutama header Otorisasi.

(sumber: RFC 6819, bagian 5.4.1 )

João Angelo
sumber
2
Apakah ini berarti jika saya menggunakan otentikasi JWT pada aplikasi seluler, saya tidak perlu menyertakan CSRF pada permintaan POST-nya? Tidak seperti antarmuka web dengan formulir?
user805981
2
Cookie vs Token: Panduan Definitif, yaitu auth0.com/blog/cookies-vs-tokens-definitive-guide isnt work Ini adalah pos diskusi hebat lainnya: stackoverflow.com/questions/37582444/…
Siddharth Jain
1
"mereka juga merupakan pilihan yang baik untuk menerapkan mekanisme otentikasi kewarganegaraan (alias Lihat ibu, tidak ada sesi!)." Jika Anda memerlukan cara untuk membatalkan token karena katakanlah itu bocor atau dicegat atau pengguna cukup logout dan menghapus token tidak cukup aman karena token masih valid maka Anda perlu menyimpannya di beberapa database, jadi saya pikir harus ada beberapa gagasan sesi di server untuk tujuan keamanan atau daftar hitam token sederhana. Anda mungkin mengatakan menggunakan token "segarkan" untuk ini. Tetapi token penyegaran dapat disadap juga dan konsekuensinya jauh lebih buruk.
Konrad
1
@ Konrad, saya menerapkan mekanisme yang sama yang menyimpan token valid yang tidak digunakan dalam sebuah tabel, melepaskan mereka dari sana ketika mereka kedaluwarsa. Untuk setiap permintaan yang masuk, saya telah menulis kode untuk memeriksa silang token masuk terhadap "token valid yang tidak digunakan". Meskipun bekerja, saya selalu ragu - seharusnya ada cara yang lebih baik untuk menangani token yang tidak digunakan tetapi masih valid.
Tech Junkie
2
Di sisi lain, token penyegaran hanya mempersulit implementasi klien. Karena jika token akses Anda kedaluwarsa, Anda perlu mengatasinya, pengguna akan kesal jika Anda hanya akan mengeluarkannya tanpa ada kemungkinan penyegaran sesi secara manual (seperti bank melakukannya). Ini sedikit lebih banyak pekerjaan yang harus dilakukan, juga menggunakan cara otentikasi standar (OID) dan otorisasi (OAuth) sering kali dapat menjadi terlalu banyak.
Konrad
281

OAuth 2.0 mendefinisikan protokol, yaitu menentukan bagaimana token ditransfer, JWT mendefinisikan format token.

OAuth 2.0 dan "otentikasi JWT" memiliki penampilan yang mirip ketika datang ke tahap (ke-2) di mana Klien menyajikan token ke Server Sumber Daya: token diteruskan dalam header.

Tetapi "otentikasi JWT" bukanlah standar dan tidak menentukan bagaimana Klien mendapatkan token di tempat pertama (tahap 1). Di situlah kompleksitas yang dirasakan berasal dari OAuth: ia juga mendefinisikan berbagai cara yang dapat diperoleh Klien token akses dari sesuatu yang disebut Server Otorisasi.

Jadi perbedaan sebenarnya adalah bahwa JWT hanyalah format token, OAuth 2.0 adalah protokol (yang mungkin menggunakan JWT sebagai format token).

Hans Z.
sumber
10
Apakah implementasi protokol oAuth menggunakan JWT sebagai format token, untuk sebagian besar kasus? Kalau bukan apa yang paling umum?
James Wierzba
14
Format token dalam oauth tidak terdefinisi, tetapi JWT seharusnya bekerja dengan baik
vikingsteve
129

Pertama, kita harus membedakan JWT dan OAuth. Pada dasarnya, JWT adalah format token. OAuth adalah protokol otorisasi yang dapat menggunakan JWT sebagai token. OAuth menggunakan penyimpanan sisi server dan sisi klien. Jika Anda ingin melakukan logout nyata, Anda harus menggunakan OAuth2. Otentikasi dengan token JWT sebenarnya tidak bisa keluar. Karena Anda tidak memiliki Server Otentikasi yang melacak token. Jika Anda ingin memberikan API ke klien pihak ke-3, Anda harus menggunakan OAuth2 juga. OAuth2 sangat fleksibel. Implementasi JWT sangat mudah dan tidak perlu waktu lama untuk diimplementasikan. Jika aplikasi Anda membutuhkan fleksibilitas semacam ini, Anda harus menggunakan OAuth2. Tetapi jika Anda tidak memerlukan skenario kasus penggunaan ini, menerapkan OAuth2 adalah buang-buang waktu.

Token XSRF selalu dikirim ke klien di setiap header respons. Tidak masalah apakah token CSRF dikirim dalam token JWT atau tidak, karena token CSRF diamankan dengan sendirinya. Oleh karena itu pengiriman token CSRF di JWT tidak perlu.

Melikşah Şimşek
sumber
7
Saya tidak mengerti mengapa jawaban ini memiliki banyak upvotes, ini menyatakan bahwa "OAuth adalah kerangka kerja otentikasi" dan ini sepenuhnya salah. OAuth adalah protokol otorisasi dan hanya protokol otorisasi.
Michael
4
Hai @Michael ada terlalu banyak kesalahpahaman tentang ini. Saya mengedit komentar saya, terima kasih.
Melikşah Şimşek
6
@Michael, tolong hargai jawaban dari bcz lain yang dia bagikan pengetahuannya kepada kami dan saya sangat menikmati jawabannya.
Yasir Shabbir Choudhary
Apakah kalian mengatakan bahwa Oauth hanyalah sepotong Standar yang harus diikuti pengembang? Atau itu benar-benar sebuah kerangka kerja?
StormTrooper
65

JWT (JSON Web Tokens) - Ini hanya format token. Token JWT adalah struktur data bersandi JSON yang berisi informasi tentang penerbit, subjek (klaim), waktu kedaluwarsa, dll. Ini ditandatangani untuk bukti dan keaslian tamper dan dapat dienkripsi untuk melindungi informasi token menggunakan pendekatan simetris atau asimetris. JWT lebih sederhana dari SAML 1.1 / 2.0 dan didukung oleh semua perangkat dan lebih kuat daripada SWT (Simple Web Token).

OAuth2 - OAuth2 memecahkan masalah yang pengguna ingin mengakses data menggunakan perangkat lunak klien seperti menelusuri aplikasi web berbasis, aplikasi seluler asli atau aplikasi desktop. OAuth2 hanya untuk otorisasi, perangkat lunak klien dapat diotorisasi untuk mengakses sumber daya atas nama pengguna akhir menggunakan token akses.

OpenID Connect - OpenID Connect dibuat di atas OAuth2 dan menambahkan otentikasi. OpenID Connect menambahkan beberapa kendala untuk OAuth2 seperti Titik Akhir UserInfo, ID Token, penemuan dan pendaftaran dinamis penyedia OpenID Connect dan manajemen sesi. JWT adalah format wajib untuk token.

Perlindungan CSRF - Anda tidak perlu menerapkan perlindungan CSRF jika Anda tidak menyimpan token di cookie browser.

Anda dapat membaca detail lebih lanjut di sini http://proficientblog.com/microservices-security/

ManishSingh
sumber
3
Tanpa cookie == Tidak ada perlindungan CSRF. Jika Anda tidak menggunakan cookie untuk otorisasi, maka Anda tidak perlu khawatir tentang perlindungan CSRF.
niranjan harpale
51

Sepertinya semua orang yang menjawab di sini melewatkan titik perdebatan OAUTH

Dari Wikipedia

OAuth adalah standar terbuka untuk delegasi akses, yang biasa digunakan sebagai cara bagi pengguna Internet untuk memberikan situs web atau aplikasi akses ke informasi mereka di situs web lain tetapi tanpa memberi mereka kata sandi. [1] Mekanisme ini digunakan oleh perusahaan seperti Google, Facebook, Microsoft dan Twitter untuk mengizinkan pengguna untuk berbagi informasi tentang akun mereka dengan aplikasi pihak ketiga atau situs web.

Poin kuncinya di sini adalah access delegation . Mengapa ada orang yang membuat OAUTH ketika ada otentikasi berbasis id / pwd, yang didukung oleh auth multifactored seperti OTP dan selanjutnya dapat diamankan oleh JWT yang digunakan untuk mengamankan akses ke jalan (seperti cakupan di OAUTH) dan mengatur kedaluwarsa dari mengakses

Tidak ada gunanya menggunakan OAUTH jika konsumen mengakses sumber daya mereka (titik akhir Anda) hanya melalui situs web (atau aplikasi) tepercaya mereka yang lagi-lagi dihosting pada titik akhir Anda

Anda dapat menggunakan autentikasi OAUTH hanya jika Anda berada OAUTH providerdalam kasus di mana pemilik sumber daya (pengguna) ingin mengakses sumber daya (Anda) mereka (titik akhir) melalui klien pihak ketiga (aplikasi eksternal). Dan itu persis dibuat untuk tujuan yang sama meskipun Anda dapat menyalahgunakannya secara umum

Catatan penting lainnya:
Anda bebas menggunakan kata authenticationuntuk JWT dan OAUTH tetapi tidak menyediakan mekanisme otentikasi. Ya satu adalah mekanisme token dan yang lainnya adalah protokol tetapi setelah dikonfirmasi mereka hanya digunakan untuk otorisasi (manajemen akses). Anda harus mendukung OAUTH baik dengan otentikasi tipe OPENID atau kredensial klien Anda sendiri

manikawnth
sumber
4
OAuth juga dapat digunakan untuk klien Anda sendiri, tidak hanya untuk pihak ke-3. Jenis Hibah Kredensial Kata Sandi melakukan hal itu.
harpratap
1
Saya mencari google untuk jawaban yang konkret tetapi tidak dapat menemukannya. Semua orang hanya berbicara tentang definisi misalnya token vs protokol. Jawaban Anda menjelaskan tujuan sebenarnya menggunakan yang satu di atas yang lain. Terima kasih banyak!
Vivek Goel
9

temukan perbedaan utama antara JWT & OAuth

  1. OAuth 2.0 mendefinisikan protokol & JWT mendefinisikan format token.

  2. OAuth dapat menggunakan JWT sebagai format token atau token akses yang merupakan token pembawa.

  3. Koneksi OpenID sebagian besar menggunakan JWT sebagai format token.

Suraj Kumar Pandey
sumber
6

JWT adalah standar terbuka yang mendefinisikan cara yang ringkas dan mandiri untuk mentransmisikan informasi antar pihak secara aman. Ini adalah protokol otentikasi tempat kami mengizinkan klaim yang disandikan (token) untuk ditransfer antara dua pihak (klien dan server) dan token dikeluarkan setelah identifikasi klien. Dengan setiap permintaan berikutnya, kami mengirim token.

Sedangkan OAuth2 adalah kerangka kerja otorisasi, di mana ia memiliki prosedur umum dan pengaturan yang ditentukan oleh kerangka kerja. JWT dapat digunakan sebagai mekanisme di dalam OAuth2.

Anda dapat membaca lebih lanjut tentang ini di sini

OAuth atau JWT? Yang mana yang digunakan dan mengapa?

samuelj90
sumber
5

Pertanyaannya adalah pertanyaan umum, tetapi tidak masuk akal. JWT adalah jenis Token, dan OAuth adalah Kerangka yang menjelaskan cara mengeluarkan token.

Apa yang kita maksud dengan "framework"? Hanya urutan permintaan dan tanggapan, dan formatnya, yang dapat dan seharusnya digunakan untuk meminta token. OAuthv2 menjelaskan "aliran" atau jenis hibah yang terpisah untuk skenario yang berbeda, dan memiliki ekstensi yang berbeda (seperti PKCE) untuk memperluas keamanan arus tertentu.

Hasil permintaan-to-token melalui hibah OAuthV2 adalah ... token. Benda itu kemudian digunakan sebagai "token pembawa" yang berarti, pihak mana pun yang memegang token, dapat menyajikannya ketika membuat api permintaan-untuk-layanan (misalnya, "berapa saldo pada kartu nilai tersimpan saya?"). Sebagai token Pembawa, ini bekerja seperti uang tunai. Jika Anda memegangnya, Anda bisa menggunakannya. (Meskipun tidak seperti uang tunai, token tidak menggunakan-dan-kehilangan itu. Mungkin analogi yang lebih baik adalah tiket-untuk-naik sepanjang hari pada sistem angkutan umum, atau tiket sepanjang hari di Disneyworld.)

JWT adalah jenis token tertentu, dan JWT benar-benar dapat digunakan sebagai token OAuth Bearer. Sebenarnya, ini adalah praktik yang paling umum. Dalam terang itu, "JWT vs OAuth" adalah perbandingan apel dan gerobak apel.

Seringkali orang berpikir "token OAuth" selalu menyiratkan token buram - urutan acak karakter alfanumerik yang tidak mengandung makna yang melekat - yang diberikan oleh apotik token OAuth, yang kemudian dapat divalidasi hanya oleh sistem apotik OAuth yang sama. Tapi ini bukan satu-satunya token OAuth. Token buram adalah salah satu jenis token; JWT dapat digunakan sebagai jenis token OAuth yang berbeda.

JWT, sebaliknya, tidak buram. JWT bukan "penunjuk" atau referensi ke informasi. Ini sebenarnya mengandung banyak informasi spesifik, yang dapat diekstraksi dan ditafsirkan oleh pihak mana pun yang memiliki token. Karena JWT berisi informasi nyata, JWT bisa besar; 300 byte, 500 byte, atau lebih, tergantung pada klaim yang terkandung di dalamnya, dan algoritma yang digunakan untuk menandatanganinya. Ketika orang mengatakan "JWT memvalidasi diri" apa artinya, pemegang JWT dapat membukanya, memvalidasinya, dan kemudian membuat keputusan otorisasi berdasarkan klaim yang disajikan di dalamnya. Memvalidasi JWT berarti: memverifikasi strukturnya, mendekode pengkodean base64, memverifikasi kunci sudah benar, memverifikasi tanda tangan, kemudian memverifikasi klaim yang diperlukan ada di token, memeriksa kedaluwarsa. Itu bukan hal yang sederhana, bukan proses multi-langkah, tetapi tentu saja ada banyak perpustakaan dalam berbagai bahasa pemrograman yang heklp dengan ini, dan tentu saja ada kebijakan VerifyJWT yang membantu Anda melakukan ini dalam proksi Apigee Edge API. Intinya, pemegang atau penerima dapat memverifikasi token. Karena itu, kami mengatakan bahwa JWT mendukung "Federasi" - siapa pun dapat menghasilkan token, dan siapa saja dapat membaca dan memvalidasi token.

klaim khusus. Token JWT dan OAuth yang buram dapat membawa klaim khusus tentang subjek. keamanan. Keduanya adalah token pembawa. Keduanya harus dilindungi sebagai rahasia. kedaluwarsa. Keduanya dapat ditandai dengan kedaluwarsa. Keduanya dapat disegarkan. Mekanisme atau pengalaman otentikasi. Keduanya dapat menyajikan pengalaman pengguna yang sama.

Pramod Gautam
sumber
0

Jwt adalah seperangkat instruksi ketat untuk menerbitkan dan memvalidasi token akses yang ditandatangani. Token berisi klaim yang digunakan oleh aplikasi untuk membatasi akses ke pengguna

OAuth2 di sisi lain bukan protokol, ini adalah kerangka otorisasi yang didelegasikan. pikirkan pedoman yang sangat terperinci, untuk memungkinkan pengguna dan aplikasi mengotorisasi izin khusus untuk aplikasi lain dalam pengaturan pribadi dan publik. OpenID Connect yang berada di atas OAUTH2 memberi Anda Otentikasi dan Otorisasi. Ini merinci bagaimana beragam peran, pengguna di sistem Anda, aplikasi sisi server seperti API, dan klien seperti situs web atau aplikasi seluler asli, dapat mengautentikasi dengan masing-masing yang lain.

Catatan oauth2 dapat bekerja dengan jwt, implementasi yang fleksibel, dapat dikembangkan ke berbagai aplikasi

naila naseem
sumber
Tampaknya Anda memiliki ini persis mundur.
jbruni