Di era aplikasi modern yang didominasi oleh Single Page Applications (SPA) dan aplikasi mobile, arsitektur API (Application Programming Interface) telah menjadi jembatan utama antara klien dan server. Namun, jembatan ini harus dijaga dengan ketat untuk memastikan hanya pengguna yang sah yang bisa melintas. Metode otentikasi berbasis sesi tradisional menjadi kurang efisien di lingkungan ini. Sebagai solusinya, JSON Web Token (JWT) muncul sebagai standar industri untuk mengamankan komunikasi API secara stateless atau tanpa status.
JWT dapat diibaratkan sebagai sebuah paspor digital. Ketika seorang pengguna berhasil login, server akan memberikannya sebuah paspor (token) yang berisi identitas dan hak aksesnya. Untuk setiap permintaan selanjutnya ke API, pengguna hanya perlu menunjukkan paspor tersebut. Server, sebagai penjaga perbatasan, cukup memeriksa keaslian paspor tanpa perlu mencari data sesi di dalam catatannya. Pendekatan ini sangat efisien dan mudah diskalakan. Artikel ini akan menjadi panduan praktis Anda, mengupas tuntas seluruh siklus hidup JWT dalam mengamankan API, mulai dari proses pencetakannya saat login hingga pembatalannya saat logout.
Baca juga: Arsitektur Microservices: Solusi Aplikasi Lambat dan Sulit Di-update
Langkah Nol: Memahami Anatomi JWT
Sebelum kita menyelam ke dalam implementasi, penting untuk memahami anatomi dasar dari sebuah JWT. Setiap token terdiri dari tiga bagian yang dipisahkan oleh tanda titik, yaitu Header, Payload, dan Signature.
- Header: Bagian ini biasanya berisi dua informasi utama, yaitu jenis token (
typ
) yang nilainya adalah “JWT”, dan algoritma penandatanganan (alg
) yang digunakan, misalnyaHS256
(HMAC-SHA256) atauRS256
(RSA-SHA256). - Payload: Ini adalah jantung dari token, berisi klaim atau potongan informasi tentang pengguna dan token itu sendiri. Ada klaim standar seperti
sub
(subject/ID pengguna),iss
(issuer/penerbit token), danexp
(expiration time/waktu kedaluwarsa). Anda juga bisa menambahkan klaim kustom, misalnya peran pengguna (roles
). Perlu diingat, Payload ini hanya di-encode menggunakan Base64Url, bukan dienkripsi. Artinya, siapa pun bisa membacanya, jadi jangan pernah menyimpan informasi sensitif di sini. - Signature: Ini adalah segel keamanan token. Bagian ini dibuat dengan menggabungkan Header yang sudah di-encode, Payload yang sudah di-encode, sebuah kunci rahasia (secret key), dan menandatanganinya menggunakan algoritma yang ditentukan di Header. Tanda tangan inilah yang memastikan bahwa isi token tidak dimanipulasi di tengah jalan dan token tersebut benar-benar dikeluarkan oleh pihak yang tepercaya.
Proses Login: Mencetak Paspor Digital Pengguna
Siklus hidup JWT dimulai saat pengguna mencoba untuk masuk ke aplikasi. Proses ini adalah satu-satunya momen di mana pengguna mengirimkan kredensial (seperti email dan kata sandi) secara langsung.
- Verifikasi Kredensial: Klien mengirimkan kredensial pengguna ke endpoint login di API. Server kemudian menerima informasi ini dan memverifikasinya dengan data yang tersimpan di database. Jika kredensial tidak valid, server akan mengembalikan respons error, biasanya dengan status
401 Unauthorized
. - Membuat Payload: Jika kredensial valid, server akan mulai mempersiapkan “paspor” untuk pengguna tersebut. Langkah pertama adalah membuat objek JSON yang akan menjadi Payload token. Payload ini harus berisi informasi esensial yang akan digunakan untuk otorisasi di permintaan selanjutnya. Klaim yang wajib ada adalah
sub
(diisi dengan ID unik pengguna) danexp
(diisi dengan timestamp kapan token akan kedaluwarsa). Menetapkan waktu kedaluwarsa yang singkat (misalnya 15-60 menit) adalah praktik keamanan yang sangat penting. - Menandatangani Token: Setelah Payload siap, server akan mengambil Header, Payload, dan sebuah kunci rahasia yang hanya diketahui oleh server. Ketiga komponen ini kemudian diolah menggunakan algoritma penandatanganan (misalnya
HS256
) untuk menghasilkan Signature. Kekuatan dan kerahasiaan secret key ini sangat krusial. Gunakan kunci yang panjang, acak, dan simpan dengan aman di environment variables, bukan di dalam kode sumber. - Mengirim Token ke Klien: Token JWT yang lengkap (terdiri dari
Header.Payload.Signature
) kini sudah jadi. Server akan mengirimkan token ini kembali ke klien sebagai bagian dari respons login yang sukses. Klien sekarang memegang “paspor” yang siap digunakan.
Interaksi API: Menunjukkan Paspor di Setiap Permintaan
Setelah klien menerima token, ia bertanggung jawab untuk menyimpannya dengan aman dan menyertakannya di setiap permintaan ke endpoint API yang terproteksi.
- Penyimpanan Token di Klien: Untuk aplikasi web, metode penyimpanan yang paling aman adalah menggunakan cookie dengan flag
HttpOnly
. Flag ini mencegah JavaScript mengakses cookie, sehingga melindungi token dari pencurian melalui serangan Cross-Site Scripting (XSS). Hindari menggunakanlocalStorage
karena sangat rentan terhadap XSS. - Mengirim Token ke Server: Standar industri untuk mengirim JWT adalah melalui HTTP header
Authorization
dengan skemaBearer
. Formatnya terlihat seperti ini:Authorization: Bearer <token_jwt_anda>
. - Verifikasi di Sisi Server: Setiap kali sebuah permintaan masuk ke endpoint yang terproteksi, server harus menjalankan serangkaian pemeriksaan sebelum memproses permintaan tersebut. Proses ini biasanya ditangani oleh sebuah middleware.
- Server mengekstrak token dari header
Authorization
. - Server memverifikasi Signature token menggunakan secret key yang sama yang digunakan untuk membuatnya. Jika tanda tangan tidak valid, itu berarti token telah dimanipulasi atau bukan berasal dari server. Permintaan langsung ditolak.
- Jika tanda tangan valid, server akan memeriksa klaim di dalam Payload, terutama klaim
exp
untuk memastikan token belum kedaluwarsa. - Jika semua verifikasi berhasil, server bisa mempercayai identitas pengguna yang ada di klaim
sub
dan melanjutkan untuk memproses permintaan tersebut sesuai dengan hak akses yang dimiliki.
- Server mengekstrak token dari header
Proses Logout: Membatalkan Paspor yang Masih Berlaku
Salah satu tantangan dari sifat stateless JWT adalah proses logout. Karena server tidak menyimpan catatan token yang aktif, bagaimana cara kita membatalkan token yang sebenarnya masih valid sebelum waktu kedaluwarsanya habis?
- Pendekatan Sisi Klien (Sederhana): Cara paling dasar untuk logout adalah dengan memerintahkan klien untuk menghapus token dari penyimpanannya (misalnya menghapus cookie). Dari sudut pandang pengguna, mereka sudah keluar. Namun, token itu sendiri secara teknis masih berlaku dan bisa digunakan oleh siapa pun yang berhasil mencurinya sampai token tersebut kedaluwarsa. Untuk banyak aplikasi, pendekatan ini sudah cukup baik.
- Pendekatan Sisi Server (Lebih Aman): Untuk aplikasi dengan tingkat keamanan yang lebih tinggi, mengandalkan penghapusan di sisi klien saja tidak cukup. Diperlukan sebuah mekanisme untuk secara aktif membatalkan token di sisi server. Caranya adalah dengan membuat daftar penolakan (denylist).
- Saat pengguna meminta untuk logout, server mengambil ID unik dari token tersebut (bisa menggunakan klaim
jti
– JWT ID). - Server menyimpan ID token ini ke dalam sebuah penyimpanan sementara yang cepat, seperti Redis atau Memcached. Entri ini diberi waktu hidup (Time-To-Live – TTL) yang sama dengan sisa waktu hidup token.
- Pada saat verifikasi token untuk setiap permintaan API, setelah memvalidasi tanda tangan, middleware juga akan memeriksa apakah ID token tersebut ada di dalam denylist. Jika ada, permintaan akan ditolak meskipun tokennya valid.
- Saat pengguna meminta untuk logout, server mengambil ID unik dari token tersebut (bisa menggunakan klaim
Baca juga: UTI Wujudkan Kampus Berdampak dengan PKM Hibah BIMA 2025 bagi UMKM Puteri Tapis Tenun Lampung
Mengamankan API menggunakan JWT adalah sebuah proses yang logis dan terstruktur yang mencakup seluruh siklus hidup token. Proses ini dimulai dari pencetakan token yang aman saat login, verifikasi ketat di setiap permintaan, hingga strategi invalidasi yang cerdas saat logout. Dengan menerapkan praktik terbaik seperti menggunakan kunci rahasia yang kuat, menetapkan waktu kedaluwarsa yang singkat, menyimpan token dengan aman di sisi klien, dan mengimplementasikan daftar penolakan untuk logout, Anda dapat membangun sistem otentikasi API yang tidak hanya efisien dan dapat diskalakan, tetapi juga sangat aman.
Penulis: Indra Irawan