JWT Encoder
Buat dan tandatangani JSON Web Token dengan HS256, HS384, HS512
Header
Muatan
Kunci Rahasia
JWT Terenkripsi
Kunci rahasia Anda tidak pernah meninggalkan browser. Semua penandatanganan terjadi di sisi klien.
Apa itu Encoding JWT?
Encoding JWT adalah proses membuat JSON Web Token — string yang ringkas dan aman URL yang membawa serangkaian klaim yang ditandatangani dengan kunci kriptografi. Hasilnya adalah token tiga bagian (header.payload.signature) yang didefinisikan oleh RFC 7519 yang dapat diverifikasi server tanpa mempertahankan status sesi.
Header menyatakan algoritma penandatanganan (misalnya HS256) dan tipe token. Payload berisi klaim — pasangan nilai-kunci seperti subjek (sub), waktu kedaluwarsa (exp), dan data kustom yang dibutuhkan aplikasi Anda. Kedua bagian tersebut diserialisasi sebagai JSON, lalu dikodekan base64url. Signature dihitung dari header dan payload yang telah dikodekan menggunakan kunci rahasia, yang mengikat ketiga segmen tersebut bersama-sama.
Berbeda dengan cookie sesi, JWT bersifat mandiri: verifier tidak perlu mengquery basis data atau memanggil layanan eksternal. Hal ini membuat autentikasi berbasis JWT populer dalam REST API, layanan mikro, dan aplikasi halaman tunggal di mana otorisasi tanpa status mengurangi latensi dan menyederhanakan penskalaan horizontal.
Mengapa Menggunakan JWT Encoder?
Membuat JWT secara manual memerlukan pengkodean base64url, serialisasi JSON, dan komputasi HMAC. Alat ini menangani ketiga langkah tersebut secara instan sehingga Anda dapat fokus pada klaim yang tepat.
Kasus Penggunaan JWT Encoder
HS256 vs HS384 vs HS512: Perbandingan Algoritma HMAC
Ketiga algoritma menggunakan HMAC (Hash-based Message Authentication Code) dengan kunci rahasia bersama. Perbedaannya terletak pada fungsi hash yang digunakan, yang memengaruhi panjang signature dan batas keamanan. Untuk sebagian besar aplikasi, HS256 memberikan keamanan yang memadai. Pilih HS384 atau HS512 ketika persyaratan kepatuhan (misalnya FIPS-140) mewajibkan hash yang lebih kuat atau ketika token Anda membawa keputusan otorisasi bernilai tinggi.
| Algoritma | Hash | Signature | Kecepatan | Penggunaan umum |
|---|---|---|---|---|
| HS256 | SHA-256 | 32 B | Fastest | General purpose, default for most libraries |
| HS384 | SHA-384 | 48 B | Fast | Higher security margin, FIPS-140 compliant |
| HS512 | SHA-512 | 64 B | Fast | Maximum HMAC security, large payloads |
Referensi Klaim JWT Standar
RFC 7519 mendefinisikan tujuh klaim terdaftar. Tidak ada yang diwajibkan, tetapi menggunakannya dengan benar meningkatkan interoperabilitas dan keamanan. Klaim exp sangat penting — token tanpa kedaluwarsa berlaku selamanya jika kunci rahasia tidak dirotasi.
| Klaim | Nama | Deskripsi | Contoh |
|---|---|---|---|
| iss | Issuer | Who issued the token | "auth.example.com" |
| sub | Subject | Who the token represents | "user-123" |
| aud | Audience | Intended recipient service | "api.example.com" |
| exp | Expiration | Unix timestamp — token invalid after this time | 1717203600 |
| nbf | Not Before | Unix timestamp — token invalid before this time | 1717200000 |
| iat | Issued At | Unix timestamp when the token was created | 1717200000 |
| jti | JWT ID | Unique token identifier for revocation tracking | "a1b2c3d4" |
JWT Encoding dalam Kode
Contoh-contoh ini menunjukkan cara membuat dan menandatangani JWT secara terprogram. Setiap cuplikan menghasilkan token yang ditandatangani HS256 yang valid. Untuk sistem produksi, selalu tetapkan klaim exp dan gunakan kunci rahasia acak kriptografis minimal 256 bit.
async function signJWT(payload, secret, alg = 'HS256') {
const header = { alg, typ: 'JWT' }
const enc = new TextEncoder()
// Base64url encode header and payload
const b64url = (obj) =>
btoa(JSON.stringify(obj)).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')
const h = b64url(header)
const p = b64url(payload)
// Sign with HMAC-SHA256
const key = await crypto.subtle.importKey(
'raw', enc.encode(secret),
{ name: 'HMAC', hash: 'SHA-256' }, false, ['sign']
)
const sig = await crypto.subtle.sign('HMAC', key, enc.encode(`${h}.${p}`))
const s = btoa(String.fromCharCode(...new Uint8Array(sig)))
.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')
return `${h}.${p}.${s}`
}
// Usage
const token = await signJWT(
{ sub: 'user-123', name: 'Alice', iat: Math.floor(Date.now() / 1000) },
'your-256-bit-secret'
)
// → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOi..."import jwt
import time
payload = {
"sub": "user-123",
"name": "Alice",
"iat": int(time.time()),
"exp": int(time.time()) + 3600, # expires in 1 hour
}
# Sign with HS256 (default)
token = jwt.encode(payload, "your-256-bit-secret", algorithm="HS256")
# → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOi..."
# Verify and decode
decoded = jwt.decode(token, "your-256-bit-secret", algorithms=["HS256"])
# → {"sub": "user-123", "name": "Alice", "iat": 1717200000, "exp": 1717203600}const jwt = require('jsonwebtoken')
const payload = {
sub: 'user-123',
name: 'Alice',
role: 'admin',
}
// Sign — iat is added automatically
const token = jwt.sign(payload, 'your-256-bit-secret', {
algorithm: 'HS256',
expiresIn: '1h', // sets exp claim
issuer: 'auth.example.com', // sets iss claim
})
// Verify
const decoded = jwt.verify(token, 'your-256-bit-secret')
// → { sub: 'user-123', name: 'Alice', role: 'admin', iat: ..., exp: ... }package main
import (
"fmt"
"time"
"github.com/golang-jwt/jwt/v5"
)
func main() {
claims := jwt.MapClaims{
"sub": "user-123",
"name": "Alice",
"iat": time.Now().Unix(),
"exp": time.Now().Add(time.Hour).Unix(),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
signed, _ := token.SignedString([]byte("your-256-bit-secret"))
fmt.Println(signed)
// → eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOi...
}