ikan Pengantar

JSON Web Token (JWT) banyak digunakan untuk autentikasi dan otorisasi pada aplikasi web, API, serta layanan berbasis microservices. JWT memungkinkan server membawa informasi mengenai identitas dan hak akses pengguna dalam sebuah token yang dapat diverifikasi.

Namun, implementasi JWT yang tidak tepat dapat menimbulkan celah keamanan. Salah satunya adalah JWT None Algorithm Attack, yaitu kondisi ketika aplikasi menerima token dengan nilai algoritma none sehingga token tidak memiliki digital signature.

Standar JWT memang mendefinisikan Unsecured JWT dengan alg bernilai none. Namun, penggunaan tersebut memiliki konsekuensi penting karena token tidak mendapatkan perlindungan integritas melalui signature (dikutip dari: https://www.rfc-editor.org/info/rfc7519/).


Apa Itu JWT None Algorithm Attack?

JWT biasanya memiliki tiga bagian:

Header.Payload.Signature

Header menentukan algoritma yang digunakan untuk proses signing. Contohnya, aplikasi dapat menggunakan HS256 atau RS256.

Masalah muncul ketika server menerima JWT dengan:

“alg”: “none”

Algoritma none berarti JWT tidak menggunakan digital signature atau MAC. RFC 7518 menjelaskan bahwa Unsecured JWS dengan alg: none tidak memberikan perlindungan integritas (dikutip dari: https://www.rfc-editor.org/rfc/rfc7518.html).

Jika aplikasi menerima token tersebut sebagai token yang valid, isi payload dapat dipercaya tanpa adanya mekanisme signature yang memverifikasi bahwa token benar-benar dibuat oleh pihak yang berwenang.

baca juga : VLAN Hopping: Mengenal Serangan Layer 2 yang Dapat Menembus Segmentasi Jaringan


Bagaimana Serangan Ini Terjadi?

Validasi JWT yang Tidak Ketat

Masalah biasanya muncul ketika aplikasi menentukan algoritma verifikasi berdasarkan informasi yang berasal dari JWT itu sendiri.

Alur yang berisiko dapat digambarkan sebagai:

JWT → Baca Header → Tentukan Algoritma → Verifikasi Token

Jika server menerima alg dari token tanpa membatasi algoritma yang diperbolehkan, attacker dapat mencoba memanfaatkan none.


Mengapa alg: none Berbahaya?

Tidak Ada Signature

Pada JWT normal, signature digunakan untuk memastikan token tidak diubah setelah dibuat.

Misalnya:

Header + Payload → Signature

Ketika menggunakan none, bagian signature tidak memberikan perlindungan kriptografis.

Akibatnya, apabila server menerima token tanpa melakukan validasi tambahan, perubahan pada claims dapat berpotensi diterima sebagai token yang sah.


Risiko Manipulasi Claims

JWT sering membawa informasi seperti:

  • sub untuk identitas pengguna.
  • role untuk hak akses.
  • iss untuk issuer.
  • aud untuk audience.
  • exp untuk waktu kedaluwarsa.

Jika token dapat dimodifikasi tanpa signature yang valid, claims yang digunakan untuk menentukan otorisasi dapat menjadi risiko serius.

Contohnya, aplikasi yang menggunakan claim role untuk menentukan hak akses dapat memberikan privilege yang tidak semestinya jika validasi token tidak dilakukan dengan benar.


Apa Dampaknya terhadap Aplikasi?

Account Takeover

Jika JWT digunakan sebagai bukti autentikasi dan server menerima token yang tidak memiliki signature, attacker berpotensi membuat token yang dianggap berasal dari pengguna tertentu.

Dampaknya dapat berupa pengambilalihan sesi atau akses ke akun.

Privilege Escalation

Jika aplikasi menggunakan JWT untuk menentukan role pengguna, manipulasi claims dapat menyebabkan peningkatan hak akses.

Misalnya:

User biasa → Token dimanipulasi → Role tidak semestinya → Akses resource sensitif

Unauthorized API Access

API yang mengandalkan JWT sebagai mekanisme autentikasi dapat menerima request yang seharusnya ditolak apabila validasi token tidak diterapkan dengan benar.


Cara Mencegah JWT None Algorithm Attack

Gunakan Allowlist Algoritma

Jangan menerima semua algoritma yang tersedia pada JWT.

Tentukan algoritma yang memang digunakan aplikasi, kemudian tolak token yang menggunakan algoritma di luar daftar tersebut.

Contohnya secara konsep:

Algoritma yang diizinkan:
RS256
Algoritma ditolak:
none
HS256
HS512

Daftar tersebut harus disesuaikan dengan desain aplikasi dan library JWT yang digunakan.


Jangan Percayakan Algoritma pada Header JWT

Header JWT merupakan bagian dari input yang diterima aplikasi.

Karena itu, server tidak seharusnya memperlakukan nilai alg sebagai instruksi yang bebas menentukan bagaimana token harus diverifikasi.

OWASP secara khusus menyarankan agar algoritma validasi ditentukan oleh konfigurasi aplikasi dan bukan semata-mata berdasarkan header JWT (dikutip dari: https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html).

baca juga : XML External Entity (XXE) Injection: Mengenal Serangan pada Parser XML dan Cara Mencegahnya


Tolak alg: none

Untuk JWT yang digunakan sebagai mekanisme autentikasi atau otorisasi, none sebaiknya tidak diizinkan.

RFC 7518 menyatakan bahwa implementasi tidak boleh menerima Unsecured JWS secara default dan penerimaannya harus bersifat eksplisit untuk konteks tertentu (dikutip dari: https://www.rfc-editor.org/rfc/rfc7518.html).

Dengan demikian, aplikasi umum sebaiknya menolak token yang menggunakan algoritma tersebut.


Gunakan Library JWT yang Terpercaya

Jangan membuat mekanisme parsing dan verifikasi JWT sendiri jika tidak diperlukan.

Gunakan library yang telah banyak digunakan dan pastikan library tersebut selalu diperbarui.

Selain itu, periksa dokumentasi library untuk memastikan:

  • Algoritma dapat dibatasi.
  • Signature selalu diverifikasi.
  • none ditolak secara default.
  • Claims penting dapat divalidasi.
  • Error validasi ditangani dengan benar.

Validasi JWT Tidak Hanya tentang Signature

Menolak none saja belum cukup.

Server juga perlu memvalidasi claims penting seperti:

iss

Memastikan token berasal dari issuer yang dipercaya.

aud

Ini memastikan token memang ditujukan untuk aplikasi atau service tersebut.

exp

token belum kedaluwarsa.

nbf

token belum digunakan sebelum waktu yang ditentukan.

sub

Memastikan identitas pengguna sesuai dengan kebutuhan aplikasi.

Dengan pendekatan tersebut, keamanan JWT tidak hanya bergantung pada satu pemeriksaan.


Checklist Keamanan JWT

Sebelum JWT digunakan dalam production, periksa beberapa hal berikut:

  1. Tolak algoritma none.
  2. Gunakan allowlist algoritma.
  3. Jangan mempercayai alg dari token secara langsung.
  4. Verifikasi signature sebelum mempercayai payload.
  5. Validasi iss dan aud.
  6. Validasi waktu exp dan nbf.
  7. Gunakan library JWT yang terpercaya.
  8. Perbarui dependency secara berkala.
  9. Gunakan HTTPS untuk komunikasi API.
  10. Jangan menyimpan data sensitif secara sembarangan di payload JWT.

baca juga : GraphQL Security: Mengenal Celah Serangan dan Cara Mengamankan API Modern


Kesimpulan

JSON Web Token (JWT) None Algorithm Attack memanfaatkan kesalahan implementasi ketika aplikasi menerima JWT dengan algoritma none tanpa memastikan adanya mekanisme integritas yang sesuai.

Walaupun none merupakan algoritma yang didefinisikan dalam standar JWT untuk Unsecured JWT, token tersebut tidak memiliki perlindungan signature. Karena itu, penggunaan none untuk autentikasi atau otorisasi aplikasi secara umum dapat menimbulkan risiko serius.

Cara utama untuk mencegah serangan ini adalah menggunakan allowlist algoritma, menolak none, memverifikasi signature, dan melakukan validasi claims seperti iss, aud, exp, serta nbf.

Pada akhirnya, keamanan JWT bukan hanya tentang bagaimana token dibuat, tetapi juga bagaimana token tersebut diverifikasi secara ketat di sisi server.