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.

Fitur login terdiri dari dua mekanisme
tanakamelakukan loginMemastikansiapa penggunanyaTetap mengenalipengguna yang samaMembandingkanhash passwordSession IDdi dalam Cookie
Satu kali login di sebelah kiri terbagi ke atas dan ke bawah. Bagian atas adalah pemeriksaan yang hanya dilakukan sekali di awal, bagian bawah adalah pemeriksaan yang dilakukan pada setiap request setelahnya. Kolom kanan berisi istilah yang dibahas artikel ini.

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.

Dua keputusan yang diambil server di dalam satu request penghapusan pemesanan
Satu request: "hapus pemesanan ini"
Keputusan 1 — autentikasi (benarkah ini tanaka?)
  • 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
Keputusan 2 — otorisasi (boleh tidak pemesanan ini dihapus?)
  • Yang dipakai — siapa pemilik pemesanan, dan apakah penggunanya admin
  • Kalau gagal — balas "kamu tidak punya izin"
  • Diperiksa setiap kali ada tindakan
Kotak luar adalah satu request. Di dalamnya ada dua keputusan, berurutan dari atas. Meski keputusan atas lolos, keputusan bawah masih bisa menolak.

Meski tindakannya dilakukan tanaka yang sama, keduanya diputuskan terpisah.

tanaka yang sama bisa terhenti di autentikasi atau di otorisasi
Buka pemesanantanpa loginSudah login, hapuspemesanan sendiriSudah login, hapuspemesanan orang lainGagalautentikasiLolos autentikasiLolos autentikasiTidak sampaike keputusanPemilik sendiri→ lolosPemilik orang lain→ ditolakLayar loginBerhasil dihapusTidak punya izin
Setiap baris adalah satu tindakan. Dari kiri, tindakan melewati autentikasi lalu otorisasi, dan begitu gagal, layar di sebelah kananlah yang dikembalikan. Baris paling atas tidak pernah sampai ke otorisasi.

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 ketikDi-hash saat itu jugaDibandingkan dengan hash tersimpanHasil
hanabi2026 (benar)a3f9...c1Sama dengan a3f9...c1Login berhasil
hanabi2025 (beda satu karakter)7b20...e4Beda dari a3f9...c1Login gagal
Hanabi2026 (beda huruf besar)d15c...8aBeda dari a3f9...c1Login 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.

Yang disimpan di database dan yang tidak
Database my-app
Satu baris di tabel users (tanaka)
  • email — tanaka@example.com
  • password_hash — a3f9...c1
  • created_at — tanggal dan waktu akun dibuat
Yang tidak ada di baris ini
  • Karakter hanabi2026 yang diketik
  • Data apa pun yang bisa dikembalikan menjadi karakter yang diketik
  • Status apakah pengguna sedang login
Di dalam database my-app. Satu baris milik tanaka hanya berisi alamat email, hash, dan tanggal serta waktu pendaftaran.

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.

Apa yang terjadi berikutnya bergantung pada cocok tidaknya hash
tanaka menekantombol LoginMembandingkanhashCocokTidak cocokBuat catatan,kirim session IDKirim lagilayar login
Satu kali login di sebelah kiri terbagi ke atas atau ke bawah menurut hasil perbandingan. Hanya ketika keduanya cocok, sebuah catatan dibuat di dalam server.

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.

Apa yang dipegang browser dan server masing-masing setelah login
my-app setelah login
Di dalam browser tanaka
  • Cookie: session_id=3f9a1c...e81b
  • Ikut otomatis di setiap request ke situs yang sama
  • Tidak ada yang dipegang selain string ini
Di dalam server
  • Catatan session 3f9a1c...e81b adalah tanaka
  • Catatan ini punya masa berlaku
  • Logout menghapus catatan ini
String yang sama, 3f9a1c...e81b, menghubungkan sisi browser dengan catatan di sisi server. Nama dan izin hanya ada di sisi server.

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.

Hasilnya berubah tergantung apakah nilai Cookie dipercaya begitu saja
is_admin=true(mengaku admin)ikut dikirimPercaya nilaiCookie apa adanyaLayar adminmunculBaca catatandari session_idTetap penggunabiasa
Ketika Cookie yang sudah diubah pengguna tiba. Jalur atas memutuskan dari nilai yang tiba, jalur bawah memutuskan dari catatan di sisi server.

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.

Isi satu JWT yang dititipkan ke browser
Satu string yang ikut dikirim browser setiap kali (JWT)
Isi — milik siapa, dan berlaku sampai kapan
  • ID pengguna milik tanaka
  • Masa berlaku (bisa dipakai sampai waktu ini)
Tanda tangan — nilai yang hanya bisa dibuat server
  • String yang dihitung dari isinya
  • Mengubah isinya membuat hitungannya tidak lagi cocok
Bingkai luar adalah satu string yang dikirim setiap kali. Isinya tersimpan dalam bentuk yang bisa dibaca, dan tanda tangan adalah bagian yang mendeteksi perubahan isi.

Karena ada tanda tangan, server bisa tahu bahwa string yang tiba adalah string yang ia terbitkan sendiri, tanpa mencocokkannya dengan catatan.

AspekMetode sessionJWT
Yang diserahkan saat login berhasilsession_id=3f9a1c...e81beyJhbGci... ID, masa berlaku, dan tanda tangan
Tempat dasar keputusan beradaCatatan di dalam serverIsi di dalam string
Cara memeriksanya setiap kaliCocokkan dengan catatanVerifikasi 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.

QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Ketika server menyimpan password pengguna, apa yang diletakkan di database?

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?