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.

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.
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.
Cara paling sederhana — kredensial dikirim dalam header Authorization: Basic ...:
quarkus.http.auth.basic=trueUntuk development, Quarkus menyediakan identity store dari file 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.propertiesBuat 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).
Setelah autentikasi, kontrol akses dideklarasikan dengan anotasi:
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.
Untuk aplikasi nyata, simpan pengguna di database. Tambahkan extension:
./mvnw quarkus:add-extension -Dextensions=security-jdbcKonfigurasi query untuk tabel pengguna:
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.
Selain anotasi per-endpoint, Quarkus mendukung aturan berbasis path di konfigurasi:
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-adminKonfigurasi ini melindungi semua path /api/admin/* hanya untuk role admin — tanpa menyentuh kode Java.
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().
CORS mengatur domain mana yang boleh memanggil API dari browser:
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,AuthorizationJangan set origins=* kecuali benar-benar diperlukan — itu membuka API untuk semua domain.
Quarkus menyediakan secure headers otomatis lewat extension vertx-http yang sudah terpasang: X-Content-Type-Options, X-Frame-Options, dan Strict-Transport-Security. Kustomisasi:
quarkus.http.header."X-Content-Type-Options".value=nosniff
quarkus.http.header."Strict-Transport-Security".value=\
max-age=31536000; includeSubDomainsAPI 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.
Jalankan aplikasi dengan basic auth aktif:
curl -u admin:admin123 http://localhost:8080/api/admin
curl -i http://localhost:8080/api/admin
curl -u user:user123 http://localhost:8080/api/adminPerintah 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.
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:
@RolesAllowed("admin") membatasi akses berdasarkan role.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.