Μπισκότα μέσα JavaΣενάριο: Ορισμός, λήψη και διαγραφή παραδείγματος

⚡ Έξυπνη Σύνοψη

Μπισκότα μέσα JavaΤα σενάρια αποθηκεύουν μικρά ζεύγη κλειδιών και τιμών στον υπολογιστή του επισκέπτη, έτσι ώστε μια σύνδεση HTTP χωρίς κατάσταση να μπορεί να θυμάται πληροφορίες. Αυτό το άρθρο εξηγεί πώς να ορίσετε, να διαβάσετε και να διαγράψετε cookies, περιγράφει κάθε χαρακτηριστικό cookie και συγκρίνει τα cookies με εναλλακτικές λύσεις αποθήκευσης του προγράμματος περιήγησης.

  • 🍪 Βασικός Ορισμός: Ένα cookie είναι ένα ζεύγος κλειδιού και τιμής που αποθηκεύεται από το πρόγραμμα περιήγησης και επιστρέφεται αυτόματα με κάθε αντίστοιχο αίτημα.
  • ✍️ Γράφω Operation: Η αντιστοίχιση στο document.cookie προσθέτει ή αντικαθιστά ένα cookie κάθε φορά και δεν διαγράφει ποτέ τα υπόλοιπα.
  • 📖 Διάβασε Operation: Η ανάγνωση του document.cookie επιστρέφει συμβολοσειρά διαχωρισμένη με ένα ερωτηματικό, επομένως το απαιτούμενο ζεύγος πρέπει να διαχωριστεί χειροκίνητα.
  • 🗑️ Διαγραφή Operation: Ο ορισμός μιας ημερομηνίας λήξης στο παρελθόν καταργεί ένα cookie και η διαδρομή και ο τομέας πρέπει να αντιστοιχούν στις αρχικές τιμές.
  • 🔐 Χαρακτηριστικά ασφαλείας: Η επιλογή Secure περιορίζει τη μετάδοση σε HTTPS, η επιλογή HttpOnly αποκλείει την πρόσβαση σε σενάρια και η επιλογή SameSite ελέγχει την αποστολή μεταξύ τοποθεσιών.
  • 📏 Όρια μεγέθους: Κάθε cookie περιέχει περίπου 4 KB και τα προγράμματα περιήγησης διατηρούν περίπου 50 cookies ανά τομέα, επομένως τα μεγάλα δεδομένα ανήκουν αλλού.
  • 💾 Εναλλακτικές λύσεις αποθήκευσης: Τα localStorage και sessionStorage διατηρούν περισσότερα δεδομένα και δεν συνδέονται ποτέ με αιτήματα δικτύου.

Μπισκότα μέσα JavaΓραφή

Τι είναι τα Cookies;

Ένα cookie είναι ένα αρχείο δεδομένων που αποθηκεύεται στον υπολογιστή σας και είναι προσβάσιμο από το πρόγραμμα περιήγησής σας. Μπορεί επίσης να έχετε απολαύσει τα οφέλη των cookies, εν γνώσει σας ή εν αγνοία σας. Έχετε παραμείνει ποτέ συνδεδεμένοι σε έναν ιστότοπο όπως το Facebook, ώστε να μην χρειάζεται να πληκτρολογείτε τα στοιχεία σας κάθε φορά που προσπαθείτε να συνδεθείτε; Εάν ναι, τότε χρησιμοποιείτε cookies. Τα cookies αποθηκεύονται ως ζεύγη κλειδιού/τιμής.

Μια σημαντική διευκρίνιση: ένα cookie δεν περιέχει τον κωδικό πρόσβασής σας. Περιέχει ένα αναγνωριστικό περιόδου σύνδεσης, το οποίο είναι ένα τυχαίο διακριτικό που εκδίδει ο διακομιστής μετά από μια επιτυχημένη σύνδεση. Ο διακομιστής αντιστοιχίζει αυτό το διακριτικό με τον λογαριασμό σας, επομένως ο ίδιος ο κωδικός πρόσβασης δεν φεύγει ποτέ από τον διακομιστή.

