8 menit

Bagaimana Framework Modern Menangani Autentikasi dan Otorisasi

Pelajari bagaimana framework modern mengimplementasikan autentikasi dan otorisasi: sesi, token, OAuth/OIDC, middleware, peran, kebijakan, dan jebakan keamanan utama.

Bagaimana Framework Modern Menangani Autentikasi dan Otorisasi

Autentikasi vs. Otorisasi: yang Biasa Dipisahkan Framework

Autentikasi menjawab “siapa kamu?” Otorisasi menjawab “apa yang boleh kamu lakukan?” Framework modern memperlakukan keduanya sebagai concern yang saling terkait tapi terpisah, dan pemisahan ini adalah salah satu alasan utama keamanan tetap konsisten saat aplikasi berkembang.

Autentikasi: menetapkan identitas

Autentikasi tentang membuktikan bahwa pengguna (atau layanan) adalah siapa yang mereka klaim. Framework biasanya tidak mengunci satu metode tunggal; sebagai gantinya mereka menyediakan titik ekstensi untuk opsi umum seperti login dengan kata sandi, login sosial, SSO, API key, dan kredensial layanan.

Hasil autentikasi adalah sebuah identitas: ID user, status akun, dan kadang atribut dasar (mis. apakah email terverifikasi). Penting: autentikasi seharusnya tidak memutuskan apakah suatu aksi diizinkan—hanya siapa yang membuat permintaan.

Otorisasi: memutuskan akses

Otorisasi menggunakan identitas yang sudah ditetapkan plus konteks permintaan (rute, pemilik sumber daya, tenant, scope, environment, dll.) untuk memutuskan apakah sebuah aksi diizinkan. Di sinilah peran, permission, policy, dan aturan berbasis resource berada.

Framework memisahkan aturan otorisasi dari autentikasi supaya Anda bisa:

  • mengubah metode masuk tanpa menulis ulang aturan akses
  • menerapkan pemeriksaan izin konsisten di halaman web, API, dan background job
  • menjaga logika “siapa kamu” terpisah dari logika “apa yang bisa kamu lakukan”

Titik penegakan: di mana framework menerapkan aturan

Kebanyakan framework menegakkan aturan melalui titik terpusat dalam siklus hidup permintaan:

  • Middleware/filters/interceptors yang berjalan sebelum controller/handler
  • Guards yang memblok akses ke rute atau aksi
  • Pengecekan policy yang dipanggil di dalam logika bisnis untuk keputusan spesifik resource

Blok bangunan umum (tanpa tergantung framework)

Meskipun nama berbeda, blok bangunannya familiar: sebuah identity store (users dan kredensial), sebuah session atau token yang membawa identitas antar permintaan, dan middleware/guards yang menegakkan autentikasi dan otorisasi secara konsisten.

Contoh di artikel ini tetap konseptual agar Anda bisa memetakan ke framework pilihan.

Identity Stores dan User Model

Sebelum framework bisa “mendata seseorang masuk,” ia butuh dua hal: tempat untuk mengambil data identitas (the identity store) dan cara konsisten merepresentasikan identitas itu di kode (the user model). Banyak fitur autentikasi di framework modern adalah abstraksi di sekitar kedua bagian ini.

Sumber identitas tipikal

Framework biasanya mendukung beberapa backend, baik built-in maupun lewat plugin:

  • User di database aplikasi: tabel/collection "users" klasik yang dikelola aplikasi Anda.
  • External identity providers (IdP): Google, Microsoft, GitHub, atau provider khusus seperti Auth0/Okta, biasanya lewat OAuth 2.0 / OpenID Connect.
  • Direktori enterprise: LDAP/Active Directory, umum untuk tools internal dan aplikasi B2B.

Perbedaan kunci adalah siapa sumber kebenarannya. Dengan user database, aplikasi Anda menguasai kredensial dan data profil. Dengan IdP atau direktori, aplikasi sering menyimpan “shadow user” lokal yang terhubung ke identitas eksternal.

Field inti pada user model

Bahkan ketika framework membuat user model default, tim biasanya menstandarisasi beberapa field:

  • id: primary key yang immutable (sebaiknya bukan email).
  • email/username: identifier untuk login; sering unik dan dinormalisasi.
  • password_hash: hanya jika aplikasi mengelola kata sandi (jangan pernah menyimpan password mentah).
  • flag status: mis. is_verified, is_active, is_locked, deleted_at.

