Implementasi OAuth2 dan OpenID Connect: Panduan Lengkap untuk Developer
Di era aplikasi modern, autentikasi dan otorisasi menjadi fondasi keamanan yang tidak bisa ditawar. OAuth2 dan OpenID Connect (OIDC) adalah dua protokol standar industri yang wajib dikuasai setiap developer. OAuth2 fokus pada authorization (akses sumber daya), sedangkan OIDC dibangun di atas OAuth2 untuk menangani authentication (identitas pengguna). Memahami keduanya adalah kunci membangun sistem login yang aman dan scalable.
Pendahuluan: OAuth2 vs OpenID Connect
Banyak developer keliru menganggap OAuth2 adalah protokol login. Faktanya, OAuth2 hanya memberi access token untuk mengakses API. OIDC melengkapinya dengan ID Token (JWT) yang berisi klaim identitas seperti sub, email, dan name. Jika aplikasi Anda perlu tahu siapa pengguna, gunakan OIDC. Jika hanya butuh izin akses, cukup OAuth2.
Pembahasan: Alur Authorization Code Flow
Alur paling aman untuk aplikasi web adalah Authorization Code Flow with PKCE. Prosesnya: pengguna diarahkan ke authorization server, login, lalu server mengirim code ke aplikasi. Code ini ditukar dengan token melalui backend, sehingga token tidak pernah terekspos ke browser.
Contoh Implementasi
Berikut contoh konfigurasi menggunakan Node.js dan library openid-client:
const { Issuer } = require('openid-client');
(async () => {
const issuer = await Issuer.discover('https://accounts.google.com');
const client = new issuer.Client({
client_id: process.env.CLIENT_ID,
client_secret: process.env.CLIENT_SECRET,
redirect_uris: ['https://myapp.com/callback'],
response_types: ['code'],
});
const url = client.authorizationUrl({
scope: 'openid email profile',
code_challenge: pkce.challenge,
code_challenge_method: 'S256',
});
res.redirect(url);
})();
Setelah callback, tukar code dengan token dan verifikasi ID Token:
app.get('/callback', async (req, res) => {
const params = client.callbackParams(req);
const tokenSet = await client.callback(
'https://myapp.com/callback',
params,
{ code_verifier: pkce.verifier }
);
// Verifikasi signature & claims ID Token
const claims = tokenSet.claims();
req.session.user = { sub: claims.sub, email: claims.email };
});
Analisis Keamanan: Celah Umum dan Eksploitasi
Salah satu celah paling berbahaya adalah Authorization Code Interception pada mobile app atau SPA tanpa PKCE. Penyerang yang bisa membaca redirect URI (misalnya lewat custom scheme yang tidak aman) dapat mencuri authorization code dan menukarnya menjadi access token. Eksploitasi ini dilakukan dengan mendaftarkan skema URI jahat yang sama dengan aplikasi target, lalu mencegat code saat pengguna login.
Celah lain adalah Open Redirect pada parameter redirect_uri yang tidak divalidasi ketat, memungkinkan penyerang mengarahkan token ke domain mereka. Selain itu, CSRF pada endpoint callback bisa membuat korban login ke akun penyerang tanpa sadar.
Cara Pencegahan
- Wajibkan PKCE (
S256) untuk semua public client, terutama mobile dan SPA. - Validasi redirect_uri dengan exact match, bukan wildcard atau substring.
- Gunakan parameter
stateacak untuk mencegah CSRF dannonceuntuk mencegah replay ID Token. - Selalu verifikasi signature JWT menggunakan
jwks_uridari issuer, cekiss,aud, danexp. - Simpan token di HttpOnly & Secure cookie, bukan localStorage yang rentan XSS.
- Terapkan token rotation dan refresh token dengan masa berlaku pendek.
Tips SEO dan Performansi
Halaman login yang cepat meningkatkan conversion sekaligus ranking. Terapkan code splitting agar bundle autentikasi hanya dimuat saat dibutuhkan, gunakan preconnect ke domain issuer OAuth, dan cache metadata /.well-known/openid-configuration dengan TTL yang wajar. Pastikan halaman callback tidak diindeks Google dengan noindex, serta gunakan lazy loading pada elemen berat agar skor Lighthouse tetap hijau.
Kesimpulan
OAuth2 dan OpenID Connect adalah kombinasi standar emas untuk autentikasi modern. Kuncinya: pahami perbedaan authorization dan authentication, gunakan Authorization Code Flow dengan PKCE, dan validasi setiap parameter keamanan (state, nonce, redirect_uri). Jangan pernah menyimpan token di tempat yang bisa diakses JavaScript, dan selalu verifikasi ID Token secara kriptografis. Dengan menerapkan praktik ini, aplikasi Anda tidak hanya aman dari serangan token interception, tetapi juga lebih cepat, SEO-friendly, dan siap skalabilitas di production.