Seri Autentikasi (Bagian 1): Praktik Rekayasa Aplikasi
March 8, 2024
Pendahuluan
Autentikasi identitas memainkan peran penting dalam melindungi akses data dan privasi pengguna dalam aplikasi internet, terutama untuk aplikasi internal perusahaan. Dalam seri artikel ini, kita akan mengeksplorasi autentikasi identitas dari berbagai perspektif, dengan fokus khusus pada praktik autentikasi identitas dalam rekayasa aplikasi dalam artikel ini.
Dalam berbagai aplikasi, autentikasi identitas umumnya menggunakan dua teknik berikut:
-
Cookie & Session: Mekanisme autentikasi tradisional ini banyak digunakan dalam aplikasi web, terutama di dalam browser. Ini memverifikasi identitas pengguna dan mempertahankan status sesi menggunakan cookie dan sesi.
-
Bearer Token: Ini adalah mekanisme autentikasi yang lebih modern yang menghilangkan ketergantungan pada cookie browser dan sebaliknya menggunakan protokol HTTP untuk autentikasi. Ini sangat cocok untuk skenario API dan dapat digunakan dalam aplikasi seluler.
Terlepas dari metode yang dipilih, pengembang perlu memilih pendekatan autentikasi yang sesuai untuk produk mereka untuk memastikan keamanan data, privasi pengguna, dan pengalaman pengguna yang mulus.
Aplikasi Web Tradisional
Di masa lalu, kami menggunakan Java JSP untuk langsung membangun aplikasi web, mengidentifikasi pengguna menggunakan JSESSIONID, ID sesi yang disimpan dalam cookie di browser klien dan dibawa dengan setiap permintaan.
Namun, pendekatan ini memiliki beberapa masalah. Karena cookie dikelola dan disimpan di perangkat klien oleh browser, penyerang jahat dapat mencuri ID sesi yang disimpan dan menyamar sebagai pengguna, menimbulkan risiko keamanan. Selain itu, pengembang terkadang kesulitan menetapkan periode kedaluwarsa dan persyaratan keamanan yang wajar untuk cookie dan sesi.
Saat mengembangkan aplikasi ini, pengembang sering kali harus mengimplementasikan autentikasi secara terpisah untuk setiap sistem, yang independen dan menggunakan sistem identitas yang berbeda. Hal ini memerlukan pekerjaan yang berulang. Dalam kasus seperti ini, Single Sign-On (SSO) dapat mengatasi tantangan ini dengan memanfaatkan sistem autentikasi terpadu, memerlukan pekerjaan integrasi minimal di setiap aplikasi web individu untuk mencapai fungsionalitas autentikasi.
Dalam beberapa tahun terakhir, baik teknologi front-end maupun back-end telah membuat kemajuan pesat. Pengembang telah mulai bermigrasi ke tumpukan teknologi yang lebih modern, meninggalkan aplikasi yang didukung oleh teknologi usang sebagai platform warisan. Namun, ada kasus di mana persyaratan keamanan identitas baru muncul, tetapi memodifikasi kode lama tidak memungkinkan. Dalam kasus seperti ini, pendekatan alternatif adalah menggunakan middleware yang bekerja sebagai reverse proxy untuk melakukan autentikasi. Sebelum klien mencapai aplikasi, middleware mengarahkan pengguna ke antarmuka autentikasi eksternal, di mana pengguna masuk. Middleware kemudian memperoleh informasi identitas pengguna dan melampirkannya ke permintaan sebelum meneruskannya ke aplikasi lama. Ini memungkinkan pengembang untuk menambahkan mekanisme autentikasi baru ke aplikasi lama tanpa memodifikasi kode yang ada.