Flag ini penting karena autentikasi bukan hanya “password benar?”—tetapi juga “apakah akun ini diperbolehkan masuk sekarang?”

Siklus hidup akun: lebih dari sekedar pendaftaran

Identity store yang praktis mendukung event lifecycle umum: registrasi, verifikasi email/telepon, reset password, revokasi sesi setelah perubahan sensitif, dan deaktivasi atau soft-deletion. Framework sering menyediakan primitif (token, timestamp, hooks), tetapi Anda tetap mendefinisikan aturan: jendela expiry, rate limit, dan apa yang terjadi pada sesi ketika akun dinonaktifkan.

Di mana framework menyambungkan

Kebanyakan framework menawarkan titik ekstensi seperti user providers, adapters, atau repositories. Komponen ini menerjemahkan “diberi identifier login, ambil user” dan “diberi user ID, muat user saat ini” ke penyimpanan pilihan Anda—apakah itu query SQL, panggilan ke IdP, atau lookup direktori enterprise.

Autentikasi berbasis sesi adalah pendekatan “klasik” yang masih jadi default di banyak framework—terutama untuk aplikasi server-rendered. Idenya sederhana: server mengingat siapa Anda, dan browser menyimpan penunjuk kecil ke memori itu.

Bagaimana cara kerjanya

Setelah login berhasil, framework membuat record session di server (sering sebuah random session ID yang dipetakan ke user). Browser menerima cookie berisi session ID itu. Di setiap permintaan, browser otomatis mengirim cookie kembali, dan server menggunakannya untuk mencari user yang login.

Karena cookie hanya identifier (bukan data pengguna sendiri), informasi sensitif tetap di server.

Framework modern berupaya membuat cookie sesi lebih sulit dicuri atau disalahgunakan dengan default aman:

  • HttpOnly: mencegah JavaScript membaca cookie (mengurangi dampak XSS).
  • Secure: mengirim cookie hanya lewat HTTPS.
  • SameSite (Lax/Strict/None): mengontrol pengiriman cookie lintas situs (penting untuk pertahanan CSRF dan flow auth pihak ketiga).

Konfigurasi ini biasanya ada di pengaturan "session cookie" atau "security headers."

Di mana sesi disimpan

Framework biasanya membiarkan Anda memilih session store:

  • In-memory: cepat dan mudah, tapi sesi hilang saat restart dan sulit diskalakan lintas server.
  • Database-backed: tahan lama dan audit-able, tapi menambah overhead query.
  • Cache/Redis-style store: cepat dan dapat dibagi antar server; bagus untuk skala, tapi bergantung pada layanan eksternal.

Secara garis besar, trade-off-nya: kecepatan vs durability vs kompleksitas operasional.

Logout dan invalidasi

Logout bisa berarti dua hal berbeda:

  • Logout perangkat tunggal: hapus sesi saat ini dan bersihkan cookie.
  • Logout di semua perangkat: batalkan semua sesi untuk user (mis. setelah perubahan password).

Framework sering mengimplementasikan “logout di semua perangkat” dengan melacak "session version" pengguna, menyimpan banyak session ID per user, dan mencabutnya. Jika Anda butuh kontrol lebih ketat (mis. pencabutan instan), autentikasi berbasis sesi biasanya lebih sederhana daripada token karena server bisa langsung melupakan sebuah sesi.

Autentikasi Berbasis Token (JWT dan Opaque Token)

Autentikasi berbasis token menggantikan lookup session server-side dengan sebuah string yang diserahkan klien di setiap permintaan. Framework biasanya merekomendasikan token saat server Anda terutama adalah API (digunakan oleh banyak klien), saat Anda punya aplikasi mobile, SPA yang berbicara ke backend terpisah, atau saat layanan perlu memanggil layanan lain tanpa session browser.

Apa arti “token” dalam praktik

Token adalah kredensial akses yang diterbitkan setelah login (atau setelah flow OAuth). Klien mengirimkannya kembali di permintaan berikutnya sehingga server bisa mengautentikasi pemanggil lalu mengotorisasi aksi. Kebanyakan framework menganggap ini pola kelas-satu: endpoint "issue token", middleware autentikasi yang memvalidasi token, dan guards/policy yang berjalan setelah identitas ditetapkan.

