JWT: Struktur, Pembuatan, dan Verifikasi
Dekode struktur JWT secara manual, buat token bertanda tangan dengan rahasia, dan verifikasi klaim tanpa framework.
JWT: Struktur, Pembuatan, dan Verifikasi adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Apa Itu JWT
JSON Web Token (JWT) adalah format token ringkas yang aman untuk URL untuk mengirimkan klaim antar pihak. JWT ditandatangani (dan secara opsional dienkripsi). JWT bersifat mandiri — tidak diperlukan pencarian basis data untuk memverifikasi klaim.
Struktur JWT: Header.Payload.Signature
JWT memiliki tiga bagian yang dikodekan dengan Base64URL dan dipisahkan oleh titik: header.payload.signature. Header menentukan algoritme. Muatan berisi klaim. Tanda tangan memverifikasi integritas.
// Example JWT:
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 <- header
// .eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIn0 <- payload
// .SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c <- signatureHeader dan Muatan yang Didekodekan
Dekode setiap bagian dengan Base64URL untuk melihat JSON-nya. Muatan berisi "klaim" — klaim standar: sub (subjek), iss (penerbit), exp (kedaluwarsa), iat (waktu diterbitkan).
// Header:
{ "alg": "HS256", "typ": "JWT" }
// Payload:
{ "sub": "user-42", "name": "Alice", "role": "ADMIN",
"iat": 1716000000, "exp": 1716003600 }Membuat JWT Secara Manual (HS256)
Buat JSON header dan muatan, kodekan masing-masing dengan Base64URL, gabungkan dengan titik, lalu hitung HMAC-SHA256 dari header.payload dan tambahkan hasilnya sebagai tanda tangan.
String header = Base64.getUrlEncoder().withoutPadding()
.encodeToString("{\"alg\":\"HS256\",\"typ\":\"JWT\"}".getBytes());
String payload = Base64.getUrlEncoder().withoutPadding()
.encodeToString("{\"sub\":\"user-42\",\"exp\":9999999999}".getBytes());
String sigInput = header + "." + payload;
byte[] sig = computeHmac(secretKey, sigInput);
String jwt = sigInput + "." + Base64.getUrlEncoder().withoutPadding().encodeToString(sig);Memverifikasi JWT Secara Manual
Pisahkan berdasarkan titik, dekode header dan muatan, hitung ulang HMAC atas header.payload, bandingkan dengan tanda tangan, lalu periksa bahwa exp berada di masa depan.
String[] parts = jwt.split("\\.");
String sigInput = parts[0] + "." + parts[1];
byte[] expectedSig = computeHmac(secretKey, sigInput);
byte[] actualSig = Base64.getUrlDecoder().decode(parts[2]);
if (!MessageDigest.isEqual(expectedSig, actualSig)) throw new SecurityException("Invalid signature");
// Decode payload and check exp:
String payloadJson = new String(Base64.getUrlDecoder().decode(parts[1]));
// parse JSON and check exp > nowMenggunakan Pustaka java-jwt (Auth0)
Pustaka com.auth0:java-jwt menyederhanakan pembuatan dan verifikasi JWT dengan API fasih.
// Create:
Algorithm alg = Algorithm.HMAC256(secretKey);
String token = JWT.create()
.withSubject("user-42")
.withClaim("role", "ADMIN")
.withExpiresAt(Instant.now().plusSeconds(3600))
.sign(alg);
// Verify:
JWTVerifier verifier = JWT.require(alg).withIssuer("my-service").build();
DecodedJWT decoded = verifier.verify(token);
System.out.println(decoded.getSubject());HS256 vs RS256
HS256 menggunakan kunci simetris bersama — sederhana, tetapi penerbit dan pemverifikasi harus saling mempercayai kunci tersebut. RS256 menggunakan RSA: menandatangani dengan kunci pribadi dan memverifikasi dengan kunci publik — sesuai untuk arsitektur multi-layanan, karena setiap layanan dapat melakukan verifikasi tanpa mengetahui kunci penandatanganan.
Menyimpan JWT: Cookie HttpOnly vs localStorage
Simpan JWT dalam cookie HttpOnly (tidak dapat diakses dari JS — mencegah pencurian akibat XSS) dengan tanda Secure dan SameSite=Strict. Hindari localStorage — serangan XSS dapat membacanya.
// Set JWT as HttpOnly cookie in Spring:
ResponseCookie cookie = ResponseCookie.from("jwt", token)
.httpOnly(true).secure(true).sameSite("Strict")
.path("/").maxAge(3600).build();
response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());Token Penyegaran
JWT memiliki masa berlaku singkat (15 menit). Token penyegaran (opas, disimpan di sisi server) memiliki masa berlaku lebih lama. Klien menukarkan token penyegaran dengan JWT baru tanpa melakukan autentikasi ulang.
Tantangan Pencabutan JWT
JWT tidak memiliki status — tidak ada mekanisme pencabutan bawaan. Gunakan masa berlaku singkat dan daftar blokir berisi ID JWT yang dicabut (klaim jti) di Redis untuk mendukung keluar sebelum masa berlaku berakhir.
// On logout, add the jti to a Redis blocklist with TTL = token expiry:
redis.set("revoked:" + jti, "1", ex, 3600);
// On verify, check blocklist:
if (redis.exists("revoked:" + decoded.getId())) throw new SecurityException("Token revoked");Integrasi JWT dengan Spring Security
Dalam Spring Security, implementasikan JwtAuthenticationFilter extends OncePerRequestFilter untuk mengambil, memverifikasi, dan menetapkan SecurityContext dari JWT pada setiap permintaan.
String token = request.getHeader("Authorization").replace("Bearer ","");
DecodedJWT decoded = verifier.verify(token);
String userId = decoded.getSubject();
UsernamePasswordAuthenticationToken auth =
new UsernamePasswordAuthenticationToken(userId, null, authorities);
SecurityContextHolder.getContext().setAuthentication(auth);Pemeriksaan Cepat
Apa perbedaan struktur utama antara penandatanganan JWT HS256 dan RS256?
Ringkasan
JWT = header.payload.signature (Base64URL). Tanda tangani dengan HMAC (HS256) atau RSA (RS256). Verifikasi tanda tangan dan klaim exp. Simpan dalam cookie HttpOnly. Gunakan masa berlaku singkat dan token penyegaran. Cabut token melalui daftar blokir jti di Redis.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “JWT: Struktur, Pembuatan, dan Verifikasi” gratis?
Ya — teks lengkap “JWT: Struktur, Pembuatan, dan Verifikasi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “JWT: Struktur, Pembuatan, dan Verifikasi”?
Dekode struktur JWT secara manual, buat token bertanda tangan dengan rahasia, dan verifikasi klaim tanpa framework. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “JWT: Struktur, Pembuatan, dan Verifikasi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Hash Kriptografis dengan MessageDigest
- Enkripsi Simetris AES
- HMAC-SHA256 untuk Integritas Pesan
- JWT: Struktur, Pembuatan, dan Verifikasi