JSON Web Token - mengapa payload bersifat publik?

30

Saya tidak dapat memahami alasan untuk membuat klaim / payload JWT terlihat publik setelah base64 mendekodekannya.

Mengapa?

Sepertinya akan jauh lebih berguna untuk membuatnya dienkripsi dengan rahasia.

Adakah yang bisa menjelaskan mengapa, atau dalam situasi apa, menjaga data ini tetap berguna?

saya membutuhkan bantuan
sumber
ketika Anda menulis JWT, Anda mungkin berarti JWS. Karena JWE (yang juga "subclass" dari JWT) sebenarnya mengenkripsi kontennya.
Alexey

Jawaban:

28

Anda memilih untuk tidak mengenkripsi muatan karena alasan yang sama dengan yang Anda pilih untuk tidak mengenkripsi hal lain: biaya (betapapun kecilnya) melebihi manfaatnya, dan banyak data tidak perlu diamankan dengan cara itu.

Yang paling Anda butuhkan perlindungan terhadapnya adalah orang-orang yang merusak data sehingga catatan yang salah diperbarui, atau rekening giro seseorang mendapat uang di dalamnya yang seharusnya tidak dimiliki. Tanda tangan JSON Web Token memenuhi hal itu, karena mengubah bagian dari kombinasi header / payload / signature membatalkan paket.

Perhatikan bahwa Anda masih bisa mengamankan paket di Transport Layer dengan menggunakan SSL.

Robert Harvey
sumber
Ah, begitu, jadi pada dasarnya JWT adalah token CSRF baru. Terima kasih atas penjelasan Anda, ini telah menghilangkan kebingungan.
ineedhelp
6
Tidak, JWT bukan token CSRF baru. Itu adalah 2 hal yang berbeda.
Ash
@ash jika detail operasi disimpan di JWT dan divalidasi di server, bukankah JWT pada dasarnya memainkan peran pencegahan CSRF dalam skenario itu? Saya mengerti tujuan utama vanilla JWT adalah otentikasi, yang sangat jelas dari jawaban ini. Saya pikir saya membayangkan menambahkan lebih banyak data dan menyelesaikan dua hal sekaligus.
ineedhelp
@ RobertTarvey, Anda menggunakan JWT secara tidak benar. JST adalah istilah "payung" untuk JWS dan JWE. JWS adalah untuk mengotentikasi, JWE adalah untuk mengenkripsi. Jadi "Tujuan dari Token Web JSON adalah untuk mengotentikasi" seharusnya sebenarnya "JWS untuk mengotentikasi".
Alexey
@ Alexey: Saya membuat sedikit perubahan dalam jawaban saya untuk mengakomodasi.
Robert Harvey
4

Penggunaan istilah tanda tangan dalam RFC adalah analog dengan tanda tangan digital dalam kriptografi asimetris. Dalam kriptografi asimetris jika pengirim mengenkripsi pesan dengan kunci pribadi mereka, siapa pun yang memiliki pesan dapat mendekripsi dengan kunci publik pengirim. Jadi tujuan dengan istilah tanda tangan bukan untuk menjaga rahasia pesan, tetapi untuk memverifikasi integritas / pengirim pesan, yang belum diubah.

Dalam kasus JWT sistem pengiriman adalah pencipta dan konsumen pesan (lihat diagram di bawah), dan tujuannya adalah untuk memastikan token yang diberikan kepada pengguna tidak dirusak (misalnya diberi hak tinggi yang diberikan).

Dan seperti yang disebutkan @Robert, JWT masih bisa / harus dienkripsi dengan TLS.

Berikut adalah penjelasan yang bagus tentang JWT dan tanda tangan dari mana gambar di bawah ini bersumber. 5 Langkah Mudah Memahami Token Web JSON (JWT)

asdfasdf

Mikha B.
sumber
2

Untuk menambah jawaban Robert Harveys, ada kerugian yang signifikan untuk mengenkripsi muatan - itu berarti bahwa penerima layanan perlu berbagi rahasia dengan server otentikasi (kunci enkripsi) untuk memahami apakah pembawa token itu berwenang atau tidak atau tidak. Sebaliknya siapa pun dapat memvalidasi JWT hanya menggunakan kunci publik yang diterbitkan oleh server otentikasi.

Ini adalah bagian penting dari spesifikasi koneksi openid karena memungkinkan aplikasi klien untuk memvalidasi token identitas yang dikeluarkan oleh server auth, juga memudahkan untuk menggunakan server sumber daya (karena mereka tidak perlu digunakan dengan akses ke enkripsi rahasia kunci) dan juga membantu ketika mencoba mendiagnosis masalah dengan JWT yang dikeluarkan.

Justin
sumber
Anda mencoba membandingkan mekanisme enkripsi asimetris dan simetris, jwt adalah implementasi enkripsi RSA.
TheAnimatrix