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 |
| 2 | function 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 | |
| 14 | const adminOnlyMiddleware = authorizeRole(["admin", "superadmin"]); |
| 15 | |
| 16 | const studentUser = { userId: "u1", role: "student" }; |
| 17 | const adminUser = { userId: "u2", role: "admin" }; |
| 18 | |
| 19 | console.log("Student mencoba akses rute admin:", adminOnlyMiddleware(studentUser)); |
| 20 | console.log("Admin mencoba akses rute admin:", adminOnlyMiddleware(adminUser)); |