All Products
Search
Document Center

API Gateway:Otentikasi token berbasis JWT

Last Updated:Jun 17, 2026

Alibaba Cloud API Gateway menggunakan JSON Web Token (JWT) untuk mengotorisasi akses API berdasarkan sistem pengguna Anda sendiri, memungkinkan pengaturan keamanan kustom.

1. Otentikasi berbasis token

Ikhtisar

Banyak API publik harus mengidentifikasi pemanggil untuk menentukan apakah akan memberikan akses ke sumber daya yang diminta. Token merupakan mekanisme otentikasi. Dengan otentikasi berbasis token, aplikasi tidak perlu menyimpan informasi otentikasi atau sesi pengguna di server, sehingga memungkinkan otorisasi aplikasi web terdistribusi yang tanpa status dan menyederhanakan skalabilitas aplikasi.

Alur kerja

API Gateway menggunakan Plugin JWT untuk menangani otentikasi. Alur kerjanya sebagai berikut:

  1. Klien mengirim permintaan yang mencakup token ke API Gateway.

  2. API Gateway menggunakan kunci publik yang dikonfigurasi dalam Plugin JWT untuk memverifikasi token tersebut. Jika token valid, API Gateway meneruskan permintaan ke layanan backend.

  3. Layanan backend memproses permintaan dan mengembalikan respons.

  4. API Gateway mengembalikan respons dari layanan backend ke klien.

Sepanjang proses ini, API Gateway menggunakan otentikasi token untuk mengotorisasi akses API berdasarkan sistem pengguna Anda sendiri. Bagian-bagian berikut menjelaskan JSON Web Token (JWT), yang digunakan oleh API Gateway untuk otentikasi.

JWT

1.1 Ikhtisar

JSON Web Token (JWT) adalah standar terbuka berbasis JSON (RFC 7519) untuk mentransmisikan klaim secara aman antar pihak dalam lingkungan aplikasi web. JWT berfungsi sebagai token otentikasi mandiri yang dapat mencakup identitas pengguna, peran, dan izin. JWT juga dapat berisi klaim tambahan yang dibutuhkan oleh logika bisnis, menjadikannya ideal untuk otentikasi dalam aplikasi terdistribusi.

1.2 Struktur JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Seperti yang ditunjukkan pada contoh sebelumnya, JWT adalah string yang terdiri dari tiga bagian:

  • Header

  • Payload

  • Signature

Header berisi dua bagian:

  • Jenis token, yaitu JWT.

  • Algoritma penandatanganan yang digunakan.

Header lengkap berupa objek JSON, seperti pada contoh berikut:

{
  'typ': 'JWT',
  'alg': 'HS256'
}

Header kemudian di-encode dengan Base64Url untuk membentuk bagian pertama JWT.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
Payload

Payload berisi klaim.

iss: Issuer. Pihak yang berwenang yang menerbitkan token. Klaim ini berupa string.
sub: Subject. Pihak yang menjadi subjek token. Nilai ini unik dalam cakupan penerbit. Ini adalah string case-sensitive dengan panjang maksimum 255 karakter ASCII.
aud: Audience. Penerima yang dituju oleh token. Ini adalah array string case-sensitive.
exp: Expiration Time. Waktu setelah token dianggap tidak valid. Klaim ini berupa integer yang merepresentasikan jumlah detik sejak 1970-01-01T00:00:00Z.
iat: Issued At. Waktu penerbitan token. Klaim ini berupa integer yang merepresentasikan jumlah detik sejak 1970-01-01T00:00:00Z.
jti: JWT ID. Pengenal unik untuk token. Nilai ini unik untuk setiap token yang dibuat oleh penerbit yang sama dan sering kali merupakan nilai acak kriptografis untuk mencegah tabrakan. Nilai ini menambahkan komponen entropi acak pada token terstruktur yang tidak dapat diperoleh penyerang, sehingga membantu mencegah tebakan token dan serangan replay.

Anda juga dapat menambahkan klaim kustom yang dibutuhkan oleh sistem pengguna Anda. Misalnya, Anda dapat menambahkan klaim name untuk nama panggilan pengguna:

{
  "sub": "1234567890",
  "name": "John Doe"
}

Payload kemudian di-encode dengan Base64Url untuk membentuk bagian kedua JWT:

JTdCJTBBJTIwJTIwJTIyc3ViJTIyJTNBJTIwJTIyMTIzNDU2Nzg5MCUyMiUyQyUwQSUyMCUyMCUyMm5hbWUlMjIlM0ElMjAlMjJKb2huJTIwRG9lJTIyJTBBJTdE
Signature

