📋 Στόχοι Μαθήματος
Στο τέλος του μαθήματος ο φοιτητής θα μπορεί να:
- Εξηγεί γιατί χρειαζόμαστε cookies και sessions (HTTP είναι stateless)
- Δημιουργεί, διαβάζει και διαγράφει cookies από τον browser
- Χρησιμοποιεί sessions για να αποθηκεύει δεδομένα χρήστη στο server
- Καταλαβαίνει την σχέση cookie ↔ session id
- Γνωρίζει βασικά θέματα ασφάλειας (HttpOnly, Secure, session hijacking)
🌐 1. Το Πρόβλημα: το HTTP είναι Stateless
Το πρωτόκολλο HTTP είναι χωρίς κατάσταση (stateless). Αυτό σημαίνει ότι κάθε αίτημα (request) που στέλνει ο browser στον server αντιμετωπίζεται σαν να είναι το πρώτο!
Τι συμβαίνει στην πράξη:
- Ο server δεν θυμάται ποιος είσαι μεταξύ των requests
- Δεν ξέρει αν έχεις κάνει login
- Δεν γνωρίζει τι έχεις στο καλάθι αγορών
- Δεν μπορεί να θυμάται τις προτιμήσεις σου
Φαντάσου ότι κάνεις login σε ένα e-shop. Χωρίς κάποιον τρόπο "μνήμης", κάθε φορά που θα πηγαίνεις σε νέα σελίδα, θα έπρεπε να ξανακάνεις login! Αυτό θα ήταν εντελώς απαράδεκτο για τον χρήστη.
ΑΛλΑ στις πραγματικές εφαρμογές θέλουμε:
- ✅ Να κρατάμε τον χρήστη συνδεδεμένο (login state)
- ✅ Να θυμόμαστε προτιμήσεις (γλώσσα, theme, font size)
- ✅ Να κρατάμε καλάθι αγορών
- ✅ Να αποθηκεύουμε ιστορικό περιήγησης
Εκεί μπαίνουν στο παιχνίδι τα Cookies, τα Sessions και τα Tokens! 🍪🔑
🔐 Authentication στο Web
Authentication είναι η διαδικασία με την οποία μια εφαρμογή επιβεβαιώνει ποιος είσαι, συνήθως με login (username + password).
🧠 Πρώτο βασικό concept: Stateful vs Stateless
🟦 Stateful Server
Ο server σε θυμάται μετά το login.
Κρατά πληροφορίες για τον χρήστη (session).
Πας σε εστιατόριο, ο σερβιτόρος θυμάται τι έχεις παραγγείλει στο τραπέζι σου.
✔ Σε θυμάται → Stateful
🟨 Stateless Server
Ο server δεν θυμάται τίποτα για εσένα.
Πρέπει κάθε φορά να του αποδεικνύεις ποιος είσαι.
Πας σε fast-food στο ταμείο και κάθε φορά πληρώνεις/δείχνεις απόδειξη. Ο υπάλληλος δεν σε θυμάται.
✔ Δεν σε θυμάται → Stateless
🔐 Οι 3 βασικές μέθοδοι Authentication
📌 Πώς λειτουργεί:
Σε κάθε request στέλνονται username + password σε HTTP Header:
✔ Πλεονεκτήματα:
- Πολύ απλό
- Δεν χρειάζεται session storage
- Δεν χρειάζεται cookies
❌ Μειονεκτήματα:
- Στέλνεις συνεχώς τον κωδικό → επικίνδυνο χωρίς HTTPS
- Δύσκολο πραγματικό logout (απλά σταματάς να στέλνεις το password)
📌 Δεν θυμάται τίποτα → Stateless
📌 Πώς λειτουργεί:
- Ο χρήστης κάνει login
- Ο server αποθηκεύει πληροφορίες του χρήστη σε session
- Στέλνει στον browser ένα cookie με session ID
- Σε κάθε request, ο browser στέλνει το cookie
- Ο server βλέπει το session ID και θυμάται τον χρήστη
✔ Πλεονεκτήματα:
- Ασφαλές, δεν φαίνονται στοιχεία στο cookie
- Logout = πολύ εύκολο (σβήνουμε session στον server)
- Ιδανικό για web εφαρμογές (sites)
❌ Μειονεκτήματα:
- Ο server πρέπει να αποθηκεύει sessions (εξτρά μνήμη)
- Συχνά απαιτείται read στη βάση/Redis σε κάθε request για να φορτωθεί το session
- Για scaling, χρειάζεται shared session store (π.χ. Redis)
📌 Ο server σε θυμάται → Stateful
📌 Πώς λειτουργεί:
- Κάνεις login
- Ο server δημιουργεί JWT (token)
- Ο client το αποθηκεύει (localStorage, cookie κτλ.)
- Σε κάθε request στέλνεται:
📌 Ο server δεν αποθηκεύει session. Απλά ελέγχει το token → Stateless
✔ Πλεονεκτήματα:
- Δεν χρειάζεται μνήμη στον server
- Δεν χρειάζεται read στη βάση κάθε φορά
- Ιδανικό για APIs, mobile apps, microservices
- Πολύ καλό για horizontal scaling
❌ Μειονεκτήματα:
- Αν κλαπεί το token, ισχύει μέχρι να λήξει
- Πραγματικό logout (invalidate) είναι δύσκολο → θέλει blacklist στον server
- Αν χρησιμοποιήσουμε blacklist → γίνεται Stateful
🔄 Ροή Token Authentication με Access & Refresh Tokens
- Stateful: Ο server σε θυμάται (Sessions)
- Stateless: Κάθε φορά του δείχνεις token για να αποδείξεις ποιος είσαι (JWT)
📦 Λιγότερα δεδομένα → πιο ελαφρύ
Το basic auth header έχει περίπου:
Που συνήθως είναι αρκετά bytes (ανάλογα το username/password). Το session id είναι συνήθως ένα fixed-length random string, π.χ.:
2–3 φορές μικρότερο σε μέγεθος και ελαφρύτερο στην επεξεργασία.
🍪 2. Cookies
2.1 Τι είναι ένα Cookie;
Ένα cookie είναι ένα μικρό κομμάτι δεδομένων (key-value pair) που:
- Αποθηκεύεται στον browser του χρήστη
- Συνδέεται με ένα συγκεκριμένο domain (π.χ. example.com)
- Αποστέλλεται αυτόματα σε κάθε request προς αυτό το domain
- Έχει μέγιστο μέγεθος περίπου 4KB ανά cookie
📊 Πώς λειτουργεί η ροή ενός Cookie:
Set-Cookie: theme=dark; Path=/; Max-Age=3600
Cookie: theme=dark
2.2 Χρήσεις των Cookies
- Αποθήκευση προτιμήσεων: γλώσσα, theme, μέγεθος γραμματοσειράς
- "Remember me" login: για να μένεις συνδεδεμένος (με προσοχή!)
- Παρακολούθηση (tracking): analytics, διαφημίσεις
- Καλάθι αγορών: σε απλές περιπτώσεις
2.3 Βασικές Ιδιότητες ενός Cookie
| Ιδιότητα | Περιγραφή | Παράδειγμα |
|---|---|---|
| name=value | Το όνομα και η τιμή του cookie | theme=dark |
| Max-Age | Πόσα δευτερόλεπτα θα ζήσει το cookie | Max-Age=3600 (1 ώρα) |
| Expires | Συγκεκριμένη ημερομηνία λήξης | Expires=Wed, 01 Jan 2025 00:00:00 GMT |
| Path | Σε ποιο μονοπάτι ισχύει το cookie | Path=/shop |
| Domain | Για ποιο domain ισχύει | Domain=.example.com |
| Secure | Στέλνεται μόνο μέσω HTTPS | Secure |
| HttpOnly | Όχι προσβάσιμο από JavaScript | HttpOnly |
Αν δεν δώσουμε Max-Age ή Expires, το cookie είναι session cookie και διαγράφεται όταν κλείσει ο browser!
Ασφάλεια με HttpOnly και Secure:
- HttpOnly: Προστατεύει από XSS attacks - το JavaScript δεν μπορεί να διαβάσει το cookie με
document.cookie - Secure: Το cookie στέλνεται μόνο μέσω HTTPS, όχι HTTP - προστατεύει από man-in-the-middle attacks
💻 3. Παραδείγματα Χρήσης Cookies στην PHP
3.1 Δημιουργία Cookie
🔎 Τι είναι το $_COOKIE στην PHP;
- Είναι μια ειδική μεταβλητή (πίνακας) που δίνει στην PHP τα cookies του browser.
- Τα cookies τα στέλνει ο browser από τον χρήστη προς τον server.
- Έτσι η PHP μπορεί να διαβάζει πληροφορίες που έχει αποθηκεύσει ο ίδιος ο browser (π.χ. θέμα, γλώσσα, login session).
🔎 Πώς το χρησιμοποιούμε;
Παίρνουμε ένα cookie έτσι:
3.2 Ανάγνωση Cookie read_cookie.php
3.3 Ενημέρωση Cookie
3.4 Διαγραφή Cookie
Όταν διαγράφεις ένα cookie, βεβαιώσου ότι χρησιμοποιείς το ίδιο path και domain που χρησιμοποιήθηκε κατά τη δημιουργία του!
3.5 Απλό Παράδειγμα Δημιουργίας Cookie (PHP)
👉 Δημιουργεί cookie και το εμφανίζει.
📌 Αποθήκευσε το ως cookie_test.php
- Την πρώτη φορά που φορτώνεις τη σελίδα, το cookie δημιουργείται, αλλά δεν εμφανίζεται ακόμα.
- Κάνε Refresh (F5) → τώρα εμφανίζεται το cookie.
- Δες το cookie στον browser: Inspect → Application → Cookies → localhost
- Πώς δημιουργείται cookie (
setcookie) - Πώς διαβάζεται (
$_COOKIE["username"]) - Γιατί χρειάζεται refresh (ο browser πρώτα το αποθηκεύει, μετά το στέλνει στο 2ο request)
3.6 Απλό Παράδειγμα Login με Cookies
Ένα απλό παράδειγμα login με cookies σε PHP, βήμα–βήμα, χωρίς βάση δεδομένων, μόνο για να καταλάβεις τη λογική.
Αυτό το παράδειγμα είναι μόνο για εκπαιδευτικούς σκοπούς. Στην πράξη χρησιμοποιούμε Sessions για login.
Θα έχουμε 4 αρχεία:
- 1️⃣
login.php→ φόρμα login - 2️⃣
check.php→ έλεγχος στοιχείων & δημιουργία cookie - 3️⃣
dashboard.php→ προστατευμένη σελίδα με έλεγχο cookie - 4️⃣
logout.php→ αποσύνδεση
✅ 1️⃣ login.php (Η φόρμα)
header() στην PHP;
Η header() είναι εντολή της PHP που στέλνει εντολές στον browser μέσω των HTTP headers.
Με απλά λόγια: 👉 Λες στον browser να κάνει κάτι πριν καν φορτώσει η σελίδα.
Αυτό σημαίνει: 🟢 «Browser, πήγαινε αυτόματα στη σελίδα dashboard.php».
👉 Είναι ανακατεύθυνση (redirect). Χωρίς να πατήσει τίποτα ο χρήστης.
✅ 2️⃣ check.php (Έλεγχος & δημιουργία cookie)
✅ 3️⃣ dashboard.php (Σελίδα που απαιτεί login)
✅ 4️⃣ logout.php (Καταστροφή cookie)
🔥 Πώς δουλεύει με απλά λόγια:
| Βήμα | Τι γίνεται |
|---|---|
| 1 | Ο χρήστης κάνει login |
| 2 | Αν τα στοιχεία είναι σωστά → δημιουργείται cookie |
| 3 | Το dashboard.php ελέγχει αν υπάρχει cookie |
| 4 | Αν δεν υπάρχει → επιστροφή στο login |
| 5 | Στο logout → διαγράφεται το cookie |
🎯 4. Sessions
Τα sessions λύνουν το πρόβλημα της "κατάστασης" πιο ασφαλώς από το να αποθηκεύουμε τα πάντα σε cookies.
4.1 Τι είναι ένα Session;
Ένα session είναι "κατάσταση χρήστη" που αποθηκεύεται στον server, όχι στον browser!
- Ο browser κρατάει μόνο ένα session ID (συνήθως σε cookie)
- Στον server υπάρχει μια αποθήκη που συνδέει:
session_id → {user_data} - Τα δεδομένα είναι πιο ασφαλή γιατί δεν φαίνονται στον client
📊 Πώς λειτουργεί η ροή ενός Session:
Ο server δημιουργεί νέο session ID (π.χ. "abc123xyz")
Set-Cookie: PHPSESSID=abc123xyz; HttpOnly; Secure
Cookie: PHPSESSID=abc123xyz
τα δεδομένα του χρήστη (username, cart, preferences κλπ)
4.2 Πώς συνδέεται με τα Cookies;
Cookie: Αποθηκεύεται στον browser, περιέχει μόνο το session ID (π.χ. PHPSESSID=abc123)
Session: Αποθηκεύεται στον server, περιέχει όλα τα δεδομένα του χρήστη
Το cookie χρησιμεύει ως "κλειδί" για να βρει ο server τα δεδομένα του session!
| Που αποθηκεύεται; | Τι περιέχει; | Ασφάλεια |
|---|---|---|
| Cookie (PHPSESSID) | Μόνο το session ID | Χαμηλός κίνδυνος (είναι random string) |
| Session (server) | Όλα τα δεδομένα χρήστη | Πιο ασφαλές (δεν φαίνεται στον client) |
💻 5. Πλήρες Σύστημα Login με MySQL και Sessions
Θα δημιουργήσουμε ένα ολοκληρωμένο σύστημα εγγραφής και σύνδεσης χρηστών με βάση δεδομένων MySQL.
🔧 5.1 Βάση Δεδομένων (MySQL)
🔧 5.2 config.php – Σύνδεση στη βάση
- Το κάνουμε
requireσε όλα τα PHP αρχεία - Μας δίνει έτοιμο το
$connγια queries
📝 5.3 register.php – Φόρμα εγγραφής
🧾 5.4 register_process.php – Εγγραφή στη βάση
🔐 5.5 login.php – Φόρμα σύνδεσης
✅ 5.6 login_process.php – Έλεγχος login + session
🏠 5.7 dashboard.php – Προστατευμένη σελίδα
🚪 5.8 logout.php – Αποσύνδεση
user_id και username στα cookies;
Αυτές οι γραμμές:
ΔΕΝ φτιάχνουν cookies. Φτιάχνουν δεδομένα μέσα στο $_SESSION, που είναι:
- μια μεταβλητή της PHP στον server
- και ΟΧΙ cookie στον browser
Με απλά λόγια:
- Τα δεδομένα
$_SESSION['user_id']και$_SESSION['username']αποθηκεύονται στον server (συνήθως σε αρχεία τύπουsess_κάτι) - Ο browser σου βλέπει ΜΟΝΟ ένα cookie, συνήθως με όνομα:
PHPSESSID
Αυτό είναι απλά ένα ID, π.χ.:
Με αυτό το ID, ο server βρίσκει τα δεδομένα του $_SESSION που έχει κρατήσει για σένα.
👉 Άρα ΔΕΝ θα δεις ποτέ user_id και username στα cookies. Θα δεις μόνο PHPSESSID.
✅ Τι πρέπει να θυμάσαι από όλο αυτό:
- ✅ Οι χρήστες αποθηκεύονται στη MySQL
- ✅ Οι κωδικοί αποθηκεύονται ΜΟΝΟ σαν hash (
password_hash) - ✅ Το login γίνεται με: έλεγχο στη βάση +
password_verify - ✅ Το login state αποθηκεύεται στη
$_SESSION - ✅ Το dashboard προστατεύεται με:
if (!isset($_SESSION['user_id'])) - ✅ Το logout διαγράφει πλήρως το session
✅ Τέλος Μαθήματος 9 & 10
Cookies και Sessions - Login με MySQL και Sessions
Πανεπιστήμιο Πελοποννήσου - Τμήμα Ψηφιακών Συστημάτων
Μπάρδης Γιώργος