Opaque token vs JWT

Opaque token adalah string acak tanpa makna bagi klien (mis. tX9...). Server memvalidasinya dengan lookup ke database atau cache. Ini membuat pencabutan mudah dan menjaga isi token tetap privat.

JWT (JSON Web Token) terstruktur dan ditandatangani. JWT biasanya berisi klaim seperti identifier pengguna (sub), issuer (iss), audience (aud), waktu terbit/expiry (iat, exp), dan kadang roles/scopes. Penting: JWT terenkode, bukan terenkripsi secara default—siapa pun yang memegang token bisa membaca klaimnya, walau tidak bisa memalsukan token tanpa kunci.

Panduan framework biasanya konvergen pada dua default yang lebih aman:

  • Kirim access token lewat header Authorization: Bearer <token> untuk API. Ini menghindari risiko CSRF yang datang dari cookie yang dikirim otomatis, tapi meningkatkan fokus pada pertahanan XSS karena JavaScript biasanya perlu membaca dan melampirkannya.
  • Gunakan cookie hanya jika Anda bisa membuatnya HttpOnly, Secure, dan SameSite, dan jika Anda siap menangani CSRF dengan benar (sering dipasangkan dengan token CSRF terpisah).

Refresh token, rotasi, dan endpoint

Access token dibuat pendek masa berlakunya. Untuk menghindari login terus-menerus, banyak framework mendukung refresh token: kredensial jangka panjang yang hanya dipakai untuk membuat access token baru.

Struktur umum:

  • POST /auth/login → mengembalikan access token (dan refresh token)
  • POST /auth/refresh → merotasi refresh token dan mengembalikan access token baru
  • POST /auth/logout → membatalkan refresh token di server

Rotasi (mengeluarkan refresh token baru setiap kali) membatasi dampak jika refresh token dicuri, dan banyak framework menyediakan hook untuk menyimpan identifier token, mendeteksi reuse, dan mencabut sesi dengan cepat.

OAuth 2.0 dan OpenID Connect di Ekosistem Framework

Prototipe Sesi atau Token
Prototipe sesi, JWT, dan refresh token tanpa menghubungkan semuanya secara manual.

OAuth 2.0 dan OpenID Connect (OIDC) sering disebut bersama, tetapi framework memperlakukan keduanya berbeda karena menyelesaikan masalah yang berbeda.

OAuth 2.0 vs OIDC: mana yang perlu Anda pakai

Gunakan OAuth 2.0 saat Anda butuh akses delegasi: aplikasi mendapatkan izin untuk memanggil API atas nama pengguna (mis. baca kalender atau posting ke repo) tanpa memegang password pengguna.

Gunakan OpenID Connect saat Anda butuh login/identitas: aplikasi ingin tahu siapa pengguna dan menerima ID token dengan klaim identitas. Dalam praktik, “Login dengan X” biasanya OIDC di atas OAuth 2.0.

Flow inti yang biasa didukung framework

Kebanyakan framework dan library auth fokus pada dua flow:

  • Authorization Code flow + PKCE: default untuk aplikasi browser dan mobile. PKCE membantu mencegah interception kode dan diharapkan oleh sebagian besar provider.
  • Client Credentials flow: untuk panggilan service-to-service tanpa end user (jobs, worker back-end, microservice internal).

Penanganan callback: di mana detail keamanan penting

Integrasi framework biasanya menyediakan route callback dan middleware helper, tetapi Anda tetap harus mengonfigurasi hal penting dengan benar:

  • Validasi redirect URI secara tepat (scheme/host/path). Hindari wildcard redirect URI.
  • Gunakan dan verifikasi parameter state untuk mencegah serangan login semacam CSRF.
  • Untuk OIDC, buat dan validasi nonce untuk mengurangi risiko replay token.
  • Simpan nilai sementara (state/nonce/verifier) di session aman atau cookie terenkripsi, bukan di local storage.

Scope, claim, dan pemetaan ke user lokal

Framework biasanya menormalkan data provider ke dalam user model lokal. Keputusan desain utama adalah apa yang benar-benar menggerakkan otorisasi:

  • Scope adalah izin OAuth untuk API (apa yang bisa dilakukan access token).
  • Claim adalah atribut identitas di ID token OIDC (siapa pengguna).

