JWT

JWT #

Dalam sistem modern—terutama API, microservices, dan aplikasi berbasis cloud—mekanisme autentikasi dan otorisasi menjadi fondasi utama keamanan. Salah satu pendekatan yang paling populer saat ini adalah JSON Web Token (JWT). JWT sering dianggap sebagai solusi “default” untuk autentikasi stateless, tetapi tidak jarang juga disalahgunakan atau diterapkan tanpa pemahaman fundamental yang benar.

Artikel ini membahas JWT secara menyeluruh: mulai dari sejarah, fundamental konsepnya, nilai penting, kelebihan dan kekurangannya dibanding metode lain, hingga best practice penggunaannya agar tidak menjadi false sense of security.


Sejarah Singkat JWT #

JWT distandarkan sebagai RFC 7519 oleh IETF pada tahun 2015. Tujuan awalnya adalah menyediakan cara ringkas, aman, dan URL-safe untuk merepresentasikan klaim (claims) yang dapat diverifikasi secara kriptografis.

JWT lahir dari kebutuhan:

  • Pertukaran identitas dan klaim antar sistem berbeda
  • Autentikasi API yang tidak bergantung pada session server-side
  • Mekanisme yang mudah diimplementasikan di web, mobile, dan service-to-service

Seiring berkembangnya REST API dan microservices, JWT menjadi sangat populer karena sifatnya yang stateless dan mudah diskalakan.


Fundamental JWT #

Apa Itu JWT? #

JWT adalah token berbasis JSON yang ditandatangani (dan opsional dienkripsi) untuk membawa informasi klaim antara dua pihak.

Secara struktur, JWT terdiri dari tiga bagian:

header.payload.signature

1. Header #

Berisi metadata token, biasanya:

  • alg: algoritma signing (misalnya HS256, RS256)
  • typ: tipe token (JWT)

Contoh:

{
  "alg": "RS256",
  "typ": "JWT"
}

2. Payload (Claims) #

Berisi data atau klaim. Klaim terbagi menjadi:

  • Registered claims: iss, sub, aud, exp, iat
  • Public claims: klaim yang distandarkan bersama
  • Private claims: klaim custom aplikasi

Contoh:

{
  "sub": "user_123",
  "role": "admin",
  "exp": 1710000000
}

⚠️ Penting: payload JWT tidak terenkripsi secara default, hanya di-base64url encode.

3. Signature #

Digunakan untuk menjamin:

  • Integritas data
  • Keaslian token

Signature dibuat dengan:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

Atau menggunakan private key (RSA/ECDSA).


Cara Kerja JWT (High-Level Flow) #

  1. User login ke sistem
  2. Server memverifikasi kredensial
  3. Server menerbitkan JWT
  4. Client menyimpan token (biasanya di memory / secure storage)
  5. Setiap request API menyertakan JWT (Authorization: Bearer)
  6. Server memverifikasi signature dan klaim token

Tidak ada session yang disimpan di server.


Nilai Penting JWT #

1. Stateless Authentication #

Server tidak perlu menyimpan session → lebih mudah diskalakan secara horizontal.

2. Cocok untuk Distributed System #

JWT dapat diverifikasi oleh banyak service tanpa shared session store.

3. Interoperabilitas Tinggi #

Berbasis standar terbuka (RFC), lintas bahasa dan platform.

4. Efisien untuk API & Mobile #

Tidak perlu round-trip tambahan ke session storage.


Kelebihan JWT #

  1. Stateless & scalable
  2. Mudah digunakan di REST API
  3. Self-contained (token membawa klaim sendiri)
  4. Mendukung asymmetric key (RS256, ES256)
  5. Cocok untuk SSO dan microservices

Kekurangan JWT #

1. Tidak Bisa Dicabut dengan Mudah #

JWT valid sampai exp tercapai, kecuali ada mekanisme tambahan (blacklist / revocation).

2. Payload Terbuka #

Sensitive data tidak boleh disimpan di payload.

3. Ukuran Token Relatif Besar #

Lebih besar dibanding session ID biasa.

4. Salah Konfigurasi = Risiko Besar #

Kesalahan algoritma, expiry, atau storage dapat menyebabkan security issue.

5. Bukan Solusi Universal #

JWT sering dipaksakan untuk use case yang lebih cocok menggunakan session.


Perbandingan JWT dengan Metode Lain #

JWT vs Session-Based Authentication #

AspekJWTSession
StateStatelessStateful
SkalabilitasTinggiPerlu shared store
RevocationSulitMudah
PayloadSelf-containedMinimal
KompleksitasSedang–TinggiRendah

JWT vs OAuth2 Access Token (Opaque) #

AspekJWTOpaque Token
VerifikasiLokalRemote introspection
PayloadTerbacaTidak terbaca
KontrolLebih longgarLebih ketat
Use caseInternal systemPublic auth server

JWT bukan pengganti OAuth2, melainkan sering menjadi format token di dalam OAuth2.


Kesalahan Umum dalam Penggunaan JWT #

  1. Menyimpan JWT di localStorage
  2. Expiry terlalu panjang
  3. Menyimpan data sensitif di payload
  4. Menggunakan HS256 untuk multi-service
  5. Tidak memverifikasi iss, aud, dan alg

Best Practice #

Gunakan Expiry Pendek #

  • Access token: 5–15 menit
  • Gunakan refresh token terpisah

Gunakan Asymmetric Signing (RS256) #

Terutama untuk microservices dan multi-app.

Validasi Klaim Secara Ketat #

  • iss (issuer)
  • aud (audience)
  • exp, nbf

Jangan Simpan Data Sensitif #

JWT ≠ encrypted token.

Simpan Token dengan Aman #

  • Web: HttpOnly + Secure Cookie
  • Mobile: Secure storage

Pisahkan Access Token dan Refresh Token #

Refresh token harus:

  • Lebih jarang digunakan
  • Bisa dicabut

Implementasikan Token Rotation #

Untuk meminimalkan dampak token leakage.

Jangan Gunakan JWT untuk Semua Kasus #

Jika aplikasi sederhana dan monolitik, session bisa lebih tepat.


Penutup #

JWT adalah alat yang kuat, tetapi bukan silver bullet. Kekuatan JWT justru datang dengan tanggung jawab: pemahaman kriptografi dasar, threat model, dan disiplin dalam implementasi.

Digunakan dengan benar, JWT memungkinkan sistem yang scalable, clean, dan modern. Digunakan sembarangan, JWT justru menjadi sumber masalah keamanan yang serius.

Pahami use case-nya, bukan hanya ikut tren.

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact