Apa itu JWT? Token Web JSON Dijelaskan Dengan Contoh Kerja
JWT memungkinkan server memercayai permintaan tanpa mencari apa pun. Bangun satu dari awal, coba ubah dan lihat gagal, lalu pelajari kapan token mengalahkan sesi dan cara menggunakannya dengan aman.
- JWT adalah token yang ringkas dan ditandatangani dengan tiga bagian: header, payload, dan tanda tangan.
- Tanda tangan tersebut membuktikan bahwa token belum diubah, sehingga server dapat mempercayainya tanpa perlu mencari.
- Payloadnya dapat dibaca oleh siapa saja, jadi jangan pernah menaruh rahasia di dalamnya.
- Token sulit untuk dicabut, jadi pertahankan umurnya yang pendek, dan verifikasi dengan perpustakaan tepercaya.
Setelah Anda login, bagaimana server mengetahui bahwa setiap permintaan selanjutnya benar-benar dari Anda? Salah satu jawaban yang populer adalah JSON Web Token, atau JWT, biasanya diucapkan “jot”. Ini adalah sepotong kecil data bertanda tangan yang dikirimkan klien dengan setiap permintaan, dan server dapat memeriksanya tanpa menyentuh database.
Cara tercepat untuk memahami JWT adalah dengan membangunnya dan kemudian mencoba memecahkannya. Kami melakukannya hanya dengan menggunakan pustaka standar Python, pada Python 3.13, dan output di bawah ini berasal dari proses tersebut. Kode ini untuk pembelajaran. Dalam aplikasi nyata, gunakan perpustakaan yang terpelihara dengan baik, karena detail verifikasi mudah salah.
Apa itu JWT?
JWT adalah standar terbuka, yang didefinisikan dalam RFC 7519, untuk meneruskan klaim antara dua pihak sebagai rangkaian kompak. Klaim hanyalah sebuah pernyataan, seperti “ID pengguna ini adalah 42”. Karena token ditandatangani, penerima dapat mengonfirmasi siapa yang mengeluarkannya dan tidak ada yang mengubahnya.
Bayangkan sebuah gelang festival. Staf di gerbang memeriksa tiket Anda sekali dan memberi Anda pita yang sulit dipalsukan. Setelah itu, masing-masing kios tinggal melihat bandnya, tidak perlu menelepon loket penjualan tiket. JWT bekerja dengan cara yang hampir sama untuk API.
Cara kerja login JWT
- Pengguna mengirimkan nama pengguna dan kata sandi ke titik akhir login.
- Server memeriksanya dan membuat token yang ditandatangani.
- Klien menyimpan token.
- Setiap permintaan selanjutnya menyertakannya, biasanya dalam header:
Authorization: Bearer <token>. - Server memverifikasi tanda tangan dan masa berlakunya, kemudian membaca klaimnya.
Manfaat utamanya ada pada langkah 5. Server tidak perlu mencari sesi, yang berguna ketika banyak layanan atau server perlu memeriksa token yang sama. Jika Anda baru mengenal API, mulailah dengan apa itu API.
Tiga bagian JWT
JWT tampak seperti teks acak, tetapi merupakan tiga bagian berkode URL Base64 yang dipisahkan oleh titik. Ini yang kami hasilkan:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiI0MiIsInJvbGUiOiJ1c2VyIiwiaWF0IjoxNzkzNTAwMDAwLCJleHAiOjE3OTM1MDA5MDB9
.7YfUDH_T-iDh8bMmUT8mmKYwOstzT8Ty--DTTAmQGWM
Kami telah menambahkan jeda baris agar lebih mudah dibaca. Menguraikan dua bagian pertama menghasilkan JSON biasa:
Header: {"alg":"HS256","typ":"JWT"}
Payload: {"sub":"42","role":"user","iat":1793500000,"exp":1793500900}
| Bagian | Berisi | Tujuan |
|---|---|---|
| Tajuk | Jenis token dan algoritma penandatanganan | Mengatakan cara memverifikasi token |
| Muatan | Klaim tentang pengguna atau sesi | Informasi sebenarnya |
| Tanda tangan | Hash dari dua bagian pertama, menggunakan kunci | Membuktikan integritas dan asal |
Klaim standar
| Klaim | Nama | Artinya |
|---|---|---|
sub |
Subyek | Tentang siapa token itu, biasanya ID pengguna |
iss |
Penerbit | Siapa yang membuat token tersebut |
aud |
Penonton | Untuk siapa token itu ditujukan |
pengalaman |
Kedaluwarsa | Ketika token tidak lagi valid |
iat |
Dikeluarkan pada | Kapan itu dibuat |
nbf |
Tidak sebelumnya | Kapan itu mulai valid |
jti |
ID JWT | ID unik untuk token ini |
Anda juga dapat menambahkan klaim khusus, seperti role. Waktu adalah cap waktu Unix, dalam hitungan detik. Pertahankan muatannya tetap kecil, karena token berpindah dengan setiap permintaan.
Bangun sendiri
Membuat token melibatkan pengkodean dua bagian JSON, dan kemudian menandatanganinya dengan rahasia menggunakan HMAC-SHA256:
import base64, hashlib, hmac, json
SECRET = b"demo-secret-do-not-use-in-production"
def b64url(data):
return base64.urlsafe_b64encode(data).rstrip(b"=").decode()
def sign(message):
return b64url(hmac.new(SECRET, message.encode(), hashlib.sha256).digest())
def create_token(payload):
header = {"alg": "HS256", "typ": "JWT"}
parts = [
b64url(json.dumps(header, separators=(",", ":")).encode()),
b64url(json.dumps(payload, separators=(",", ":")).encode()),
]
message = ".".join(parts)
return message + "." + sign(message)
Verifikasi bekerja dengan menghitung ulang tanda tangan, dan membandingkannya dengan yang ada di token. Hanya seseorang yang mempunyai rahasia yang dapat menghasilkan rahasia yang cocok:
def verify_token(token, now):
header, payload, signature = token.split(".")
expected = sign(header + "." + payload)
if not hmac.compare_digest(signature, expected):
raise ValueError("bad signature")
claims = json.loads(b64url_decode(payload))
if claims["exp"] < now:
raise ValueError("token expired")
return claims
Token yang valid mengembalikan klaimnya seperti yang diharapkan. compare_digest digunakan karena berjalan dalam waktu yang konstan, yang menghindari kebocoran informasi melalui perbedaan waktu.
Cobalah untuk mengutak-atiknya
Misalkan seorang penyerang mendekode payload, mengubah "role":"user" menjadi "role":"admin", mengkodekannya lagi dan mempertahankan tanda tangan lama. Kami mencoba ini, bersama dengan dua serangan lainnya:
| Mencoba | Hasil |
|---|---|
| Mengubah peran menjadi admin | tanda tangan yang buruk |
| Gunakan token 1 detik setelah habis masa berlakunya | tokennya sudah habis masa berlakunya |
Setel "alg":"none" dan hapus tanda tangannya |
tanda tangan yang buruk |
Upaya terakhir ini menargetkan kelemahan historis yang nyata. Beberapa perpustakaan pernah mempercayai header token itu sendiri, sehingga penyerang dapat dengan mudah menyatakan bahwa tidak diperlukan tanda tangan. Kode kami selalu menggunakan satu algoritma tetap, itulah sebabnya kode tersebut ditolak. Di perpustakaan nyata, selalu tentukan algoritma yang Anda terima.
Ditandatangani, tidak dienkripsi
Ini adalah poin yang paling disalahpahami tentang JWT. Token palsu kami ditolak, namun isinya masih dapat dibaca dengan sempurna:
{"sub":"42","role":"admin","iat":1793500000,"exp":1793500900}
Base64URL adalah pengkodean, bukan enkripsi, dan siapa pun dapat membalikkannya tanpa kunci sama sekali. Tanda tangan menghentikan orang untuk mengubah data, namun tidak menghentikan membaca data tersebut. Jadi jangan pernah memasukkan kata sandi, nomor kartu, atau data pribadi pribadi ke dalam muatan JWT. Jika isinya harus disembunyikan, gunakan token terenkripsi (JWE), atau simpan saja datanya di server.
HS256 vs RS256
| Aspek | HS256 | RS256 atau ES256 |
|---|---|---|
| Ketik | Simetris | Asimetris |
| Kunci | Satu rahasia bersama | Tanda kunci pribadi, kunci publik memverifikasi |
| Siapa yang dapat membuat token | Siapapun yang memegang rahasianya | Hanya pemegang kunci pribadi |
| Terbaik untuk | Satu layanan, atau grup kecil tepercaya | Banyak layanan, pihak ketiga, penyedia identitas |
Dengan penandatanganan asimetris, layanan lain dapat memverifikasi token tanpa dapat membuat tokennya sendiri, sehingga membatasi kerusakan jika ada yang disusupi.
JWT vs sesi
JWT sering kali disajikan sebagai pengganti sesi modern. Pada kenyataannya, masing-masing memiliki trade-off:
| Aspek | Sesi server | JWT |
|---|---|---|
| Tempat tinggal negara | Di server | Sebagai tandanya |
| Cari pada setiap permintaan | Biasanya | Tidak diperlukan |
| Logout atau mencabut | Mudah, hapus sesi itu | Keras sebelum kadaluwarsa |
| Ukuran per permintaan | tanda pengenal kecil | Token lebih besar (milik kami 161 karakter) |
| Di banyak layanan | Membutuhkan penyimpanan bersama | Masing-masing dapat memverifikasinya secara langsung |
| Mengubah izin | Berlaku segera | Token lama tetap berlaku hingga habis masa berlakunya |
Untuk situs web tradisional yang dirender oleh server, cookie sesi seringkali lebih sederhana dan lebih aman. JWT cenderung lebih masuk akal untuk API yang digunakan oleh beberapa layanan, atau untuk klien seluler.
Tips: Jangan memilih JWT hanya karena terdengar tanpa kewarganegaraan. Banyak sistem nyata menambahkan daftar penolakan atau pemeriksaan database untuk mendukung logout, yang mengembalikan pencarian yang seharusnya dihindari oleh JWT.
Tempat menyimpan token di browser
| Lokasi | risiko XSS | risiko CSRF | Catatan |
|---|---|---|---|
Penyimpanan lokal |
Tinggi, karena skrip dapat membacanya | Rendah | Sederhana, tetapi terkena skrip apa pun yang disuntikkan |
| Cookie HttpOnly | Lebih rendah, karena skrip tidak dapat membacanya | Membutuhkan perlindungan | Gunakan Secure dan SameSite |
| Variabel dalam memori | Lebih rendah | Rendah | Hilang pada penyegaran, sehingga perlu aliran penyegaran |
Banyak panduan keamanan mendukung cookie HttpOnly, Secure, SameSite untuk aplikasi web. Apa pun yang Anda pilih, selalu gunakan HTTPS. Untuk mengirim token dari JavaScript, lihat tutorial JavaScript Fetch API kami.
Segarkan token
Kedaluwarsa yang singkat membatasi kerusakan dari token yang dicuri, tetapi tidak ada yang mau masuk setiap 15 menit. Solusi yang biasa menggunakan dua token:
- Token akses: berumur pendek, seperti menit, dan dikirim bersama setiap permintaan API.
- Segarkan token: berumur lebih panjang, disimpan lebih hati-hati dan hanya digunakan untuk mendapatkan token akses baru.
Server melacak token penyegaran, sehingga dapat mencabutnya, sehingga Anda dapat keluar secara praktis. Memutarnya setiap kali digunakan juga membantu Anda mendeteksi pencurian, karena token lama yang dicuri akan diputar ulang.
Kesalahan keamanan umum
- Decoding tanpa verifikasi. Membaca payload tidak membuatnya dapat dipercaya. Selalu periksa tanda tangannya.
- Menerima algoritme apa pun. Tetapkan daftar eksplisit algoritme yang diizinkan.
- Menggunakan rahasia yang lemah. Rahasia pendek dapat dipecahkan secara offline. Gunakan nilai acak yang panjang, dan jauhkan dari kendali sumber.
- Melewatkan masa berlaku. Token tanpa
expdapat berfungsi selamanya jika dicuri. - Tidak memeriksa
issdanaud. Jika tidak, token yang diterbitkan untuk satu layanan dapat diterima oleh layanan lain. - Memercayai klaim yang sudah ketinggalan zaman. Peran di dalam token bisa saja kedaluwarsa hingga habis masa berlakunya.
- Logging token. Siapa pun yang membaca log Anda dapat menggunakannya kembali.
- Tidak menguji jalur kegagalan. Tambahkan pengujian untuk token yang kedaluwarsa dan dimodifikasi, serta yang valid. Panduan Pengujian API dengan Tukang Pos kami dapat membantu.
Penutup
JWT adalah data bertanda tangan yang dapat dipercaya oleh server tanpa pencarian, bukan wadah rahasia dan bukan peningkatan otomatis melalui sesi. Gunakan masa berlaku yang singkat, verifikasi semuanya dengan perpustakaan yang dikelola, dan jauhkan data pribadi dari muatan. Untuk melihatnya sendiri, jalankan skrip kecil seperti milik kami, ubah satu karakter token dan lihat verifikasi gagal.
Pertanyaan yang sering diajukan
Untuk apa JWT digunakan?
JWT sebagian besar digunakan untuk otentikasi dan otorisasi di API. Setelah login, klien mengirimkan token dengan setiap permintaan, dan server memverifikasinya untuk mengidentifikasi pengguna.
Apakah JWT dienkripsi?
Biasanya tidak. JWT standar ditandatangani dan dikodekan, sehingga siapa pun dapat membaca muatannya. Tanda tangan hanya mencegah perubahan. Token terenkripsi menggunakan format terkait yang disebut JWE.
Berapa lama JWT bertahan?
Token akses biasanya berumur pendek, seringkali dalam hitungan menit, bukan hari. Pasangkan dengan token penyegaran, sehingga pengguna tidak perlu login terus-menerus.
Apakah JWT bisa dicabut?
Tidak dengan sendirinya, karena tetap berlaku hingga habis masa berlakunya. Pencabutan memerlukan pelacakan sisi server, seperti daftar penolakan, yang menghilangkan beberapa manfaat tanpa kewarganegaraan.
Apakah JWT lebih baik daripada sesi?
Tidak ada yang selalu lebih baik. Sesi lebih mudah untuk dicabut dan disesuaikan dengan banyak situs web, sementara JWT sesuai dengan API dan layanan yang perlu memverifikasi identitas secara independen.
Teruslah belajar
Butuh bantuan dengan pengujian, WordPress atau SEO?
Kami membantu tim mengirimkan perangkat lunak yang lebih baik dan mengembangkan situs mereka. Beritahu kami apa yang sedang Anda kerjakan dan kami akan menyarankan langkah selanjutnya yang jelas.
Panduan lebih lanjut tentang pengujian, AI & pengembangan modern
Menikmati artikel ini? Pilih topik dan langsung masuk ke tutorial terbaru kami.
Penjelasan Halusinasi AI: Mengapa Model Bahasa Memperbaiki Masalah dan Cara Menguranginya
Halusinasi AI menjelaskan: apa itu, mengapa model bahasa memproduksinya, tipe umum, cara menguranginya dengan landasan dan petunjuk, dan pemeriksaan…
Baca artikel →DevOpsPenjelasan Variabel Lingkungan: File .env, Rahasia, dan Konfigurasi Dilakukan dengan Benar
Variabel lingkungan dijelaskan dengan contoh Python yang kami jalankan: membaca dan mengaturnya, mengapa setiap nilai berupa string, file .env, pewa…
Baca artikel →Pengembangan perangkat lunakPenjelasan Pembatasan Kecepatan API: Algoritma, Header, dan Penanganan 429 Kesalahan
Pembatasan laju API dijelaskan dengan simulasi yang kami jalankan: keranjang token, jendela tetap, jendela geser, respons 429, header batas laju, pe…
Baca artikel →Otomatisasi pengujianMengejek dengan Python: unittest.mock, patch dan Kesalahan yang Membuat Tes Berbohong
Mengejek dengan Python dengan unittest.mock, menguji: Mock dan return_value, side_effect, menambal di mana nama digunakan, spesifikasi dan autospec,…
Baca artikel →Pengujian perangkat lunakPenjelasan Cakupan Kode: Cakupan Jalur vs Cabang dan Apa Arti 100% Sebenarnya
Cakupan kode dijelaskan dengan coverage.py yang sebenarnya dijalankan: cakupan garis, cabang dan kondisi, membaca laporan, mengapa cakupan 100% masi…
Baca artikel →Basis data & SQLDELETE vs TRUNCATE vs DROP dalam SQL: Perbedaan, Rollback dan Kapan Menggunakan Masing-Masing
DELETE vs TRUNCATE vs DROP dijelaskan dengan SQL yang diuji: apa yang dihapus, rollback, pemicu, reset identitas, kecepatan, dan perbedaan PostgreSQ…
Baca artikel →Basis data & SQLPenjelasan Tampilan SQL: Membuat, Menggunakan, dan Menghindari Kesalahan, Dengan Contoh
Tampilan SQL dijelaskan dengan kueri yang kami jalankan: membuat tampilan, hasil langsung, menyembunyikan kolom, kinerja, tampilan yang dapat diperb…
Baca artikel →Pengembangan perangkat lunakAntarmuka TypeScript vs Tipe: Perbedaan Nyata, Diuji Dengan Kompiler
Antarmuka TypeScript vs tipe, diperiksa dengan kompiler sebenarnya: apa yang bisa dilakukan keduanya, apa yang hanya bisa dilakukan satu orang, peng…
Baca artikel →Pengembangan perangkat lunakPenjelasan Python *args dan **kwargs: Fungsi Fleksibel Dengan Contoh Jelas
Python *args dan **kwargs dijelaskan dengan kode yang kami jalankan: pengepakan dan pembongkaran, urutan parameter, argumen hanya kata kunci dan pos…
Baca artikel →Pengembangan perangkat lunakFungsi Python Lambda: Sintaks, Kegunaan Sebenarnya, dan Kapan Tidak Digunakan
Fungsi python lambda dijelaskan dengan kode yang kami jalankan: sintaksis, pengurutan dengan kunci, peta dan filter, penutupan, jebakan pengikatan a…
Baca artikel →Kecerdasan buatanApa Itu Agen AI? Cara Kerjanya, Dengan Agent Loop Sederhana yang Dapat Anda Jalankan
Apa itu agen AI? Panduan sederhana tentang loop agen, alat, memori, dan pagar pembatas, dengan loop Python kecil yang kami jalankan, risiko nyata da…
Baca artikel →DevOpsPemantauan vs Observabilitas: Perbedaan Nyata, Dengan Log, Metrik, dan Jejak
Penjelasan pemantauan vs observabilitas: kegagalan yang diketahui dan tidak diketahui, log, metrik dan jejak, penelusuran insiden checkout, sinyal e…
Baca artikel →DevOpsVolume Docker vs Bind Mounts: Pertahankan Data Kontainer dengan Cara yang Benar
Volume Docker vs pengikatan pengikat dijelaskan: mengapa data kontainer menghilang, volume yang diberi nama, pengikatan pengikatan, tmpfs, contoh Tu…
Baca artikel →Otomatisasi pengujianTDD vs BDD: Perbedaan Utama, Satu Fitur Dibangun dengan Dua Cara dan Kapan Menggunakan Masing-masing
TDD vs BDD dijelaskan dengan satu fitur diskon yang dibuat dengan dua cara: refactor merah-hijau dengan kode yang kami jalankan, skenario Mengingat-…
Baca artikel →Pengujian perangkat lunakUser Acceptance Testing (UAT): Proses, Checklist dan Contoh Nyata
Pengujian penerimaan pengguna menjelaskan: siapa yang menjalankannya, perbedaannya dengan QA, proses tujuh langkah, templat kasus uji UAT, daftar pe…
Baca artikel →Basis data & SQLPenjelasan Nilai NULL SQL: IS NULL, COALESCE, NULLIF dan Jebakan yang Harus Dihindari
Nilai SQL NULL dijelaskan dengan kueri yang kami jalankan: logika tiga nilai, IS NULL, COALESCE, NULLIF, cara agregat, penggabungan, dan pengurutan …
Baca artikel →Basis data & SQLPernyataan SQL CASE WHEN: Sintaks, Contoh Nyata dan Kesalahan Umum
SQL CASE KETIKA dijelaskan dengan kueri yang kami jalankan: formulir sederhana dan dicari, urutan kondisi, pivot dengan SUM, trik COUNT, pengurutan …
Baca artikel →Pengembangan perangkat lunakApa itu JWT? Token Web JSON Dijelaskan Dengan Contoh Kerja
Apa itu JWT? JSON Web Tokens menjelaskan: tiga bagian, token yang dibuat dan dirusak dalam kode yang kami jalankan, sesi JWT vs, penyimpanan, token …
Baca artikel →Pengembangan perangkat lunakPenjelasan Loop Acara JavaScript: Call Stack, Microtasks, dan Timer Dengan Contoh
Perulangan peristiwa JavaScript dijelaskan dengan kode yang kami jalankan: tumpukan panggilan, antrian tugas dan tugas mikro, mengapa setTimeout 0 t…
Baca artikel →Pengembangan perangkat lunakGenerator Python dan Penjelasan Hasil: Menghemat Memori Dengan Contoh Nyata
Generator dan hasil Python dijelaskan dengan kode yang kami jalankan: bagaimana mereka menjeda dan melanjutkan, mengukur penghematan memori, saluran…
Baca artikel →Kecerdasan buatanApa itu Embedding? Kesamaan Vektor dan Kosinus Dijelaskan Secara Sederhana
Apa itu embeddings? Panduan bahasa sederhana tentang vektor, kesamaan kosinus, dan penelusuran semantik, dengan contoh kecil yang kami jalankan, pen…
Baca artikel →DevOpsPenerapan Biru-Hijau vs Canary: Perbedaan, Kompromi, dan Cara Memilih
Penjelasan penerapan blue-green vs canary: cara kerja masing-masing, biaya, risiko dan rollback, pengelompokan pengguna stabil yang kami uji, migras…
Baca artikel →Pengembangan perangkat lunakGit merge vs rebase: perbedaan, contoh, dan kapan memakai masing-masing
Git merge vs rebase dijelaskan dengan keluaran log nyata, tabel perbandingan, aturan emas rebase, dan alur kerja tim yang aman.
Baca artikel →Pengembangan perangkat lunakList Comprehension Python: Sintaks, Contoh, dan Kapan Harus Dihindari
List comprehension Python dijelaskan: sintaks, filter, if-else, perulangan bersarang, waktu yang diukur, dan kapan perulangan for biasa lebih baik.
Baca artikel →Basis data & SQLPenjelasan SQL JOIN dengan Contoh (Inner, Left, Right, Full)
Pahami SQL JOIN langkah demi langkah dengan tabel dan query contoh: INNER, LEFT, RIGHT, FULL, CROSS, dan SELF, plus kesalahan umum dan tips performa.
Baca artikel →