Polanya: petakan identifier stabil (seperti sub) ke user lokal, lalu terjemahkan role/group/claim provider ke role atau policy lokal yang dikendalikan aplikasi Anda.

Password, Hashing, MFA, dan Pemulihan Akun

Password masih menjadi metode sign-in default di banyak aplikasi, jadi framework cenderung menyediakan pola penyimpanan yang lebih aman dan guardrail umum. Aturan inti tetap: jangan pernah menyimpan password (atau hash sederhana) secara langsung di database.

Default hashing password (dan mengapa hashing biasa tidak aman)

Framework modern dan library auth mereka biasanya default ke password hasher khusus seperti bcrypt, Argon2, atau scrypt. Algoritma ini sengaja lambat dan memasukkan salt, yang membantu mencegah serangan tabel prekomputasi dan membuat cracking skala besar mahal.

Hash kriptografis biasa (mis. SHA-256) tidak aman untuk password karena dirancang cepat. Jika database bocor, hash yang cepat memungkinkan penyerang menebak milyaran password dengan cepat. Password hasher menambahkan work factors (parameter cost) sehingga Anda dapat men-tune keamanan saat hardware meningkat.

Kebijakan password yang sering terlihat

Framework biasanya menyediakan hook (atau middleware/plugin) untuk menegakkan aturan masuk akal tanpa hard-code di setiap endpoint:

  • Kebijakan berbasis panjang (password/passphrase panjang lebih baik daripada aturan kompleks tapi pendek).
  • Pemeriksaan breach terhadap daftar password yang pernah bocor (konsep: “jangan izinkan password yang sudah terekspos”).
  • Rate limiting dan lockout sementara setelah kegagalan berulang untuk memperlambat brute-force.

Opsi MFA dan trade-off

Banyak ekosistem mendukung menambahkan MFA setelah verifikasi password:

  • TOTP (authenticator app): luas dukungan dan bisa offline; masih bisa dipancing jika pengguna memasukkan kode ke situs phishing.
  • WebAuthn / passkeys: proteksi kuat terhadap phishing dan replay; seringkali UX terbaik setelah setup.
  • SMS code: mudah diterapkan, tapi lebih lemah karena risiko SIM-swap dan intercept—lebih baik daripada tidak sama sekali, tapi kurang ideal untuk akun berisiko tinggi.

Pemulihan akun yang aman

Reset password adalah jalur serangan umum, jadi framework biasanya menganjurkan pola seperti:

  • Link reset didukung token sekali pakai yang disimpan server-side (sering di-hash seperti password).
  • Expiry singkat (menit hingga jam) dan penegakan sekali pakai.
  • Invalidasi sesi atau rotasi token setelah reset sukses sehingga sesi yang dicuri tidak tetap aktif.

Aturan praktis: permudah pemulihan bagi pengguna sah, tapi buat biaya tinggi bagi penyerang untuk mengotomatiskan serangan.

Middleware, Guards, dan Siklus Hidup Permintaan

Kebanyakan framework modern memperlakukan keamanan sebagai bagian dari pipeline permintaan: serangkaian langkah yang berjalan sebelum (dan kadang setelah) controller/handler. Nama berbeda—middleware, filters, guards, interceptors—tetapi idenya konsisten: setiap langkah bisa membaca permintaan, menambah konteks, atau menghentikan pemrosesan.

Model mental pipeline praktis

Alur tipikal:

  1. Routing memilih endpoint (mis. /account/settings).
  2. Komponen pra-pemrosesan berjalan (middleware/filters/interceptors).
  3. Autentikasi berupaya mengidentifikasi pemanggil.
  4. Otorisasi memutuskan apakah pemanggil yang diidentifikasi boleh mengakses endpoint.
  5. Handler/controller mengeksekusi logika bisnis.
  6. Post-processing boleh mentransformasi respons atau mencatat detail.

Framework mendorong Anda menjaga pengecekan keamanan di luar logika bisnis, supaya controller fokus pada “apa yang dilakukan” bukan “siapa yang boleh melakukannya.”

Di mana autentikasi terjadi (identity first)

Autentikasi adalah langkah di mana framework menetapkan konteks user dari cookie, session ID, API key, atau bearer token. Jika berhasil, ia membuat sebuah identity ber-lifetime request—sering diekspos sebagai user, principal, atau context.auth.

