Autentikacija je provjera identiteta korisnika, odnosno potvrđivanje da je on doista onaj za koga se predstavlja.
Najčešći način ostvarivanja autentikacije je pomoću korisničkog imena i lozinke. K
orisnik se predstavlja svojim korisničkim imenom, dok se provjera je li to stvarno on izvršava pomoću lozinke.
Pri prvom pristupanju korisnika aplikaciji, od korisnika se traži unos korisničkog imena i lozinke. Nakon toga se provjerava postoji li korisnik s tim korisničkim imenom i tom lozinkom u bazi podataka. Ako ne postoji, pristup ostatku aplikacije mu se onemogućuje dok ne upiše točno ime i lozinku. (Dozvoljeni broj pokušaja upisivanja imena i lozinke se često ograničava.)
Ako je korisnik upisao odgovarajuće ime i lozinku, omogućit će mu se pristup ostatku aplikacije.
Na ovom mjestu će se najčešće, korištenjem varijable sjednice, zapisati da je autentikacija korisnika izvršena.
Zahvaljujući tome, korisnik neće morati ponovno upisivati lozinku prilikom svakog novog zahtjeva.
Kad sjednica istekne, korisnik će se morati ponovno autenticirati upisivanjem korisničkog imena i lozinke.
Postavlja se pitanje je li moguće da korisnik podastre lažni identifikator sjednice (koji može promijeniti izmjenom kolačića ili URL-a) i na taj način se predstavi kao već autenticirani korisnik. Ta je mogućnost matematički vrlo malo vjerojatna, zato što svaka PHP sjednica dobiva nasumični identifikator, koji se zatim enkriptira.
I lozinke se u bazi podataka često drže u kriptiranom obliku, da netko tko ima pristup bazi ne bi mogao preuzeti lozinke drugih korisnika.
Za enkripciju lozinki, (kao i identifikatora sjednice), koristi se posebna metoda enkripcije – izračunavanje sažetka poruke (message digest, hash) koja je jednosmjerna.
To znači da se iz zapisa u bazi ne može dobiti originalna lozinka, ali se iz lozinke može lako dobiti njen enkriptirani oblik i tako provjeriti je li upisana lozinka točna.
Jedan od nedostataka HTTP protokola je taj što se između dva zahtjeva ne čuva trenutno stanje.
Kad stigne novi zahtjev, poslužitelj ne zna da je on stigao od istog korisnika kao i prethodni zahtjev i da se nastavlja na prethodne korisnikove akcije.
Da bi se moglo pratiti pojedinog korisnika, za svakog korisnika se stvara sjednica.
Sjednica započinje spajanjem korisnika (klijenta) na poslužitelj, a završava njegovim odlaskom (nakon što protekne određeno vrijeme, najčešće 30 minuta od njegove zadnje akcije).
Jedan od načina za ostvarivanje sjednica je korištenje kolačića.
Kolačić je kratak niz tekstualnih podataka koji razmjenjuju poslužitelj i klijent unutar zaglavlja HTTP zahtjeva i odgovora.
Razmjena podataka pomoću kolačića teče ovako:
Kolačići se često koriste tako da se unutar kolačića zapisuje identifikator koji dobiva korisnik (odnosno identifikator sjednice između klijenta i poslužitelja).
Na taj način, kad klijent u sljedećem zahtjevu pošalje isti identifikator natrag, poslužitelj zna da je riječ o istom korisniku.
Kolačići se također koriste i za spremanje raznih korisničkih postavki (npr. odabir jezika stranica koje će se pretraživati kod tražilice Google), tako da se sljedeći put kad korisnik posjeti istu stranicu, primjenjuju postavke koje je odabrao prošli put.
Za slanje kolačića u PHP-u koristi se funkcija setcookie.
Argumenti koje ona prima su:
Primjer slanja kolačića pomoću funkcije setcookie:
<?php
setcookie("korisnik", "Ivica Ivić");
?>
Pri slanju zahtjeva na poslužitelj, klijent će poslati i sve kolačiće čija domena i putanja odgovaraju URL-u poslužitelja.
Kolačićima koje klijent šalje poslužitelj može pristupiti preko globalno dostupnog polja $_COOKIE.
Ovako bi poslužitelj pristupio kolačiću čiji je naziv "korisnik":
<?php
$kupac = $_COOKIE["korisnik"];
echo $kupac;
?>
Poslužitelj ostvaruje sjednicu (spoj, sesiju) s pojedinim klijentom kao niz HTTP zahtjeva i odgovora između njih.
Svaka sjednica dobiva svoj jedinstveni identifikator, na temelju kojega se prepoznaje da pojedini zahtjevi pripadaju točno određenoj sjednici.
Identifikator sjednice se stvara na poslužitelju, i šalje klijentu unutar HTTP odgovora. Klijent ga potom prosljeđuje natrag prilikom svakog sljedećeg zahtjeva.
Sjednica će trajati sve dok stižu zahtjevi klijenta. Ako od posljednjeg zahtjeva protekne određeno vrijeme (u PHP-u je predefinirana vrijednost tog vremena 30 minuta), sjednica će se automatski zatvoriti.
Osnovni način za prosljeđivanje identifikatora sjednice i njegovo čuvanje na klijentskom računalu su kolačići.
Ako su kolačići onemogućeni ili nisu podrţani u korisnikovom web pregledniku, identifikator sjednice će se prosljeđivati preko URL-a.
Primjer takvog URL-a:
http://www.fondovieu.eu?PHPSESSID=242c489fb4a1bc79f5cf365988167e4d
Sjednice se mogu upotrijebiti za spremanje podataka koji su vezani za sjednicu, dakle za pojedinog korisnika.
Takvi podaci spremaju se u varijable sjednice koje će biti vidljive samo za tog korisnika i trajat će samo dok traje i sjednica.
Varijablama sjednica pristupa se preko globalno dostupnog polja $_SESSION.
Stvaranje nove varijable sjednice je zapravo dodavanje novog člana u polje $_SESSION:
<?php
$_SESSION["korisnik"] = $imeKorisnika;
?>
Čitanje vrijednosti varijable sjednice je pristupanje članu polja $_SESSION pomoću odgovarajućeg znakovnog ključa:
<?php
if (isset($_SESSION["korisnik"])){
echo $_SESSION["korisnik"];
}
?>
Za provjeru je li neka varijabla sjednice stvorena ili ne, može se koristiti funkcija isset.
Varijable sjednice čuvaju se na poslužitelju. Preko identifikatora sjednice, moguće je pristupiti varijablama koje pripadaju odgovarajućoj sjednici.
Varijable sjednice će za svakog korisnika sadržavati različite vrijednosti.
Uz podatke poslane unutar URL-a (metodom GET) ili preko obrasca (metodom POST), korištenje varijabli sjednice je još jedan način čuvanja podataka između dva HTTP zahtjeva.
Za započinjanje sjednice, potrebno je pozvati funkciju session_start.
Funkcija ne prima nijedan argument i uvijek vraća vrijednost TRUE.
Čak i ako je sjednica već započeta, funkciju session_start potrebno je pozvati na početku svake skripte koja koristi varijable sjednice, jer se, kad se ona pozove, varijable sjednice učitavaju u polje $_SESSION.
<?php
session_start();
?>
Sjednica će se automatski zatvoriti nakon što protekne zadani vremenski rok od posljednjeg zahtjeva klijenta.
No, sjednicu je moguće i prije zatvoriti, upotrebom funkcije session_destroy.
Ova funkcija također ne prima nijedan argument i uvijek vraća vrijednost TRUE:
<?php
session_destroy();
?>
Nakon poziva ove funkcije, vrijednosti svih varijabli sjednice bit će izgubljene.