Soal 1Ketika server menyimpan password pengguna, apa yang diletakkan di database?
Cara Kerja Fitur Login — Autentikasi, Session, dan Cookie
Artikel ini adalah bagian dari kursus Dasar-Dasar Teknologi Informasi, yang membangun dari nol pengetahuan TI praktis yang minimal kamu butuhkan untuk memprogram dan melakukan vibe coding.
Fitur login terdiri dari autentikasi yang memastikan pengguna memang pemilik akunnya, dan session yang membuat server tetap mengenali pengguna yang sama setelahnya. Diagramnya menunjukkan peran hash dan Cookie.
Artikel ini membahas cara kerja fitur login.
Fitur login terdiri dari dua mekanisme: satu memastikan pengguna memang pemilik akunnya, satu lagi membuat pengguna yang sama tetap dikenali setelahnya.
"Hashing", "metode session", dan "JWT" adalah nama berbeda untuk bagian dari satu fitur login.
Cabang atas adalah pemeriksaan yang hanya dilakukan sekali, cabang bawah adalah pemeriksaan yang dilakukan pada setiap request setelahnya.
Autentikasi memastikan siapa kamu, otorisasi menentukan apa yang boleh kamu lakukan
Autentikasi (authentication, memastikan bahwa pengguna memang pemilik akunnya) adalah keputusan yang diambil saat login.
Otorisasi (authorization, menentukan apa yang boleh dilakukan pengguna yang identitasnya sudah dipastikan) adalah keputusan lain yang diambil setelahnya.
- Yang dipakai — ID dan password, setelah login session ID di Cookie
- Kalau gagal — kembalikan pengguna ke layar login
- Password diperiksa sekali, setelah itu session ID
- Yang dipakai — siapa pemilik pemesanan, dan apakah penggunanya admin
- Kalau gagal — balas "kamu tidak punya izin"
- Diperiksa setiap kali ada tindakan
Meski tindakannya dilakukan tanaka yang sama, keduanya diputuskan terpisah.
Ada baris yang berhenti di autentikasi, dan ada yang lolos autentikasi lalu berhenti di otorisasi.
Pengaturan seperti "hanya admin" dan "kamu hanya bisa melihat datamu sendiri" adalah otorisasi.
Autentikasi memastikan siapa kamu, otorisasi menentukan apa yang boleh kamu lakukan
Bisa login dan boleh melakukan suatu tindakan adalah dua hal yang diputuskan terpisah.
Autentikasi memastikan apakah pengguna memang pemilik akunnya, otorisasi menentukan apakah pengguna itu boleh melakukan tindakan tersebut, dan otorisasi diperiksa di sisi server setiap kali ada tindakan.
Password disimpan sebagai hash, dan hash dibandingkan dengan hash
Hal pertama yang perlu dipahami tentang autentikasi adalah server tidak menyimpan password itu sendiri.
Yang disimpan adalah hash (string yang dibuat dari string asli lewat prosedur tetap dan tidak bisa dikembalikan ke bentuk semula).
| Karakter yang kamu ketik | Di-hash saat itu juga | Dibandingkan dengan hash tersimpan | Hasil |
|---|---|---|---|
| hanabi2026 (benar) | a3f9...c1 | Sama dengan a3f9...c1 | Login berhasil |
| hanabi2025 (beda satu karakter) | 7b20...e4 | Beda dari a3f9...c1 | Login gagal |
| Hanabi2026 (beda huruf besar) | d15c...8a | Beda dari a3f9...c1 | Login gagal |
Beda satu karakter saja sudah menghasilkan hash yang sama sekali berbeda.
Pemeriksaan tetap bisa dilakukan meski hash tidak bisa dibalik, karena pembandingnya juga hash.
Yang dimiliki server hanyalah string yang tidak bisa dibalik.
- email — tanaka@example.com
- password_hash — a3f9...c1
- created_at — tanggal dan waktu akun dibuat
- Karakter hanabi2026 yang diketik
- Data apa pun yang bisa dikembalikan menjadi karakter yang diketik
- Status apakah pengguna sedang login
Password disimpan sebagai hash untuk berjaga-jaga kalau isi database bocor.
String yang sering dipakai bisa ditebak, jadi sebelum di-hash ditambahkan string yang berbeda untuk setiap pengguna (salt).
HTTPS melindungi data agar tidak terbaca selama dikirim, dan itu hal yang terpisah dari bentuk penyimpanannya.
Yang disimpan adalah hash, dan pembandingnya juga hash
Server tidak memiliki password yang diketik pengguna.
Yang dimiliki hanyalah string yang tidak bisa dibalik, dan setiap kali login server memproses karakter yang diketik dengan prosedur yang sama lalu memeriksa apakah string hasilnya sama dengan yang tersimpan.
Setelah login, session ID di Cookie itulah yang membuat server tahu ini orang yang sama
Meski login berhasil, request yang membuka halaman berikutnya tetap request yang terpisah.
HTTP bersifat stateless (setiap request diproses tanpa mengingat request sebelumnya), jadi server tidak menyimpan siapa yang baru saja login.
Fakta bahwa login lolos dicatat di sisi server, dan browser dititipi sebuah string yang menunjuk ke catatan itu.
Catatan yang tersimpan di sisi server itulah session, string yang menunjuknya adalah session ID, dan mekanisme yang menitipkan string itu ke browser lalu membuatnya terkirim setiap kali adalah Cookie.
- Cookie: session_id=3f9a1c...e81b
- Ikut otomatis di setiap request ke situs yang sama
- Tidak ada yang dipegang selain string ini
- Catatan session 3f9a1c...e81b adalah tanaka
- Catatan ini punya masa berlaku
- Logout menghapus catatan ini
Yang ada di sisi browser hanyalah string 3f9a1c...e81b, yang tidak memuat nama maupun izin.
Siapa pemilik login itu baru diketahui ketika string tersebut dicocokkan dengan catatan di sisi server.
Hanya baris atas yang cocok dengan sebuah catatan, jadi daftar pemesanan dikembalikan tanpa menanyakan password lagi.
Serah terima ini berbentuk dua baris berikut.
# Baris yang dikembalikan server ketika login berhasil
Set-Cookie: session_id=3f9a1c...e81b; HttpOnly; Secure
# Selanjutnya, baris yang ikut di setiap request yang dikirim browser ke situs yang sama
Cookie: session_id=3f9a1c...e81b
Dua bagian setelah Set-Cookie adalah instruksi untuk browser.
HttpOnly membuat JavaScript di halaman tidak bisa membaca Cookie ini, dan Secure membuatnya hanya terkirim lewat HTTPS.
Isi Cookie bisa diubah oleh pengguna, jadi hasilnya berbeda tergantung apakah isinya dipercaya begitu saja atau tidak.
Cookie disimpan di browser, jadi pengguna bisa mengubah isinya lalu mengirimkannya.
Masukkan hanya session ID ke dalam Cookie, dan ambil keputusan dari catatan di sisi server.
Kotak di sebelah kiri hanya memuat satu string yang tidak punya makna sendiri.
Semua bahan untuk menentukan siapa penggunanya dan apa yang boleh dilakukannya ada di dalam kotak sebelah kanan.
Browser hanya dititipi satu string yang menunjuk ke catatan
Saat sebuah request tiba, server belum tahu request itu dari siapa.
Server bisa tahu karena catatan yang dibuat saat login dan string yang dikirim browser setiap kali saling dicocokkan, dan kalau catatannya dihapus atau masa berlakunya habis, mengirim string yang sama pun akan membawamu kembali ke layar login.
Beda metode session dan JWT — server yang memegang catatan, atau string yang memegangnya
"Metode session atau JWT" adalah pilihan tentang sisi mana yang memegang bukti bahwa pengguna sudah login.
Yang satu lagi tidak meninggalkan catatan di server dan menitipkan buktinya sendiri ke browser.
String bukti yang ikut dikirim setiap kali disebut token, dan JWT (JSON Web Token, string yang menggabungkan ID pengguna, masa berlaku, dan tanda tangan) adalah format yang paling dikenal.
- ID pengguna milik tanaka
- Masa berlaku (bisa dipakai sampai waktu ini)
- String yang dihitung dari isinya
- Mengubah isinya membuat hitungannya tidak lagi cocok
Karena ada tanda tangan, server bisa tahu bahwa string yang tiba adalah string yang ia terbitkan sendiri, tanpa mencocokkannya dengan catatan.
| Aspek | Metode session | JWT |
|---|---|---|
| Yang diserahkan saat login berhasil | session_id=3f9a1c...e81b | eyJhbGci... ID, masa berlaku, dan tanda tangan |
| Tempat dasar keputusan berada | Catatan di dalam server | Isi di dalam string |
| Cara memeriksanya setiap kali | Cocokkan dengan catatan | Verifikasi tanda tangan |
JWT membawa isinya sendiri, jadi bisa diterima tanpa catatan di server.
Pada metode session, menghapus catatan membuat request berikutnya tidak lolos lagi.
JWT tetap lolos sampai masa berlakunya habis, jadi kalau kamu ingin menghentikannya seketika, kamu menyimpan daftar terpisah berisi token yang sudah dicabut.
Di artikel ini metode session digambarkan sebagai Cookie dan JWT sebagai string, tetapi pada praktiknya ada juga konfigurasi yang memasukkan JWT ke dalam Cookie.
Meski tempat penyimpanannya berubah, perbedaannya tetap sama: mencocokkan dengan catatan atau memverifikasi tanda tangan.
Server yang memegang catatan, atau string yang memegang isinya sendiri
Pada kedua metode, browser sama-sama mengirim satu string setiap kali.
Yang berbeda adalah apa yang dilakukan server saat menerimanya: metode session mencari catatannya sendiri, sedangkan JWT memverifikasi tanda tangan yang menempel pada string itu.
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Ketika kamu membuka halaman lain setelah login, mengapa server tahu bahwa ini pengguna yang sama?
Soal 3Seorang pengguna yang sudah login mencoba menghapus pemesanan orang lain dan ditolak server. Keputusan yang mana ini?