Untuk membuat Signature, gabungkan Header dan Payload yang telah di-encode Base64Url dengan titik (.). Kemudian, tandatangani string yang dihasilkan menggunakan algoritma yang ditentukan dalam Header dan kunci privat ($secret). Ini membentuk bagian ketiga JWT.

// javascript
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var signature = HMACSHA256(encodedString, '$secret');

Gabungkan ketiga bagian tersebut dengan titik (.) untuk membuat JWT lengkap, seperti yang ditunjukkan pada contoh JWT awal.

1.3 Cakupan otorisasi dan periode validitas

API Gateway menganggap token tersebut berwenang untuk mengakses semua API yang terikat ke Plugin JWT dalam satu kelompok API. Untuk kontrol akses yang lebih granular, layanan backend Anda harus mengurai token dan melakukan otorisasi. API Gateway memvalidasi bidang exp dalam token. Jika token telah kedaluwarsa, API Gateway langsung menolak permintaan tersebut. Anda harus menetapkan waktu kedaluwarsa, dan nilainya harus kurang dari 7 hari.

1.4 Karakteristik utama JWT

  1. Secara default, JWT tidak dienkripsi. Jangan sertakan data sensitif dalam JWT.

  2. JWT dapat digunakan baik untuk otentikasi maupun pertukaran informasi, sehingga mengurangi jumlah kueri database di server. Kerugian utamanya adalah sifatnya yang tanpa status: Anda tidak dapat mencabut token atau mengubah izinnya sebelum masa berlakunya habis. Setelah diterbitkan, JWT tetap valid hingga kedaluwarsa kecuali server menerapkan logika pencabutan khusus.

  3. JWT berisi informasi otentikasi. Jika bocor, siapa pun yang mendapatkan token tersebut akan memperoleh semua izin yang terkait. Untuk mengurangi risiko ini, tetapkan periode validitas yang singkat untuk JWT. Untuk tindakan berkeamanan tinggi, lakukan otentikasi ulang terhadap pengguna sebelum memberikan akses.

  4. Untuk mengurangi risiko pencurian, jangan transmisikan JWT dalam teks biasa melalui HTTP. Gunakan HTTPS sebagai gantinya.

2. Lindungi API dengan plugin JWT

2.1 Hasilkan pasangan JSON Web Key (JWK)

2.1.1 Hasilkan pasangan kunci secara online

Anda dapat mengunjungi https://tools.top/jwt-encode.html untuk menghasilkan kunci privat dan kunci publik guna pembuatan dan verifikasi token. Kunci privat digunakan oleh layanan otorisasi untuk menerbitkan JWT, sedangkan kunci publik dikonfigurasi dalam Plugin JWT agar API Gateway dapat memverifikasi tanda tangan permintaan. API Gateway mendukung algoritma RSA SHA256 dan ukuran kunci 2.048 bit.

Setelah membuka situs tersebut, pilih tab JWK format. Halaman tersebut secara otomatis akan menghasilkan pasangan kunci. Klik Copy Public Key atau Copy Private Key untuk mendapatkan konten JWK yang sesuai.

2.1.2 Hasilkan pasangan kunci secara lokal

Contoh berikut menggunakan Java. Anda dapat menemukan tool serupa dalam bahasa pemrograman lain untuk menghasilkan pasangan kunci. Buat proyek Maven dan tambahkan dependensi berikut:

<dependency>
     <groupId>org.bitbucket.b_c</groupId>
    <artifactId>jose4j</artifactId>
    <version>0.7.0</version>
</dependency>

Gunakan kode berikut untuk menghasilkan pasangan kunci RSA:

RsaJsonWebKey rsaJsonWebKey = RsaJwkGenerator.generateJwk(2048);
rsaJsonWebKey.setKeyId("authServer");
final String publicKeyString = rsaJsonWebKey.toJson(JsonWebKey.OutputControlLevel.PUBLIC_ONLY);
final String privateKeyString = rsaJsonWebKey.toJson(JsonWebKey.OutputControlLevel.INCLUDE_PRIVATE);

2.2 Implementasikan layanan penerbitan token

Gunakan string JSON JWK kunci publik yang dihasilkan secara online di Bagian 2.1 atau string JSON privateKeyString yang dihasilkan secara lokal sebagai kunci privat untuk menerbitkan token. Token-token ini mengotorisasi pengguna tepercaya untuk mengakses API yang dilindungi. Untuk informasi lebih lanjut, lihat Kode contoh untuk layanan penerbitan dan otentikasi token. Cara Anda menerbitkan token bergantung pada skenario bisnis Anda. Anda dapat men-deploy fitur penerbitan token ke lingkungan produksi sebagai API biasa yang memungkinkan pengunjung memperoleh token dengan username dan password, atau menghasilkan token secara lokal dan memberikannya langsung kepada pengguna tertentu.