Evolusi Aplikasi Web: Pemisahan Front-End dari Back-End
Dengan munculnya teknologi front-end baru seperti Vue dan React, interaksi web telah direvolusi. Di masa lalu, pengguna harus mengisi dan mengirim formulir di halaman web, berinteraksi dengan back-end menggunakan formulir HTML dan tombol, yang tidak memberikan pengalaman pengguna yang mulus. Sekarang, interaksi di halaman bersifat real-time, dan pengembang menggunakan skrip JavaScript untuk berinteraksi dengan API back-end, menawarkan pengalaman yang lebih konsisten dan berkelanjutan. Interaksi pengguna telah beralih dari permintaan HTTP langsung ke memanggil berbagai API.
Ada beberapa perbedaan dalam mekanisme autentikasi identitas antara aplikasi yang berorientasi halaman web dan aplikasi yang berorientasi API. Meskipun cookie lama masih dapat digunakan, mereka tidak cocok untuk teknologi front-end modern. Teknologi baru memberdayakan pengembang dengan kode yang lebih ekspresif, memungkinkan mereka untuk melakukan lebih banyak operasi, termasuk skenario di mana kita mungkin perlu mengganti akun pengguna di front end. Namun, mengimplementasikan ini langsung di front end melalui cookie menantang (untuk alasan keamanan, cookie yang terkait dengan identitas pengguna sering dikonfigurasi sebagai httpOnly, mencegah skrip JavaScript membaca dan memanipulasinya).
Biasanya, aplikasi front-end modern mengelola sesi pengguna sendiri. Setelah pengguna berhasil masuk, front end mengelola token yang dihasilkan oleh backend dan menambahkannya ke header permintaan saat melakukan panggilan API untuk backend mengidentifikasi identitas pengguna. API menggunakan token untuk mengidentifikasi informasi pengguna. Ada berbagai sarana teknis yang tersedia, seperti mengimplementasikan mekanisme token secara manual menggunakan JSON Web Tokens (JWT). Payload JWT menyimpan informasi identifikasi seperti ID pengguna, yang kemudian ditandatangani untuk memungkinkan backend memverifikasi token dan mengambil informasi identitas pengguna.
Namun, JWT juga memiliki beberapa kekurangan, seperti:
-
Waktu kedaluwarsa JWT tetap dan tidak dapat diubah setelah tanda tangan selesai. Karena biasanya tidak disimpan oleh backend dan hanya menjalani verifikasi tanda tangan, tidak mungkin untuk mencabut token, yang menimbulkan risiko pencurian token.
-
Data payload disimpan dalam teks biasa dan dapat diurai oleh klien, membuatnya tidak cocok untuk menyimpan informasi rahasia.
Untungnya, sekarang ada spesifikasi JWT baru untuk mengatasi kekurangan ini. Payload JWT dapat menyertakan bidang yang disebut "jti" untuk menyimpan pengidentifikasi unik untuk JWT, yang dapat disimpan dalam cache backend untuk mengontrol siklus hidup JWT. Selain itu, spesifikasi JSON Web Encryption (JWE) mendefinisikan ekstensi JWT terenkripsi yang menggabungkan keuntungan enkripsi asimetris dan simetris, memastikan bahwa payload dikirim dalam bentuk ciphertext untuk mencegah kebocoran.
Selain itu, ada teknologi berbasis JWT lain yang menyediakan solusi yang lebih matang, seperti OpenID Connect. Penting untuk dicatat bahwa OpenID Connect tidak bergantung pada JWT, tetapi mereka dapat digunakan bersama. OpenID Connect menstandarisasi mekanisme untuk token akses dan token penyegaran, memungkinkan pengembang menggunakan token jangka pendek untuk mengurangi risiko pencurian token. Ekosistem OpenID Connect juga berkembang pesat, dengan banyak implementasi server dan klien yang tersedia untuk membantu pengembang membangun sistem autentikasi identitas berdasarkan protokol OpenID Connect. Selain itu, solusi autentikasi identitas open-source seperti Keycloak dapat membantu pengembang mengimplementasikan layanan autentikasi identitas yang aman.

Praktik teknologi front-end baru, seperti Next.js, secara bertahap memperkenalkan teknik rendering sisi server ke domain front-end. Ini mewakili evolusi baru dari paradigma pengembangan web lama, menggabungkan React dengan program back-end untuk lebih meningkatkan pengalaman pengguna. Sekarang ada lebih banyak perpustakaan, seperti NextAuth, yang dapat membantu pengembang mengimplementasikan autentikasi identitas menggunakan mekanisme ini, membuat proses autentikasi lebih ramah pengembang.
Gateway API dan Autentikasi Identitas
Mari kita pertimbangkan bagaimana aplikasi seluler kita berinteraksi dengan data. Apakah mereka juga menggunakan API? Dalam aplikasi seluler, tidak ada mekanisme cookie seperti di browser untuk menyimpan sesi pengguna, jadi mereka terutama menggunakan token untuk menyampaikan informasi melalui header permintaan HTTP.
Bagaimana dengan layanan API? Backend aplikasi yang sukses biasanya terdiri dari banyak sistem API yang kompleks yang memerlukan mekanisme autentikasi identitas yang terpadu. Jika tidak, pengembang harus mengimplementasikan mekanisme autentikasi yang sama untuk setiap layanan, yang akan merepotkan.
Gateway API dapat membantu kita menyelesaikan masalah ini dengan menangani tugas autentikasi dan parsing yang mirip dengan cookie atau token, dan langsung meneruskan informasi identitas yang diuraikan ke layanan backend, mengurangi duplikasi pekerjaan. Apache APISIX dan API7 Enterprise juga mendukung fungsionalitas autentikasi OpenID Connect siap pakai, membantu pengguna mengintegrasikan layanan autentikasi identitas secara langsung. Selain itu, gateway API mendukung implementasi mekanisme autentikasi apa pun melalui skrip, jadi bahkan dengan mekanisme autentikasi identitas kustom, mereka dapat diintegrasikan pada gateway API, menyederhanakan pengembangan aplikasi.
Ringkasan
Perkembangan metode interaksi pengguna telah mendorong kemajuan dalam autentikasi identitas. Pendekatan yang berpusat pada API menjadi tren utama, dan API mungkin disediakan oleh arsitektur mikroservis, memerlukan mekanisme autentikasi identitas yang terpadu untuk mengurangi pengembangan yang berlebihan. Oleh karena itu, kita harus memilih mekanisme yang lebih modern seperti OpenID Connect dan JWT, dan menggunakan gateway API dapat memberikan fungsionalitas tambahan untuk pengembangan API.