Back to IF4031 Arsitektur Aplikasi Terdistribusi
Topic
Questions/Cues
Bagaimana alur autentikasi web HTML?
Apa itu Session ID & Cookie?
Beda Random ID vs Rich Token?
Apa itu OAuth 2.0?
Bagaimana alur autentikasi REST API?
Apa itu JWT?
Apa saja komponen JWT?
Bagaimana token dikirim ke server?
Reference Points
- Slides IF4031 Hal 21-28
Autentikasi Antarmuka Web (HTML)
Alur autentikasi tradisional pada web berbasis HTML umumnya menggunakan cookies dan sessions.
Login: Pengguna mengirimkan username dan password.
Verifikasi & Pembuatan Sesi: Server memverifikasi kredensial. Jika valid, server membuat sebuah session (catatan di database server) dan menghasilkan sebuah Session ID yang unik.
Pengiriman Cookie: Server mengirimkan Session ID ini kembali ke browser dalam bentuk cookie.
Request Berikutnya: Untuk setiap request selanjutnya, browser akan secara otomatis menyertakan cookie tersebut. Server menggunakan Session ID dari cookie untuk mencari data sesi dan mengidentifikasi pengguna.
Random ID vs. Rich Token
Random Unique ID: Session ID adalah string acak yang tidak bermakna. Server perlu melakukan query ke database pada setiap request untuk mendapatkan informasi pengguna. Ini aman tetapi bisa menjadi bottleneck.
Rich Token: Informasi pengguna (seperti user ID, role, waktu kedaluwarsa) disematkan langsung di dalam token itu sendiri. Server tidak perlu query ke database, cukup memverifikasi token. Namun, token ini harus diamankan dengan tanda tangan digital (signature) agar tidak bisa dipalsukan.
Autentikasi Antarmuka RESTful
Untuk API, terutama yang diakses oleh aplikasi non-browser (seperti aplikasi mobile), standar yang umum digunakan adalah OAuth 2.0.
OAuth 2.0
OAuth adalah standar otorisasi, bukan autentikasi. Ia mendefinisikan alur bagaimana sebuah aplikasi (klien) bisa mendapatkan izin untuk mengakses resource milik seorang pengguna tanpa harus mengetahui password pengguna tersebut. Hasil akhir dari alur OAuth adalah sebuah Access Token.
Alur Umum dengan OAuth
Aplikasi Klien meminta otorisasi dari pengguna dan mengarahkannya ke Authorization Server.
Pengguna login di Authorization Server dan menyetujui permintaan akses.
Authorization Server mengembalikan sebuah token ke Aplikasi Klien.
Aplikasi Klien menggunakan token ini untuk mengakses Resource Server (API sebenarnya).
JSON Web Token (JWT)
JWT adalah format standar untuk membuat access token yang bersifat self-contained atau rich token. Token JWT terlihat seperti string panjang yang acak, tetapi sebenarnya terdiri dari tiga bagian yang dipisahkan oleh titik (
.), di-encode menggunakan Base64Url.Komponen JWT
Header: Berisi metadata tentang token, seperti algoritma signature yang digunakan (
alg).Payload: Berisi data sebenarnya, yang disebut claims. Contohnya
sub(subject/user ID),name(nama pengguna), danexp(waktu kedaluwarsa).Signature: Dihasilkan dengan menggabungkan header dan payload, lalu menandatanganinya dengan sebuah secret key yang hanya diketahui oleh server. Ini digunakan untuk memverifikasi bahwa token tersebut asli dan tidak diubah di tengah jalan.
Pengiriman Token
Klien umumnya mengirimkan access token (seperti JWT) ke server pada setiap request melalui HTTP header
Authorizationdengan skemaBearer.
Authorization: Bearer <token_jwt_panjang_disini>
Autentikasi API telah berevolusi dari mekanisme berbasis sesi dan cookie yang umum di web HTML, menjadi alur otorisasi berbasis token yang distandarisasi oleh OAuth 2.0. Dalam sistem modern, Authorization Server mengeluarkan sebuah Access Token, seringkali dalam format JSON Web Token (JWT), setelah pengguna memberikan persetujuan. JWT ini adalah sebuah rich token yang berisi informasi pengguna dan diverifikasi menggunakan signature digital, yang kemudian dikirim oleh klien pada setiap request di header
Authorization: Beareruntuk mengakses resource yang dilindungi.
Additional Information
Pendalaman Teknis: Alur Grant Type di OAuth 2.0
OAuth 2.0 sangat fleksibel dan memiliki beberapa “grant types” atau alur untuk mendapatkan token, disesuaikan dengan jenis klien:
Authorization Code: Alur paling aman dan umum untuk aplikasi web tradisional. Melibatkan redirect ke server otorisasi.
Implicit: Alur yang disederhanakan untuk aplikasi single-page (SPA) yang berjalan di browser, tetapi kini kurang direkomendasikan.
Resource Owner Password Credentials: Klien langsung meminta username dan password pengguna. Hanya boleh digunakan untuk klien yang sangat dipercaya (misalnya, aplikasi resmi dari pemilik layanan).
Client Credentials: Digunakan untuk komunikasi machine-to-machine, di mana tidak ada pengguna akhir yang terlibat. Klien mengautentikasi dirinya sendiri untuk mengakses API.
Masalah Keamanan Cookie
XSS (Cross-Site Scripting): Jika sebuah situs rentan terhadap XSS, penyerang bisa menyuntikkan JavaScript untuk mencuri cookie pengguna dan mengambil alih sesi mereka. Atribut cookie
HttpOnlymembantu mencegah ini.CSRF (Cross-Site Request Forgery): Penyerang menipu browser pengguna untuk mengirim request ke situs lain di mana pengguna sedang login. Atribut cookie
SameSitedirancang untuk mengatasi masalah ini.Sumber & Referensi Lanjutan:
jwt.io: Situs web yang sangat berguna untuk men-decode, memverifikasi, dan men-generate JWT untuk keperluan debugging.
Auth0: Salah satu penyedia layanan identitas (Identity-as-a-Service) terkemuka yang memiliki banyak dokumentasi dan artikel bagus yang menjelaskan OAuth 2.0 dan JWT dengan sangat jelas.