Γιατί χρειάζεστε ένα Cookie;

Η επικοινωνία μεταξύ α πρόγραμμα περιήγησης στο Web και διακομιστή γίνεται χρησιμοποιώντας ένα πρωτόκολλο χωρίς κατάσταση που ονομάζεται HTTP. Ένα πρωτόκολλο χωρίς κατάσταση αντιμετωπίζει κάθε αίτημα ανεξάρτητα. Έτσι, ο διακομιστής δεν διατηρεί τα δεδομένα μετά την αποστολή τους στο πρόγραμμα περιήγησης. Αλλά σε πολλές περιπτώσεις, τα δεδομένα θα απαιτηθούν ξανά. Εδώ έρχονται τα cookies στο προσκήνιο. Με τα cookies, το πρόγραμμα περιήγησης ιστού δεν θα χρειάζεται να επικοινωνεί με τον διακομιστή κάθε φορά που απαιτούνται τα δεδομένα. Αντίθετα, μπορούν να ανακτηθούν απευθείας από τον υπολογιστή.

Τυπικές χρήσεις περιλαμβάνουν την απομνημόνευση μιας συνεδρίας σύνδεσης, την αποθήκευση μιας προτίμησης γλώσσας ή θέματος, τη διατήρησηping αντικείμενα σε ένα κατάστημαping καλάθι αγορών μεταξύ σελίδων και καταμέτρηση των επισκεπτών που επισκέπτονται για πρώτη φορά έναντι των επισκεπτών που επιστρέφουν.

Javascript Ρύθμιση cookie

Μπορείτε να δημιουργήσετε cookies χρησιμοποιώντας την ιδιότητα document.cookie ως εξής.

document.cookie = "cookiename=cookievalue"

Μπορείτε ακόμη και να προσθέσετε μια ημερομηνία λήξης στο cookie σας, έτσι ώστε το συγκεκριμένο cookie να αφαιρεθεί από τον υπολογιστή την καθορισμένη ημερομηνία. Η ημερομηνία λήξης θα πρέπει να οριστεί σε μορφή UTC/GMT. Εάν δεν ορίσετε την ημερομηνία λήξης, το cookie θα αφαιρεθεί όταν ο χρήστης κλείσει το πρόγραμμα περιήγησης.

document.cookie = "cookiename=cookievalue; expires= Thu, 21 Aug 2031 20:00:00 UTC"

Μπορείτε επίσης να ορίσετε τον τομέα και τη διαδρομή για να καθορίσετε σε ποιον τομέα και σε ποιους καταλόγους στον συγκεκριμένο τομέα ανήκει το cookie. Από προεπιλογή, ένα cookie ανήκει στη σελίδα που ορίζει το cookie.

document.cookie = "cookiename=cookievalue; expires= Thu, 21 Aug 2031 20:00:00 UTC; path=/ "

//δημιουργία ενός cookie με έναν τομέα της τρέχουσας σελίδας και μια διαδρομή που καλύπτει ολόκληρο τον τομέα.

⚠️ Προειδοποίηση: Η ημερομηνία λήξης πρέπει να είναι μελλοντική. Μια ημερομηνία που έχει ήδη παρέλθει δίνει εντολή στο πρόγραμμα περιήγησης να διαγράψει αμέσως το cookie, η οποία είναι ακριβώς η τεχνική που χρησιμοποιείται στην παρακάτω ενότητα διαγραφής.

JavaΣενάριο Λήψη Cookie

Μπορείτε να αποκτήσετε πρόσβαση στο cookie ως εξής, το οποίο θα επιστρέψει όλα τα cookies που έχουν αποθηκευτεί για τον τρέχοντα τομέα.

var x =  document.cookie

Η τιμή που επιστρέφεται είναι μια μεμονωμένη συμβολοσειρά στη μορφή name1=value1; name2=value2Δεν υπάρχει ενσωματωμένη μέθοδος για την ανάγνωση ενός cookie με βάση το όνομα, επομένως η συμβολοσειρά πρέπει να διαιρεθεί. Ο παρακάτω βοηθός επιστρέφει μία μόνο τιμή και μια κενή συμβολοσειρά όταν το όνομα απουσιάζει.

