Base64, URL Encoding και Punycode — Οδηγός
Τι είναι το Base64 και πότε να το χρησιμοποιήσεις, πώς λειτουργεί το URL encoding και τι είναι το Punycode για ελληνικά domain.
Τι Είναι το Base64 — και Γιατί Χρειάζεται;
Το Base64 είναι ένα σχήμα κωδικοποίησης που μετατρέπει δυαδικά δεδομένα (binary) σε μια σειρά από εκτυπώσιμους ASCII χαρακτήρες. Ο λόγος ύπαρξής του είναι απλός: πολλά πρωτόκολλα και συστήματα (email, HTTP headers, JSON) σχεδιάστηκαν για κείμενο και δεν μπορούν να «μεταφέρουν» ακατέργαστα bytes χωρίς να αλλοιωθούν.
Το Base64 χρησιμοποιεί έναν αλφάβητο 64 χαρακτήρων: τα γράμματα A–Z και a–z (52), τους αριθμούς 0–9 (10) και τα σύμβολα + και / (2). Κάθε 3 bytes εισόδου γίνονται 4 χαρακτήρες εξόδου — αύξηση μεγέθους ~33%. Αν τα bytes δεν διαιρούνται ακριβώς με 3, προστίθεται padding με τον χαρακτήρα = (ένα ή δύο) ώστε το output να έχει πάντα μήκος πολλαπλάσιο του 4.
Είσοδος (3 bytes): M a n Binary: 01001101 01100001 01101110 Base64 groups: 010011 010110 000101 101110 Έξοδος: T W F u → TWFu
Πρακτικές Χρήσεις του Base64
JWT Tokens
Ένα JSON Web Token αποτελείται από τρία μέρη χωρισμένα με τελεία: header.payload.signature. Τα δύο πρώτα μέρη (header και payload) είναι κωδικοποιημένα με Base64URL — μια παραλλαγή του Base64 κατάλληλη για URLs. Αυτό σημαίνει ότι οποιοσδήποτε μπορεί να τα αποκωδικοποιήσει και να δει τα περιεχόμενα:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
→ {"alg":"HS256","typ":"JWT"}
Μόνο η υπογραφή (τρίτο μέρος) εξασφαλίζει ακεραιότητα — το JWT δεν κρυπτογραφεί τα δεδομένα, απλώς τα υπογράφει.
HTTP Basic Authentication
Το Basic Auth κωδικοποιεί τα διαπιστευτήρια ως username:password σε Base64 και τα στέλνει στο header:
Authorization: Basic dXNlcjpwYXNz
Αποκωδικοποιώντας: dXNlcjpwYXNz → user:pass. Για αυτό το Basic Auth πρέπει πάντα να χρησιμοποιείται μόνο πάνω από HTTPS — η κωδικοποίηση δεν προσφέρει καμία ασφάλεια από υποκλοπή.
Data URIs
Εικόνες, γραμματοσειρές και άλλα αρχεία μπορούν να ενσωματωθούν απευθείας σε HTML/CSS χωρίς εξωτερικό αίτημα:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...
Χρήσιμο για μικρά εικονίδια σε email templates ή για να μειωθούν τα HTTP requests σε σελίδες.
Email MIME Attachments
Το πρωτόκολλο MIME χρησιμοποιεί Base64 για να μεταφέρει συνημμένα αρχεία (PDF, εικόνες) μέσα στο σώμα ενός email, το οποίο μεταδίδεται ως αμιγές κείμενο.
Base64 vs Base64URL — Ποια Διαφορά;
Το κλασικό Base64 χρησιμοποιεί + και /, χαρακτήρες που έχουν ειδική σημασία σε URLs (query string, path). Το Base64URL τους αντικαθιστά:
| Παραλλαγή | Χαρακτήρες | Padding | Χρήση |
|---|---|---|---|
| Base64 | A–Z a–z 0–9 + / | = (υποχρεωτικό) | Email, data URIs, γενική χρήση |
| Base64URL | A–Z a–z 0–9 - _ | Συνήθως παραλείπεται | JWT, OAuth tokens, URL parameters |
URL Encoding (Percent-Encoding)
Το URL encoding (ή percent-encoding) μετατρέπει χαρακτήρες που δεν επιτρέπονται σε URLs σε μορφή %XX, όπου XX είναι το hexadecimal του byte στο UTF-8. Κάθε ειδικός χαρακτήρας, κενό ή μη-ASCII γράμμα αντικαθίσταται έτσι:
Ελλάδα → %CE%95%CE%BB%CE%BB%CE%AC%CE%B4%CE%B1 κενό → %20 (ή + σε form data) & → %26 = → %3D
Στη JavaScript υπάρχουν δύο διαφορετικές συναρτήσεις:
encodeURIComponent(): κωδικοποιεί τα πάντα εκτός απόA–Z a–z 0–9 - _ . ! ~ * ' ( ). Κατάλληλο για τιμές query string parameters.encodeURI(): δεν κωδικοποιεί χαρακτήρες που έχουν δομικό ρόλο στο URL (: / ? # [ ] @ ! $ & ' ( ) * + , ; =). Κατάλληλο για ολόκληρο URL.
encodeURIComponent("hello world&foo=bar")
→ "hello%20world%26foo%3Dbar"
encodeURI("https://example.com/search?q=hello world")
→ "https://example.com/search?q=hello%20world"
Punycode και Διεθνοποιημένα Domains (IDN)
Το σύστημα DNS σχεδιάστηκε αποκλειστικά για ASCII χαρακτήρες. Για να υποστηριχθούν domain names με ελληνικά, κινέζικα ή αραβικά γράμματα (IDN — Internationalized Domain Names), αναπτύχθηκε το Punycode (RFC 3492).
Το Punycode μετατρέπει Unicode labels σε ASCII με το πρόθεμα xn--:
ελλάδα.gr → xn--hxakic4aa.gr münchen.de → xn--mnchen-3ya.de παράδειγμα.com → xn--hxajbheg2az3al.com
Ο browser εμφανίζει στη γραμμή διεύθυνσης την Unicode μορφή (πιο φιλική), αλλά στο δίκτυο αποστέλλεται πάντα η Punycode μορφή. Αυτό έχει σημασία σε DNS queries, πιστοποιητικά SSL και ρυθμίσεις email.
Σύγκριση: Base64 / URL Encode / Punycode
| Κωδικοποίηση | Σκοπός | Τυπική Είσοδος | Τυπική Έξοδος |
|---|---|---|---|
| Base64 | Binary → ASCII κείμενο | Αρχεία, bytes, credentials | dXNlcjpwYXNz |
| URL Encode | Ασφαλής ενσωμάτωση σε URL | Query params, ελληνικά κείμενα | %CE%B5%CE%BB |
| Punycode | Unicode domain → ASCII DNS | IDN domain names | xn--hxakic4aa.gr |
Δοκιμάστε Base64, URL Encoding και Punycode μετατροπές απευθείας στο εργαλείο:
→ Base64 & URL EncoderΣυχνές Ερωτήσεις
A–Z a–z 0–9 + / =, το μήκος του είναι πάντα πολλαπλάσιο του 4 (με padding), και τελειώνει συχνά με ένα ή δύο =. Αν το μήκος δεν διαιρείται με 4 ή περιέχει άλλους χαρακτήρες, πιθανόν να είναι Base64URL ή απλώς κείμενο.rawurlencode στην PHP;urlencode() κωδικοποιεί τα κενά ως + (στυλ HTML form data), ενώ η rawurlencode() τα κωδικοποιεί ως %20 σύμφωνα με το RFC 3986. Για URL paths και query parameters που δεν προέρχονται από φόρμες, χρησιμοποιήστε rawurlencode() — είναι πιο ασφαλής επιλογή και συμβατή με όλα τα HTTP clients.xn--...), διότι ορισμένες CA εκδίδουν πιστοποιητικά μόνο για τη μία μορφή. Επίσης, τα email που στέλνονται από IDN domain χρειάζονται ειδική υποστήριξη (EAI / RFC 6531) από τον mail server.