Lampiran ini penting karena langkah berikutnya (dan kode aplikasi Anda) seharusnya tidak mengurai header lagi atau memvalidasi token ulang. Mereka harus membaca objek user yang sudah terisi, yang biasanya berisi:

  • user ID yang stabil
  • roles/claims (kadang)
  • metadata seperti metode autentikasi atau usia sesi

Di mana otorisasi terjadi (pemeriksaan izin)

Otorisasi umum diimplementasikan sebagai:

  • route-level guards (mis. “harus signed in”)
  • policy checks (mis. “boleh edit dokumen ini”) dievaluasi setelah resource dimuat

Tipe kedua menjelaskan kenapa hook otorisasi sering berada dekat controller dan service: mereka mungkin butuh param rute atau objek yang dimuat dari DB untuk memutuskan dengan benar.

401 vs 403: menangani kegagalan dengan bersih

Framework membedakan dua mode kegagalan umum:

  • 401 Unauthorized (tidak terautentikasi): tidak ada identitas valid. Sering memicu redirect ke sign-in untuk aplikasi browser, atau error JSON untuk API.
  • 403 Forbidden (tidak berizin): identitas diketahui, tetapi tidak memiliki izin.

Sistem yang baik menghindari membocorkan detail di respons 403; mereka menolak akses tanpa menjelaskan aturan mana yang gagal.

Model Otorisasi: Peran, Izin, dan Kebijakan

Bangun Otentikasi Lebih Cepat di Chat
Jelaskan alur otentikasi Anda di chat dan buat fondasi React dan Go dengan cepat.

Otorisasi menjawab pertanyaan lebih sempit daripada login: “Apakah pengguna yang sudah masuk diizinkan melakukan hal ini sekarang?” Framework modern biasanya mendukung beberapa model, dan banyak tim mengombinasikannya.

Role-based access control (RBAC)

RBAC memberi pengguna satu atau beberapa peran (mis. admin, support, member) dan membatasi fitur berdasarkan peran tersebut.

Mudah dimengerti dan cepat diimplementasikan, terutama ketika framework menyediakan helper seperti requireRole('admin'). Hirarki peran (“admin implies manager implies member”) bisa mengurangi duplikasi, tapi juga dapat menyembunyikan hak istimewa: perubahan kecil pada peran induk dapat secara diam-diam memberikan akses di seluruh aplikasi.

RBAC cocok untuk pembagian yang luas dan stabil.

Permission-based access (granular)

Permission-based memeriksa aksi terhadap sumber daya, sering diekspresikan sebagai:

  • Aksi: read, create, update, delete, invite
  • Resource: invoice, project, user, kadang dengan ID atau kepemilikan

Model ini lebih presisi daripada RBAC. Misalnya, “bisa update project” berbeda dari “bisa update hanya project yang mereka miliki,” yang membutuhkan pemeriksaan permission dan kondisi data.

Framework sering mengimplementasikannya lewat fungsi "can?" pusat (atau service) yang dipanggil dari controller, resolver, worker, atau template.

Policy-based authorization (aturan dengan kondisi)

Policy mengemas logika otorisasi ke dalam evaluator yang dapat digunakan ulang: “Seorang user boleh menghapus komentar jika mereka penulisnya atau mereka moderator.” Policy dapat menerima konteks (user, resource, request), membuatnya ideal untuk:

  • pengecekan kepemilikan
  • aturan tier langganan
  • constraint berbasis waktu atau organisasi

Ketika framework mengintegrasikan policy ke routing dan middleware, Anda bisa menegakkan aturan secara konsisten di seluruh endpoint.

Atribut/annotation vs pemeriksaan berbasis kode

Annotation (mis. @RequireRole('admin')) menjaga intent dekat ke handler, tapi bisa terfragmentasi saat aturan kompleks. Pemeriksaan berbasis kode (panggilan eksplisit ke authorizer) lebih verbose, tapi biasanya lebih mudah diuji dan direfactor. Kompromi umum: annotation untuk gerbang kasar dan policy untuk logika terperinci.

Perlindungan Bawaan Umum: CSRF, CORS, dan Security Headers

Framework modern tidak hanya membantu Anda masuk—mereka juga menyediakan pertahanan untuk serangan "web glue" umum yang muncul di sekitar autentikasi.

