Belajar Quarkus - Keamanan Dasar & Auth
Episode 12 of 24

Belajar Quarkus - Keamanan Dasar & Auth

Episode ini membahas keamanan dasar Quarkus: HTTP authentication, role-based access control dan identity stores, konfigurasi authentication mechanism, serta proteksi CSRF, CORS, dan secure headers.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

API publik tanpa proteksi adalah undangan untuk disalahgunakan. Keamanan bukan fitur tambahan — ia lapisan yang melekat sejak aplikasi dibangun. Sebelum membahas OAuth2 dan JWT di episode 13, kalian perlu memahami fondasi keamanan di Quarkus.

Episode 12 membahas keamanan dasar: HTTP authentication, role-based access control dan identity stores, konfigurasi authentication mechanism, serta proteksi CSRF, CORS, dan secure headers.

Pengenalan Quarkus Security dan HTTP Authentication

Arsitektur Keamanan

Quarkus Security punya tiga komponen: Identity Provider yang mengautentikasi pengguna, authorization yang menentukan hak akses, dan security annotations untuk mendeklarasikan aturan. Quarkus mendukung beberapa mekanisme: basic, form-based, dan bearer token.

HTTP Basic Authentication

Cara paling sederhana — kredensial dikirim dalam header Authorization: Basic ...:

Aktifkan basic auth
quarkus.http.auth.basic=true

Identity Store Berbasis Properti

Untuk development, Quarkus menyediakan identity store dari file properti:

Identity store berbasis properti
quarkus.security.users.file.enabled=true
quarkus.security.users.file.plain-text=true
quarkus.security.users.file.users=users.properties
quarkus.security.users.file.roles=roles.properties

Buat src/main/resources/users.properties berisi admin=admin123 dan user=user123, lalu roles.properties berisi admin=admin,user dan user=user. Cara ini cukup untuk development dan prototyping. Untuk produksi, gunakan identity store berbasis database atau OIDC (episode 13).

Role-Based Access Control dan Identity Stores

Anotasi Keamanan

Setelah autentikasi, kontrol akses dideklarasikan dengan anotasi:

JavaProteksi resource dengan role
import jakarta.annotation.security.RolesAllowed;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
 
@Path("/api/admin")
public class AdminResource {
 
    @GET
    @RolesAllowed("admin")
    public String rahasia() {
        return "Hanya admin yang bisa melihat ini";
    }
}

@RolesAllowed("admin") membatasi endpoint hanya untuk pengguna dengan role admin. Pengguna tanpa role menerima 403 Forbidden.

Identity Store dengan JDBC

Untuk aplikasi nyata, simpan pengguna di database. Tambahkan extension:

Tambahkan extension security-jdbc
./mvnw quarkus:add-extension -Dextensions=security-jdbc

Konfigurasi query untuk tabel pengguna:

Identity store JDBC
quarkus.datasource.db-kind=h2
quarkus.security.jdbc.enabled=true
quarkus.security.jdbc.principal-query.sql=\
  SELECT password FROM users WHERE username = ?
quarkus.security.jdbc.principal-query.clear-password-mapper.enabled=true
quarkus.security.jdbc.principal-query.clear-password-mapper.password-index=1
quarkus.security.jdbc.principal-query.roles-query.sql=\
  SELECT role FROM user_roles WHERE username = ?

Dengan security-jdbc, autentikasi memvalidasi password dari tabel users dan memuat role dari tabel user_roles. Selalu gunakan hash password di produksi — jangan pernah menyimpan plain text.

Konfigurasi Authentication Mechanism

HTTP Permissions

Selain anotasi per-endpoint, Quarkus mendukung aturan berbasis path di konfigurasi:

HTTP permission berdasarkan path
quarkus.http.auth.policy.only-admin.policy=role-based
quarkus.http.auth.policy.only-admin.roles=admin
quarkus.http.auth.permission.admin-route.paths=/api/admin/*
quarkus.http.auth.permission.admin-route.policy=only-admin

Konfigurasi ini melindungi semua path /api/admin/* hanya untuk role admin — tanpa menyentuh kode Java.

Authentication Status

Kalian bisa membaca identitas pengguna yang sudah terautentikasi: inject SecurityIdentity, lalu identity.getPrincipal().getName() mengembalikan username pengguna yang sedang login. SecurityIdentity juga mengekspos roles via identity.getRoles().

Proteksi CSRF, CORS, dan Secure Headers

CORS Configuration

CORS mengatur domain mana yang boleh memanggil API dari browser:

Konfigurasi CORS
quarkus.http.cors=true
quarkus.http.cors.origins=https://app.kalian.com
quarkus.http.cors.methods=GET,POST,PUT,DELETE
quarkus.http.cors.headers=Content-Type,Authorization

Jangan set origins=* kecuali benar-benar diperlukan — itu membuka API untuk semua domain.

Secure Headers dan CSRF

Quarkus menyediakan secure headers otomatis lewat extension vertx-http yang sudah terpasang: X-Content-Type-Options, X-Frame-Options, dan Strict-Transport-Security. Kustomisasi:

Atur secure headers
quarkus.http.header."X-Content-Type-Options".value=nosniff
quarkus.http.header."Strict-Transport-Security".value=\
  max-age=31536000; includeSubDomains

API berbasis token tidak rentan CSRF karena token tidak dikirim otomatis oleh browser. Untuk aplikasi berbasis cookie, gunakan pattern token anti-CSRF: server mengeluarkan token acak, client mengirimkannya di header saat mutasi data, dan server memvalidasi sebelum memproses.

Uji Coba Keamanan

Jalankan aplikasi dengan basic auth aktif:

Tes autentikasi
curl -u admin:admin123 http://localhost:8080/api/admin
curl -i http://localhost:8080/api/admin
curl -u user:user123 http://localhost:8080/api/admin

Perintah curl -u admin:admin123 http://localhost:8080/api/admin mengirim kredensial basic auth. Tanpa kredensial, server mengembalikan 401; dengan kredensial user tanpa role admin, mengembalikan 403.

Penutup

Episode 12 memasang lapisan keamanan pertama aplikasi kalian: memahami arsitektur keamanan Quarkus, role-based access control dengan anotasi dan HTTP permissions, konfigurasi authentication mechanism, serta proteksi CORS, CSRF, dan secure headers.

Inti yang harus dibawa pulang:

  • Quarkus Security terdiri dari autentikasi, otorisasi, dan anotasi keamanan.
  • @RolesAllowed("admin") membatasi akses berdasarkan role.
  • Identity store bisa dari properti, database JDBC, atau OIDC.
  • HTTP permission memproteksi path tanpa mengubah kode.
  • CORS membatasi domain yang boleh memanggil API.
  • Jangan simpan password plain text; selalu hash di produksi.
  • Secure headers memperkuat pertahanan di level HTTP.

Di episode 13 selanjutnya kita akan membahas OAuth2/OIDC dan JWT — integrasi Quarkus OIDC dengan external identity provider, implementasi JWT authentication dan authorization, service-to-service auth dengan token introspection, serta best practice penyimpanan dan refresh token.

Belajar Quarkus - Keamanan Dasar & Auth | Belajar Quarkus