JWT Encoder

Buat dan tandatangani JSON Web Token dengan HS256, HS384, HS512

Header

Berjalan lokal · Aman untuk menempel rahasia

Muatan

Berjalan lokal · Aman untuk menempel rahasia

Kunci Rahasia

Berjalan lokal · Aman untuk menempel rahasia

JWT Terenkripsi

Output will appear here…

Kunci rahasia Anda tidak pernah meninggalkan browser. Semua penandatanganan terjadi di sisi klien.

Coba juga:JWT Decoder

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.

Pembuatan Token Instan
Edit header, payload, dan kunci rahasia — JWT yang ditandatangani diperbarui secara real time. Tidak perlu langkah build, instalasi pustaka, atau kode boilerplate.
🔒
Beberapa Algoritma HMAC
Beralih antara HS256, HS384, dan HS512 dengan satu klik. Header diperbarui secara otomatis dan signature dihitung ulang seketika.
🛡️
Pemrosesan yang Mengutamakan Privasi
Semua penandatanganan dilakukan di browser menggunakan Web Crypto API. Kunci rahasia dan data payload Anda tidak pernah meninggalkan perangkat — tidak ada server, tidak ada log, tidak ada risiko.
📋
Pembantu Klaim Satu Klik
Tambahkan timestamp iat, exp+1h, atau exp+24h dengan satu tombol. Tidak perlu menghitung Unix timestamp secara manual atau mencari waktu epoch saat ini.

Kasus Penggunaan JWT Encoder

Pengujian Autentikasi Frontend
Buat token dengan klaim dan waktu kedaluwarsa tertentu untuk menguji alur login, logika refresh token, dan penjaga rute yang dilindungi tanpa menjalankan server autentikasi backend.
Pengembangan API Backend
Buat token uji dengan klaim sub, aud, dan scope kustom untuk menguji middleware otorisasi, kontrol akses berbasis peran, dan pemeriksaan izin selama pengembangan lokal.
Pipeline DevOps & CI/CD
Buat token layanan berumur pendek untuk skrip deployment, pengujian integrasi, atau komunikasi antar-layanan di mana alur OAuth penuh akan menambah kompleksitas yang tidak diperlukan.
QA & Pengujian Manual
Buat token dengan klaim kasus tepi — token kedaluwarsa, field yang hilang, audiens yang salah — untuk memverifikasi bahwa API Anda mengembalikan respons HTTP 401 atau 403 yang benar.
Audit Keamanan
Buat token yang ditandatangani dengan algoritma dan panjang kunci rahasia berbeda untuk memvalidasi bahwa logika verifikasi Anda dengan benar menolak signature yang lemah atau tidak sesuai.
Pembelajaran & Prototipe
Pelajar dan developer yang baru mengenal JWT dapat bereksperimen dengan field header, struktur klaim, dan algoritma penandatanganan untuk memahami cara kerja setiap bagian token.

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.

AlgoritmaHashSignatureKecepatanPenggunaan umum
HS256SHA-25632 BFastestGeneral purpose, default for most libraries
HS384SHA-38448 BFastHigher security margin, FIPS-140 compliant
HS512SHA-51264 BFastMaximum 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.

KlaimNamaDeskripsiContoh
issIssuerWho issued the token"auth.example.com"
subSubjectWho the token represents"user-123"
audAudienceIntended recipient service"api.example.com"
expExpirationUnix timestamp — token invalid after this time1717203600
nbfNot BeforeUnix timestamp — token invalid before this time1717200000
iatIssued AtUnix timestamp when the token was created1717200000
jtiJWT IDUnique 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.

JavaScript (Web Crypto API)
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..."
Python (PyJWT)
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}
Node.js (jsonwebtoken)
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: ... }
Go (golang-jwt)
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...
}

Pertanyaan yang Sering Diajukan

Apa perbedaan antara JWT encoding dan JWT decoding?
JWT encoding membuat token yang ditandatangani dari header, payload, dan kunci rahasia. JWT decoding membalikkan prosesnya — membaca header dan payload yang dikodekan base64url kembali ke JSON. Decoding tidak memerlukan kunci rahasia; encoding selalu memerlukannya karena signature harus dihitung.
Seberapa panjang kunci rahasia JWT saya seharusnya?
Untuk HS256, gunakan kunci rahasia minimal 256 bit (32 byte). Untuk HS384, gunakan minimal 384 bit (48 byte). Untuk HS512, gunakan minimal 512 bit (64 byte). Kunci yang lebih pendek secara teknis diterima oleh sebagian besar pustaka tetapi mengurangi keamanan efektif dari signature HMAC. Buat kunci rahasia dengan generator acak kriptografis, bukan frasa sandi yang dipilih manusia.
Apakah aman menggunakan alat ini dengan kunci rahasia nyata?
Alat ini memproses semuanya di browser menggunakan Web Crypto API — tidak ada data yang dikirim ke server mana pun. Meski demikian, hindari menempel kunci rahasia produksi ke alat web mana pun sebagai praktik keamanan umum. Untuk manajemen kunci produksi, gunakan variabel lingkungan atau pengelola kunci seperti HashiCorp Vault atau AWS Secrets Manager.
Haruskah saya menggunakan HS256 atau RS256 untuk aplikasi saya?
Gunakan HS256 ketika layanan yang sama membuat dan memverifikasi token — lebih cepat dan lebih sederhana. Gunakan RS256 (asimetris) ketika layanan pihak ketiga perlu memverifikasi token Anda tanpa kemampuan untuk membuatnya. RS256 umum digunakan pada penyedia OAuth 2.0, OpenID Connect, dan arsitektur SaaS multi-tenant.
Mengapa JWT saya langsung kedaluwarsa setelah dibuat?
Klaim exp menggunakan Unix timestamp dalam detik, bukan milidetik. Jika Anda menetapkan exp ke Date.now() (yang mengembalikan milidetik), token akan tampak kedaluwarsa ribuan tahun di masa depan — atau jika Anda secara tidak sengaja menggunakan nilai milidetik di mana detik yang diharapkan, pustaka mungkin menginterpretasikannya sebagai sudah kedaluwarsa. Selalu gunakan Math.floor(Date.now() / 1000) di JavaScript atau int(time.time()) di Python.
Bisakah saya menyimpan data sensitif dalam payload JWT?
Bisa, tetapi sebaiknya tidak. Payload JWT dikodekan base64url, bukan dienkripsi — siapa pun yang memiliki token dapat membaca klaimnya. Jangan menyimpan kata sandi, nomor kartu kredit, atau data pribadi dalam payload. Jika Anda harus menyertakan informasi sensitif, gunakan JWE (JSON Web Encryption) sebagaimana didefinisikan dalam RFC 7516, yang mengenkripsi seluruh payload.
Apa yang terjadi jika saya mengubah payload setelah ditandatangani?
Signature menjadi tidak valid. Signature HMAC dihitung dari byte persis dari header dan payload yang dikodekan. Setiap perubahan — bahkan menambahkan spasi atau mengubah satu karakter — menghasilkan signature yang sepenuhnya berbeda. Verifier yang diimplementasikan dengan benar akan menolak token dengan kesalahan ketidakcocokan signature.