Jika aplikasi Anda memakai cookie sesi, browser otomatis melampirkannya ke permintaan—kadang bahkan ketika permintaan dipicu dari situs lain. Perlindungan CSRF framework biasanya menambahkan token CSRF per-session (atau per-request) yang harus dikirim bersama permintaan yang mengubah state.

Polanya:

  • Synchronizer token: server merender token ke form dan memvalidasinya pada POST/PUT/PATCH/DELETE.
  • Double-submit cookie: token CSRF disimpan di cookie dan juga dikirim di header/body; server memeriksa kecocokan.

Padukan token CSRF dengan cookie SameSite (sering Lax secara default) untuk mengurangi risiko, dan pastikan cookie session HttpOnly dan Secure bila sesuai.

CORS: API perlu aturan eksplisit

CORS bukan mekanisme auth; ia adalah sistem izin browser. Framework biasanya menyediakan middleware/konfigurasi untuk mengizinkan origin tepercaya memanggil API Anda.

Salah konfigurasi yang harus dihindari:

  • Access-Control-Allow-Origin: * bersamaan dengan Access-Control-Allow-Credentials: true (browser akan menolaknya, dan itu menandakan kebingungan).
  • Merefleksikan header Origin mana pun tanpa allowlist yang ketat.
  • Lupa mengizinkan header yang diperlukan (mis. Authorization) atau method, menyebabkan klien “bekerja di curl tapi gagal di browser.”

Clickjacking dan security headers

Kebanyakan framework bisa mengatur default aman atau memudahkan penambahan header seperti:

  • X-Frame-Options atau Content-Security-Policy: frame-ancestors untuk mencegah clickjacking.
  • Content-Security-Policy (kontrol script/resource lebih luas).
  • Referrer-Policy dan X-Content-Type-Options: nosniff untuk perilaku browser yang lebih aman.

Validasi input vs otorisasi

Validasi memastikan data terformat dengan benar; otorisasi memastikan user diizinkan bertindak. Permintaan yang valid masih bisa dilarang—framework bekerja terbaik bila Anda menerapkan keduanya: validasi input lebih awal, lalu penegakan izin pada resource spesifik yang diakses.

Pola Berdasarkan Jenis Aplikasi: SSR, SPA, Mobile, dan Microservices

Ekspor Kode Sumber Anda
Pertahankan kontrol penuh dengan mengekspor kode setelah pengaturan otentikasi Anda terlihat benar.

Pola auth yang "benar" sangat bergantung pada di mana kode Anda berjalan dan bagaimana permintaan sampai ke backend. Framework mungkin mendukung banyak opsi, tetapi default yang terasa natural di satu tipe aplikasi bisa canggung (atau berisiko) di tipe lain.

Server-rendered apps (SSR)

Framework SSR biasanya cocok dengan sesi berbasis cookie. Browser otomatis mengirim cookie, server mencari sesi, dan halaman dapat dirender dengan konteks user tanpa kode klien ekstra.

Aturan praktis: jaga cookie sesi HttpOnly, Secure, dan dengan pengaturan SameSite yang masuk akal, dan andalkan pemeriksaan otorisasi server-side untuk setiap permintaan yang merender data privat.

Single-page apps (SPA)

SPA sering memanggil API dari JavaScript, yang membuat pilihan token lebih terlihat. Banyak tim memilih flow OAuth/OIDC yang menghasilkan access token berumur pendek.

Hindari menyimpan token jangka panjang di localStorage bila memungkinkan; itu meningkatkan blast radius XSS. Alternatif umum adalah pola backend-for-frontend (BFF): SPA berbicara ke server Anda sendiri dengan cookie sesi, dan server menukar/menyimpan token untuk API upstream.

Mobile client

Aplikasi mobile tidak bisa mengandalkan aturan cookie browser dengan cara yang sama. Mereka biasanya menggunakan OAuth/OIDC dengan PKCE, dan menyimpan refresh token di storage aman platform (Keychain/Keystore).

Rencanakan pemulihan "device hilang": cabut refresh token, rotasi kredensial, dan buat re-authentication mulus—terutama saat MFA diaktifkan.

Microservices dan API gateway

