🎫
← Kembali ke Panduan

Cara Memverifikasi Signature JWT: HS256, RS256, dan ES256

· Tag: jwt-verification, jwt-signature, hs256, rs256, token-validation

Cara Memverifikasi Signature JWT

Sebuah JWT membawa klaimnya dalam bentuk plaintext. Satu-satunya hal yang mencegah pemalsuan adalah signature. Tanpa verifikasi, penyerang dapat membuat token sewenang-wenang dan menyamar sebagai pengguna mana pun. Panduan ini mencakup tiga algoritma penandatanganan JWT yang paling umum dan cara memverifikasi masing-masing.

Proses Verifikasi

Terlepas dari algoritmanya, verifikasi signature JWT mengikuti langkah-langkah yang sama:

  1. Pisahkan token pada . untuk mengekstrak header, payload, dan signature.
  2. Base64url-decode header untuk membaca field alg.
  3. Hitung ulang signature dari header dan payload menggunakan algoritma dan kunci.
  4. Bandingkan signature yang dihitung ulang dengan signature token.
  5. Jika cocok, token tersebut autentik.

HS256 (HMAC-SHA256)

HS256 adalah algoritma simetris — kunci rahasia yang sama membuat dan memverifikasi signature.

signature = HMACSHA256(
  base64urlEncode(header) + "." + base64urlEncode(payload),
  secret
)

Untuk memverifikasi, hitung ulang HMAC dengan kunci rahasia bersama dan bandingkan:

Token:   header.payload.sig
Secret:  "my-shared-secret"

1. Hitung: HMACSHA256("header.payload", "my-shared-secret")
2. Bandingkan: computedSignature === sig

Pertimbangan keamanan: Kunci rahasia harus bersifat rahasia, dirotasi secara berkala, dan memiliki setidaknya 256 bit entropi. HS256 tidak ideal untuk arsitektur microservice di mana banyak layanan memerlukan kunci rahasia bersama.

RS256 (RSA-SHA256)

RS256 bersifat asimetris. Issuer menandatangani dengan kunci privat; verifier memeriksa dengan kunci publik yang sesuai.

signature = RSASHA256(
  base64urlEncode(header) + "." + base64urlEncode(payload),
  privateKey
)

Untuk memverifikasi, gunakan kunci publik:

Token:   header.payload.sig
Public:  "-----BEGIN PUBLIC KEY-----..."

1. Muat kunci publik RSA
2. Verifikasi: RSA_SHA256_verify("header.payload", sig, publicKey)

Keuntungan: Kunci penandatanganan dan verifikasi terpisah. Layanan apa pun dapat memverifikasi tanpa menyimpan kunci rahasia. Kunci publik dapat disajikan dari endpoint JWKS untuk rotasi yang mudah.

ES256 (ECDSA-SHA256)

ES256 menggunakan ECDSA dengan kurva P-256. Seperti RS256, ini bersifat asimetris.

signature = ECDSA_SHA256(
  base64urlEncode(header) + "." + base64urlEncode(payload),
  privateKey
)

Verifikasi menggunakan kunci publik ECDSA P-256. ES256 menghasilkan signature yang jauh lebih kecil (64 bytes vs. 256 bytes untuk RSA-2048) dan menawarkan verifikasi yang lebih cepat.

Perbandingan Algoritma

| Properti | HS256 | RS256 | ES256 | |----------|-------|-------|-------| | Tipe kunci | Simetris (kunci rahasia bersama) | Asimetris (pasangan RSA) | Asimetris (pasangan EC) | | Ukuran signature | 32 bytes | 256 bytes | 64 bytes | | Distribusi kunci | Dibagikan secara rahasia | Kunci publik bersifat publik | Kunci publik bersifat publik | | Rotasi | Sedang | Mudah (JWKS) | Mudah (JWKS) | | Kasus penggunaan | Sistem internal tepercaya | API terdistribusi | Mobile, IoT |

Kesalahan Umum dalam Verifikasi

  • Serangan kebingungan algoritma. Jika kode Anda membaca alg dari token tanpa penegakan, penyerang dapat mengubah algoritma. Selalu validasi bahwa algoritma cocok dengan nilai yang diharapkan.
  • Menerima alg: "none". Beberapa library menerima token yang tidak ditandatangani. Tolak alg: "none" secara eksplisit.
  • Pemotongan signature. Perbandingan non-constant-time dapat membocorkan informasi melalui timing attack. Gunakan perbandingan bawaan library JWT Anda.

Verifikasi Token JWT Secara Online

Gunakan alat JWT decoder untuk mendekode dan memvalidasi token apa pun. Tempelkan token, lihat header dan payload, dan verifikasi signature dengan memberikan kunci rahasia atau kunci publik yang sesuai. Semua pemrosesan terjadi di browser Anda.

Cara Memverifikasi Signature JWT: HS256, RS256, dan ES256 - CoolTool