function getCookie(name) {
    const pairs = document.cookie.split(";");
    for (let i = 0; i < pairs.length; i++) {
        const pair = pairs[i].trim();
        if (pair.indexOf(name + "=") === 0) {
            // decode in case the value contained spaces or symbols
            return decodeURIComponent(pair.substring(name.length + 1));
        }
    }
    return "";
}

document.cookie = "username=Ann Smith; path=/";
console.log(getCookie("username"));
console.log(getCookie("missing") === "");

Παραγωγή:

Ann Smith
true

JavaΣενάριο Διαγραφή Cookie

Για να διαγράψετε ένα cookie, απλώς πρέπει να ορίσετε την τιμή του cookie σε empty και να ορίσετε την τιμή expires σε μια ημερομηνία που έχει ήδη παρέλθει.

document.cookie = "cookiename= ; expires = Thu, 01 Jan 1970 00:00:00 GMT"

Μία λεπτομέρεια προκαλεί τις περισσότερες αποτυχημένες διαγραφές. Το πρόγραμμα περιήγησης αναγνωρίζει ένα cookie από το όνομά του μαζί με τη διαδρομή και τον τομέα του, επομένως η δήλωση διαγραφής πρέπει να επαναλαμβάνει την ίδια διαδρομή και τον τομέα που χρησιμοποιήθηκαν κατά τη δημιουργία του cookie.

// created with an explicit path
document.cookie = "theme=dark; path=/; max-age=2592000";

// deletion must repeat that same path
document.cookie = "theme=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT";

// max-age=0 achieves the same result in one shorter line
document.cookie = "theme=; path=/; max-age=0";

Επεξήγηση χαρακτηριστικών cookie

Κάθε χαρακτηριστικό μετά το πρώτο ερωτηματικό αλλάζει τη διάρκεια ζωής του cookie, ποια αιτήματα το μεταφέρουν και ποιος κώδικας μπορεί να το διαβάσει. Η παρακάτω αναφορά καλύπτει όλα αυτά.

Χαρακτηριστικό Σκοπός Παράδειγμα
λήγει Ημερομηνία απόλυτης διαγραφής σε μορφή UTC λήγει=Πέμ, 21 Αυγ 2031 20:00:00 UTC
μέγιστη ηλικία Διάρκεια ζωής σε δευτερόλεπτα μετρημένη από τώρα μέγιστη ηλικία = 2592000
μονοπάτι Εμβέλεια καταλόγου εντός του τομέα διαδρομή=/
τομέα Εύρος κεντρικού υπολογιστή, συμπεριλαμβανομένων των υποτομέων τομέας=example.com
προστασία Αποστέλλεται μόνο μέσω σύνδεσης HTTPS προστασία
HttpOnly Κρυφό από το document.cookie, ορίστηκε μόνο από τον διακομιστή HttpOnly
Ίδιος ιστότοπος Έλεγχος αποστολής αιτημάτων μεταξύ ιστότοπων SameSite=Lax

Το SameSite αξίζει ιδιαίτερης προσοχής επειδή τα προγράμματα περιήγησης εφαρμόζουν πλέον μια προεπιλογή. Οι τρεις αποδεκτές τιμές συμπεριφέρονται ως εξής.

  • Αυστηρός: Το cookie δεν αποστέλλεται ποτέ όταν το αίτημα προέρχεται από άλλον ιστότοπο, κάτι που αποτελεί την ασφαλέστερη ρύθμιση για τραπεζικές συνεδρίες.
  • Αμελής: Το cookie ταξιδεύει με πλοήγηση ανώτατου επιπέδου, όπως κάνοντας κλικ σε έναν σύνδεσμο, αλλά όχι με εικόνες ή πλαίσια μεταξύ ιστότοπων. Αυτή είναι η προεπιλογή του σύγχρονου προγράμματος περιήγησης.
  • Κανένα: Το cookie αποστέλλεται σε κάθε αίτημα μεταξύ ιστότοπων και πρέπει να αντιστοιχιστεί με το χαρακτηριστικό Secure, διαφορετικά το πρόγραμμα περιήγησης το απορρίπτει.