Dengan banyak layanan, Anda memilih antara identitas terpusat dan penegakan di tingkat layanan:

  • Gateway-centric: gateway memvalidasi token dan meneruskan konteks identitas.
  • Defense in depth: setiap layanan juga memvalidasi token dan menegakkan otorisasi untuk resource-nya sendiri.

Untuk autentikasi service-to-service, framework sering mengintegrasikan dengan mTLS (identitas channel kuat) atau OAuth client credentials (service account). Kuncinya: autentikasi pemanggil dan otorisasi apa yang boleh dilakukannya.

Impersonation dan akses admin

Fitur admin “impersonate user” kuat tapi berbahaya. Lebih baik pakai sesi impersonasi eksplisit, minta re-auth/MFA untuk admin, dan selalu tulis audit log (siapa meng-impersonate siapa, kapan, dan aksi apa yang dilakukan).

Testing, Observability, dan Kesalahan Umum yang Harus Dihindari

Fitur keamanan hanya membantu jika terus bekerja saat kode berubah. Framework modern mempermudah pengujian autentikasi dan otorisasi, tapi Anda tetap perlu tes yang mencerminkan perilaku pengguna nyata—dan perilaku penyerang nyata.

Menguji flow auth tanpa setup mudah pecah

Mulailah dengan memisahkan apa yang diuji:

  • Unit test untuk aturan otorisasi (policy, guard, pengecekan permission). Harus cepat dan menutupi kasus tepi seperti “user memiliki resource” vs “admin override”.
  • Integration test untuk rute yang dilindungi (permintaan yang seharusnya sukses atau gagal). Ini menangkap middleware salah wiring, decorator yang hilang, dan redirect yang rusak.

Kebanyakan framework menyediakan helper test sehingga Anda tidak perlu membuat sesi atau token setiap kali. Pola umum:

  • Test client yang bisa menyimpan cookie antar permintaan (berguna untuk auth berbasis sesi).
  • Helper untuk sign in mock user (atau melampirkan JWT/opaque token) tanpa melalui UI.
  • Fixtures/factories untuk user, role, dan resource agar tes tetap terbaca.

Aturan praktis: untuk setiap tes “jalur bahagia”, tambahkan satu tes “harus ditolak” yang membuktikan pemeriksaan otorisasi benar-benar berjalan.

Jika Anda iterasi cepat pada flow ini, alat yang mendukung prototyping cepat plus rollback aman membantu. Misalnya, Koder.ai (platform vibe-coding) dapat menghasilkan front end React dan backend Go + PostgreSQL dari spesifikasi berbasis chat, lalu memungkinkan snapshot dan rollback saat Anda menyempurnakan middleware/guard dan pemeriksaan policy—berguna ketika bereksperimen antara sesi vs token dan ingin melacak perubahan.

Observability: bukti apa yang terjadi, bukan apa yang Anda harapkan

Saat sesuatu salah, Anda ingin jawaban cepat dan pasti.

Log dan/atau audit event penting:

  • Event autentikasi: keberhasilan/gagal sign-in, tantangan MFA, reset password, refresh token.
  • Penolakan otorisasi: policy mana yang gagal, pada resource apa, untuk user siapa (hindari log secret).
  • Correlation ID: request ID yang dipropagasikan lewat log dan trace sehingga Anda bisa mengikuti upaya login lintas layanan.

Tambahkan metrik ringan juga: laju respons 401/403, lonjakan kegagalan login, dan pola refresh token yang tidak biasa.

Kesalahan umum yang framework tidak otomatis selamatkan

  • Memercayai klaim klien: jangan pernah bergantung pada flag UI atau "peran" di sisi klien. Selalu tegakkan di server.
  • Pemeriksaan yang hilang di endpoint sekunder: export, background job, tools admin, dan API "internal" tetap butuh otorisasi.
  • Scope/peran yang terlalu luas: izin "cukup baik untuk sekarang" cenderung menjadi permanen.
  • Kebocoran token: menyimpan token di tempat mudah disalin (log, URL, localStorage) atau mengirimkannya ke pihak ketiga.

Anggap bug auth sebagai perilaku yang bisa diuji: jika bisa mengalami regresi, berikan tes.

Pertanyaan umum

Apa perbedaan praktis antara autentikasi dan otorisasi dalam sebuah framework?

Autentikasi membuktikan identitas (siapa yang membuat permintaan). Otorisasi memutuskan akses (apa yang boleh dilakukan identitas tersebut) menggunakan konteks seperti rute, kepemilikan sumber daya, tenant, dan scope.