2.3 Konfigurasikan plugin JWT

  1. Masuk ke Konsol API Gateway.

  2. Di panel navigasi sebelah kiri, pilih API Management > Plug-in Management.

  3. Di halaman manajemen plug-in, klik Create Plug-in di pojok kanan atas.

  4. Di halaman Create Plug-in, atur Plug-in Name dan pilih Plug-in Type. Kode berikut adalah contoh konfigurasi untuk Plugin JWT. Untuk informasi lebih lanjut tentang konfigurasi, lihat Plugin otentikasi JWT.

---
parameter: X-Token         # Parameter tempat mengambil JWT. Ini sesuai dengan parameter API.
parameterLocation: header  # Lokasi pembacaan JWT. Parameter ini opsional jika API dalam mode mapping, tetapi wajib jika API dalam mode pass-through. Nilai yang valid: `query` dan `header`.
claimParameters:           # Pemetaan parameter klaim. API Gateway memetakan klaim JWT ke parameter backend.
- claimName: aud           # Nama klaim. Klaim publik dan privat didukung.
  parameterName: X-Aud     # Nama parameter yang dipetakan.
  location: header         # Lokasi parameter yang dipetakan. Nilai yang valid: `query`, `header`, `path`, dan `formData`.
- claimName: userId        # Nama klaim. Klaim publik dan privat didukung.
  parameterName: userId    # Nama parameter yang dipetakan.
  location: query          # Lokasi parameter yang dipetakan. Nilai yang valid: `query`, `header`, `path`, dan `formData`.
preventJtiReplay: false    # Menentukan apakah akan mengaktifkan pemeriksaan anti-replay untuk klaim `jti`. Nilai default: false.
# Kunci publik JSON Web Key (JWK) yang dihasilkan di bagian 2.1.
jwk:
  kty: RSA
  e: AQAB
  use: sig
  kid: uniq_key
  alg: RS256
  n: qSVxcknOm0uCq5vGsOmaorPDzHUubBmZZ4UXj-9do7w9X1uKFXAnqfto4TepSNuYU2bA_-tzSLAGBsR-BqvT6w9SjxakeiyQpVmexxnDw5WZwpWenUAcYrfSPEoNU-0hAQwFYgqZwJQMN8ptxkd0170PFauwACOx4Hfr-9FPGy8NCoIO4MfLXzJ3mJ7xqgIZp3NIOGXz-GIAbCf13ii7kSStpYqN3L_zzpvXUAos1FJ9IPXRV84tIZpFVh2lmRh0h8ImK-vI42dwlD_hOIzayL1Xno2R0T-d5AwTSdnep7g-Fwu8-sj4cCRWq3bd61Zs2QOJ8iustH0vSRMYdP5oYQ

2.4 Ikat plugin JWT ke API

Di halaman Plug-ins, temukan Plugin JWT yang telah Anda buat dan klik Bind API. Di kotak dialog, pilih API dari kelompok API dan lingkungan yang ditentukan, tambahkan ke daftar di sebelah kanan, lalu klik OK.

Jika API sudah terikat ke plug-in dengan jenis yang sama, plug-in baru akan menimpa yang lama. Lakukan dengan hati-hati.

Fitur debugging API di Konsol API Gateway tidak mendukung Plugin JWT. Untuk menguji API yang terikat ke plug-in tersebut, gunakan tool seperti Postman atau jalankan perintah curl.

3. Kode contoh untuk layanan penerbitan token