// a well configured cookie set from client side script
document.cookie = "language=en; path=/; max-age=31536000; SameSite=Lax; Secure";

💡 Συμβουλές: Το χαρακτηριστικό HttpOnly δεν μπορεί να εφαρμοστεί από JavaΣκριπτ, εκ κατασκευής. Μόνο μια κεφαλίδα απόκρισης διακομιστή μπορεί να το ορίσει και αυτό προστατεύει τα cookies περιόδου σύνδεσης από επιθέσεις scripting μεταξύ ιστότοπων.

Δοκιμάστε αυτό το Παράδειγμα μόνοι σας

Το παρακάτω σενάριο συνδυάζει και τις τρεις λειτουργίες. Δημιουργεί ένα cookie με ημερομηνία λήξης που μετριέται σε ημέρες, το διαβάζει ξανά ονομαστικά και χαιρετά έναν επισκέπτη που επιστρέφει. Ειδικές οδηγίες για να λειτουργήσει ο κώδικας… Πατήστε το κουμπί εκτέλεσης δύο φορές.

<html>
<head>
	<title>Cookie!!!</title>
	<script type="text/javascript">
		function createCookie(cookieName,cookieValue,daysToExpire)
        {
          var date = new Date();
          date.setTime(date.getTime()+(daysToExpire*24*60*60*1000));
          document.cookie = cookieName + "=" + cookieValue + "; expires=" + date.toGMTString();
        }
		function accessCookie(cookieName)
        {
          var name = cookieName + "=";
          var allCookieArray = document.cookie.split(';');
          for(var i=0; i<allCookieArray.length; i++)
          {
            var temp = allCookieArray[i].trim();
            if (temp.indexOf(name)==0)
            return temp.substring(name.length,temp.length);
       	  }
        	return "";
        }
		function checkCookie()
        {
          var user = accessCookie("testCookie");
          if (user!="")
        	alert("Welcome Back " + user + "!!!");
          else
          {
            user = prompt("Please enter your name");
            num = prompt("How many days you want to store your name on your computer?");
            if (user!="" && user!=null)
            {
            createCookie("testCookie", user, num);
            }
          }
        }
	</script>
</head>
<body onload="checkCookie()"></body>
</html>

Αναμενόμενη συμπεριφορά:

First run  : "Please enter your name"  -> Ann
             "How many days you want to store your name on your computer?" -> 5
Second run : alert box shows  Welcome Back Ann!!!

Code εξήγηση: Η συνάρτηση createCookie μετατρέπει έναν αριθμό ημερών σε χιλιοστά του δευτερολέπτου και τις προσθέτει στην τρέχουσα ώρα, η οποία παράγει την ημερομηνία λήξης. Η συνάρτηση accessCookie διαιρεί τη συμβολοσειρά cookie σε ερωτηματικά, περικόπτει κάθε τμήμα και συγκρίνει την αρχή του τμήματος με το ζητούμενο όνομα. Η συνάρτηση checkCookie συνδέει τα δύο μεταξύ τους κατά τη φόρτωση της σελίδας.

⚠️ Προειδοποίηση: Το παράδειγμα χρησιμοποιεί toGMTString(), το οποίο είναι ένα παρωχημένο ψευδώνυμο. Ο νέος κώδικας θα πρέπει να καλεί toUTCString() αντίθετα, καθώς η παρωχημένη μορφή ενδέχεται τελικά να καταργηθεί από τα προγράμματα περιήγησης.

Cookies vs localStorage vs sessionStorage

Τα cookies δεν είναι το μόνο μέρος όπου ένα πρόγραμμα περιήγησης μπορεί να αποθηκεύσει δεδομένα. Υπάρχουν δύο επιλογές αποθήκευσης ιστού και η σωστή επιλογή αποτρέπει την αποστολή περιττών byte σε κάθε αίτημα.