Framework memisahkan kedua hal ini sehingga Anda bisa mengganti metode masuk tanpa menulis ulang logika izin.

Di mana framework biasanya “menerapkan” pemeriksaan autentikasi dan otorisasi?

Kebanyakan framework menerapkan otentikasi/otorisasi dalam pipeline permintaan, biasanya dengan:

  • Middleware/filters/interceptors untuk mengurai sesi/token dan melampirkan user/principal
  • Route guards untuk memblokir permintaan yang tidak terautentikasi atau tidak berizin
  • Pemeriksaan policy di dalam atau dekat logika bisnis untuk keputusan spesifik sumber daya
Apa itu identity store, dan bagaimana bedanya dengan user model?

Identity store adalah sumber kebenaran untuk pengguna dan kredensial (atau penautan ke identitas eksternal). User model adalah cara kode Anda merepresentasikan identitas tersebut.

Dalam praktiknya, framework butuh keduanya untuk menjawab: “diberikan identifier/token ini, siapa pengguna saat ini?”

Apa saja sumber identitas tipikal yang diintegrasikan framework?

Sumber umum meliputi:

  • Basis data aplikasi Anda (Anda mengelola kredensial dan profil)
  • IdP eksternal (provider OIDC/OAuth seperti Google/Microsoft)
  • Direktori enterprise (LDAP/Active Directory)

Saat menggunakan IdP/direktori, banyak aplikasi menyimpan “shadow user” lokal untuk memetakan ID eksternal (mis. sub OIDC) ke peran dan data aplikasi.

Kapan saya harus menggunakan autentikasi berbasis sesi vs berbasis token?

Sesi menyimpan identitas di server dan memakai cookie sebagai pointer (session ID). Mereka cocok untuk SSR dan memudahkan pencabutan sesi.

Token (JWT/opaque) dikirim setiap permintaan (sering lewat Authorization: Bearer ...) dan cocok untuk API, SPA, mobile, dan komunikasi service-to-service.

Flag cookie mana yang paling penting untuk keamanan sesi, dan mengapa?

Framework biasanya menguatkan cookie sesi dengan:

  • HttpOnly (mengurangi pencurian cookie lewat XSS)
  • Secure (hanya lewat HTTPS)
  • SameSite (membatasi pengiriman lintas-origin; memengaruhi CSRF dan flow login)

Pilih nilai yang sesuai untuk aplikasi Anda (mis. Lax vs None untuk flow lintas situs).

Apa perbedaan antara opaque token dan JWT, dan kenapa itu penting?

Opaque token adalah string acak yang divalidasi lewat lookup server (mendorong pencabutan mudah dan menyimpan isi token privat).

JWT adalah token yang ditandatangani dan berisi klaim terbaca (mis. sub, exp, roles/scopes). Mereka praktis untuk sistem terdistribusi, tapi pencabutan lebih sulit kecuali Anda memakai expiry pendek dan kontrol server-side (deny list, versioning token).

Bagaimana refresh token dan rotasi bekerja di framework modern?

Buat access token berumur pendek dan gunakan refresh token hanya untuk mint access token baru.

Endpoint umum:

  • POST /auth/login → access + refresh
  • POST /auth/refresh → rotasi refresh token + keluarkan access baru
  • POST /auth/logout → batalkan refresh token

Rotasi ditambah deteksi reuse membatasi dampak jika refresh token bocor.

Apakah saya perlu OAuth 2.0, OpenID Connect, atau keduanya?

OAuth 2.0 dipakai untuk delegated access (izinkan aplikasi memanggil API atas nama pengguna).

OpenID Connect (OIDC) dipakai untuk login/identitas (menyediakan ID token dan klaim identitas).

Biasanya fitur “Login dengan X” adalah OIDC di atas OAuth 2.0.

Bagaimana peran, izin, dan kebijakan saling terkait untuk otorisasi?

RBAC (peran) bagus untuk aturan garis besar (mis. admin vs member). Permissions/policies menangani aturan yang lebih rinci (mis. edit hanya dokumen miliknya).

Pola umum:

  • Peran untuk gate kasar di rute
  • Policy untuk keputusan level sumber daya menggunakan konteks user + resource + request

Related posts