import java.security.PrivateKey; 
import org.jose4j.json.JsonUtil;
import org.jose4j.jwk.RsaJsonWebKey;
import org.jose4j.jwk.RsaJwkGenerator;
import org.jose4j.jws.AlgorithmIdentifiers;
import org.jose4j.jws.JsonWebSignature;
import org.jose4j.jwt.JwtClaims;
import org.jose4j.jwt.NumericDate;
import org.jose4j.lang.JoseException;
public class GenerateJwtDemo {
    public static void main(String[] args) throws JoseException  {
          // Gunakan keyId yang ditetapkan di API Gateway.
        String keyId = "uniq_key";
          // Gunakan pasangan kunci yang dihasilkan di Bagian 2.1.
        String privateKeyJson = "{\n"
            + "  \"kty\": \"RSA\",\n"
            + "  \"d\": "
            +
            "\"O9MJSOgcjjiVMNJ4jmBAh0mRHF_TlaVva70Imghtlgwxl8BLfcf1S8ueN1PD7xV6Cnq8YenSKsfiNOhC6yZ_fjW1syn5raWfj68eR7cjHWjLOvKjwVY33GBPNOvspNhVAFzeqfWneRTBbga53Agb6jjN0SUcZdJgnelzz5JNdOGaLzhacjH6YPJKpbuzCQYPkWtoZHDqWTzCSb4mJ3n0NRTsWy7Pm8LwG_Fd3pACl7JIY38IanPQDLoighFfo-Lriv5z3IdlhwbPnx0tk9sBwQBTRdZ8JkqqYkxUiB06phwr7mAnKEpQJ6HvhZBQ1cCnYZ_nIlrX9-I7qomrlE1UoQ\",\n"
            + "  \"e\": \"AQAB\",\n"
            + "  \"kid\": \"myJwtKey\",\n"
            + "  \"alg\": \"RS256\",\n"
            + "  \"n\": \"vCuB8MgwPZfziMSytEbBoOEwxsG7XI3MaVMoocziP4SjzU4IuWuE_DodbOHQwb_thUru57_Efe"
            +
            "--sfATHEa0Odv5ny3QbByqsvjyeHk6ZE4mSAV9BsHYa6GWAgEZtnDceeeDc0y76utXK2XHhC1Pysi2KG8KAzqDa099Yh7s31AyoueoMnrYTmWfEyDsQL_OAIiwgXakkS5U8QyXmWicCwXntDzkIMh8MjfPskesyli0XQD1AmCXVV3h2Opm1Amx0ggSOOiINUR5YRD6mKo49_cN-nrJWjtwSouqDdxHYP-4c7epuTcdS6kQHiQERBd1ejdpAxV4c0t0FHF7MOy9kw\"\n"
            + "}";
        JwtClaims claims = new JwtClaims();
        claims.setGeneratedJwtId();
        claims.setIssuedAtToNow();
        // Waktu kedaluwarsa harus ditetapkan dan kurang dari 7 hari.
        NumericDate date = NumericDate.now();
        date.addSeconds(120*60);
        claims.setExpirationTime(date);
        claims.setNotBeforeMinutesInThePast(1);
        claims.setSubject("YOUR_SUBJECT");
        claims.setAudience("YOUR_AUDIENCE");
        // Tambahkan parameter kustom. Semua nilai harus bertipe String.
        claims.setClaim("userId", "1213234");
        claims.setClaim("email", "userEm***@youapp.com");
        JsonWebSignature jws = new JsonWebSignature();
        jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);
          // Parameter ini wajib.
        jws.setKeyIdHeaderValue(keyId);
        jws.setPayload(claims.toJson());
        PrivateKey privateKey = new RsaJsonWebKey(JsonUtil.parseJson(privateKeyJson)).getPrivateKey();
        jws.setKey(privateKey);
        String jwtResult = jws.getCompactSerialization();
        System.out.println("Generate Json Web token , result is " + jwtResult);
    }
}

Perhatikan poin-poin berikut:

  1. keyId harus unik secara global dan harus cocok di tiga lokasi berikut:

  1. Untuk privateKeyJson, gunakan string JSON JWK kunci privat. Ini bisa berupa kunci yang dihasilkan secara online di Bagian 2.1 atau string JSON privateKeyString jika Anda menghasilkan pasangan kunci secara lokal.

    privateKeyString adalah string JSON.

  2. Periode validitas wajib ditetapkan dan harus kurang dari tujuh hari.

  3. Gunakan nilai bertipe String untuk semua parameter kustom.

4. Tanggapan kesalahan API Gateway

Status

Kode

Pesan

Deskripsi

400

I400JR

JWT required

Parameter JWT tidak ditemukan.

403

S403JI

Claim jti is required when preventJtiReplay:true

Klaim jti tidak ada, tetapi pemeriksaan anti-replay diaktifkan.

403

S403JU

Claim jti in JWT is used

jti yang diberikan telah digunakan, dan pemeriksaan anti-replay diaktifkan.

403

A403JT

Invalid JWT: ${Reason}

JWT yang diberikan dalam permintaan tidak valid.

400

I400JD

JWT Deserialize Failed: ${Token}

Gagal melakukan deserialisasi JWT yang diberikan dalam permintaan.

403

A403JK

No matching JWK, kid:${kid} not found

kid dalam JWT tidak cocok dengan JWK yang dikonfigurasi.

403

A403JE

JWT is expired at ${Date}

JWT yang diberikan dalam permintaan telah kedaluwarsa.

400

I400JP

Invalid JWT plugin config: ${JWT}

Plugin otentikasi JWT dikonfigurasi secara salah.

Jika Anda menerima kode status yang tidak terduga, periksa header respons X-Ca-Error-Code untuk ErrorCode dan header X-Ca-Error-Message untuk ErrorMessage. Jika kode kesalahan adalah A403JT atau I400JD, gunakan jwt.io untuk memverifikasi validitas dan format token Anda.