Χαρακτηριστικό Cookie τοπική αποθήκευση Αποθήκευση συνεδρίας
Χωρητικότητα Περίπου 4 KB Περίπου 5 MB Περίπου 5 MB
Απεστάλη στον διακομιστή Ναι, με κάθε αντίστοιχο αίτημα Οχι Οχι
Διάρκεια ζωής Μέχρι την ημερομηνία λήξης Μέχρι να αφαιρεθεί ρητά Μέχρι να κλείσει η καρτέλα
Ο διακομιστής μπορεί να το γράψει Ναι Οχι Οχι
Προσβάσιμο σε καρτέλες Ναι Ναι Οχι
Τυπική χρήση Συνεδρίες και έλεγχος ταυτότητας Προτιμήσεις και δεδομένα στην προσωρινή μνήμη Κατάσταση φόρμας μίας επίσκεψης

Ο πρακτικός κανόνας είναι απλός. Εάν ο διακομιστής χρειάζεται την τιμή, χρησιμοποιήστε ένα cookie. Εάν τη χρειάζεται μόνο η σελίδα, χρησιμοποιήστε το localStorage ή το sessionStorage, επειδή αυτές οι τιμές δεν προσθέτουν ποτέ βάρος σε ένα αίτημα δικτύου.

Ο κώδικας διαχείρισης cookie συνήθως είναι κοινόχρηστος σε πολλές σελίδες, επομένως ελέγξτε τον εσωτερικός και εξωτερικός JavaΓραφή πριν αποφασίσετε πού θα το τοποθετήσετε. Ο διαχωρισμός συμβολοσειρών που χρησιμοποιείται εδώ βασίζεται JavaΣυμβολοσειρές σεναρίου και JavaΜέθοδοι πίνακα σεναρίων, και περαιτέρω λειτουργικά σενάρια εμφανίζονται στο πρακτικός JavaΠαραδείγματα κώδικα σεναρίου.

Συχνές Ερωτήσεις

Περίπου 4 KB ανά cookie και τα περισσότερα προγράμματα περιήγησης διατηρούν περίπου 50 cookies για κάθε τομέα. Μεγαλύτερες τιμές θα πρέπει να τοποθετούνται στο localStorage ή να ανακτώνται από τον διακομιστή κατ' απαίτηση.

Συνήθεις αιτίες είναι η παρελθούσα ημερομηνία λήξης, η αναντιστοιχία διαδρομής, το άνοιγμα σελίδας από το σύστημα αρχείων αντί για διακομιστή ή ο αποκλεισμός των cookies από το πρόγραμμα περιήγησης. Ελέγξτε τον πίνακα εφαρμογών στα εργαλεία προγραμματιστών.

Όχι. Τα cookies HttpOnly αποκρύπτονται σκόπιμα από το document.cookie, έτσι ώστε τα injected scripts να μην μπορούν να κλέψουν ένα session token. Μόνο ο διακομιστής τα βλέπει, στις κεφαλίδες αιτημάτων.

Τα cookies πρώτου μέρους ανήκουν στον τομέα στη γραμμή διευθύνσεων. Τα cookies τρίτων μερών ορίζονται από έναν ενσωματωμένο τομέα, όπως έναν διαφημιζόμενο, και τα προγράμματα περιήγησης πλέον τα περιορίζουν ή τα αποκλείουν από προεπιλογή.

Ναι. Ένα μικρό cookie συνήθως αποθηκεύει ένα αναγνωριστικό συνομιλίας, ώστε το γραφικό στοιχείο να μπορεί να επαναφέρει το νήμα στην επόμενη επίσκεψη. Τα ίδια τα μηνύματα διατηρούνται στους διακομιστές του παρόχου.

Όχι. Τα cookies ταξιδεύουν με κάθε αντίστοιχο αίτημα και είναι αναγνώσιμα από σενάρια, εκτός εάν έχει οριστεί η επιλογή HttpOnly. Αποθηκεύστε μόνο ένα αδιαφανές αναγνωριστικό και διατηρήστε τα προσωπικά δεδομένα στον διακομιστή.

Συνοψίστε αυτήν την ανάρτηση με: