KuloDev
1 Hari
0 XP
intermediate30 menitModul: 01-rest-api-architecture

Keamanan API: Autentikasi vs Otorisasi & JWT Tokens

Pahami perbedaan Autentikasi dan Otorisasi (RBAC), anatomi token JWT (Header.Payload.Signature), serta strategi pencegahan serangan XSS & CSRF.

1. Autentikasi (Authentication) vs Otorisasi (Authorization)

Dua pilar keamanan backend yang sering disalahartikan: - **Autentikasi (Who are you?)**: Memverifikasi identitas pengguna (misal: memeriksa email dan password hash saat login). - **Otorisasi (What can you do?)**: Menentukan hak akses pengguna setelah identitasnya terbukti (misal: apakah user ini `Admin` yang boleh menghapus data, atau `Student` yang hanya boleh membaca materi).

2. Anatomi JSON Web Token (JWT)

JWT adalah standar terbuka (RFC 7519) untuk mentransmisikan klaim data secara aman antar pihak dalam format string base64 yang ditandatangani secara kriptografis (*Signature*).

example.js
javascript
1// JWT terdiri dari 3 bagian yang dipisahkan titik (.):
2// eygci... (HEADER) . eyJ1c2... (PAYLOAD) . SflKxw... (SIGNATURE)
3
4// 1. Header: Algoritma hashing & tipe token
5{ "alg": "HS256", "typ": "JWT" }
6
7// 2. Payload: Data klaim user (misal: userId, email, role, exp expired)
8{ "userId": "123", "role": "admin", "exp": 1718000000 }
9
10// 3. Signature: Segel anti-pemalsuan
11// HMACSHA256(base64Url(header) + "." + base64Url(payload), SECRET_KEY)
Penting: JWT Payload Tidak Terenkripsi secara Rahasia!
Payload JWT hanya di-encode Base64 (dapat dibaca oleh siapa saja dengan decode base64). Nilai keamanannya terletak pada **Signature** yang mencegah modifikasi isi data. Jangan pernah menyimpan password atau data rahasia perbankan di dalam payload JWT!

3. Simulasi Verifikasi JWT & Role-Based Access Control (RBAC)

example.js
javascript
1// Simulasi middleware pengecekan hak akses di backend
2function authorizeRole(allowedRoles) {
3 return function(userTokenPayload) {
4 if (!userTokenPayload || !userTokenPayload.userId) {
5 return { authorized: false, status: 401, error: "Unauthorized: Token invalid" };
6 }
7 if (!allowedRoles.includes(userTokenPayload.role)) {
8 return { authorized: false, status: 403, error: "Forbidden: Insufficient permissions" };
9 }
10 return { authorized: true, status: 200 };
11 };
12}
13
14const adminOnlyMiddleware = authorizeRole(["admin", "superadmin"]);
15
16const studentUser = { userId: "u1", role: "student" };
17const adminUser = { userId: "u2", role: "admin" };
18
19console.log("Student mencoba akses rute admin:", adminOnlyMiddleware(studentUser));
20console.log("Admin mencoba akses rute admin:", adminOnlyMiddleware(adminUser));

Selesaikan Materi Ini?

Dapatkan +25 XP dan simpan progres belajarmu.