Τι είναι το JWT (JSON Web Token);
sobes.tech AI
Απάντηση από AI
Το JSON Web Token (JWT) είναι ένας συμπαγής, ασφαλής τρόπος μεταφοράς δεδομένων μεταξύ μερών σε μορφή JSON.
Αρχές λειτουργίας:
-
Το token αποτελείται από τρία μέρη, διαχωρισμένα με τελείες (
.):header.payload.signature. -
Header (Επικεφαλίδα): Περιέχει μεταδεδομένα για το token, όπως τον τύπο του token (JWT) και τον αλγόριθμο υπογραφής που χρησιμοποιείται (π.χ., HS256, RS256).
{ "alg": "HS256", "typ": "JWT" } -
Payload (Φορτίο): Περιέχει "claims" - δηλώσεις ή πληροφορίες που θέλουμε να μεταφέρουμε. Υπάρχουν διάφοροι τύποι:
- Registered claims: Καταχωρημένες, αλλά προαιρετικές claims, όπως
iss(εκδότης),exp(διάρκεια ισχύος),sub(θέμα). - Public claims: Ορίζονται για δημόσια χρήση, πρέπει να καταχωρούνται στο IANA JSON Web Token Registry ή να είναι URI που περιέχει namespace, προστατευμένο από συγκρούσεις.
- Private claims: Προαιρετικές δηλώσεις, συμφωνημένες μεταξύ των μερών.
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } - Registered claims: Καταχωρημένες, αλλά προαιρετικές claims, όπως
-
Signature (Υπογραφή): Δημιουργείται με συνδυασμό κωδικοποιημένου header και payload με χρήση μυστικού και αλγόριθμου που ορίζεται στο header. Αυτό διασφαλίζει την ακεραιότητα του token - αν κάποιος αλλάξει το header ή το payload, η υπογραφή θα είναι άκυρη.
# Παράδειγμα δημιουργίας υπογραφής με HS256 import hmac, hashlib header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Header) payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Payload) secret = 'your_secret_key' # Υπογραφή = HMACSHA256(Base64Url(Header) + "." + Base64Url(Payload), secret) signature = hmac.new( secret.encode('utf-8'), (header_str + '.' + payload_str).encode('utf-8'), hashlib.sha256 ).digest() # Κωδικοποίηση υπογραφής σε Base64Url import base64 signature_b64url = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('ascii') # Τελικό token: header_str + '.' + payload_str + '.' + signature_b64url
Εφαρμογές:
- Αυθεντικοποίηση: Ο διακομιστής εκδίδει το token στον χρήστη μετά από επιτυχημένη αυθεντικοποίηση. Ο χρήστης στέλνει αυτό το token σε κάθε αίτημα. Ο διακομιστής ελέγχει την εγκυρότητα του token και επιτρέπει την πρόσβαση στους πόρους.
- Ανταλλαγή πληροφοριών: Ασφαλής μεταφορά μικρών όγκων δεδομένων μεταξύ διαφορετικών υπηρεσιών.
Πλεονεκτήματα:
- Συμπαγές: Λιγότερα δεδομένα για μεταφορά σε σύγκριση με XML.
- Αυτοτελές: Το token ήδη περιέχει τις απαραίτητες πληροφορίες για τον χρήστη, μειώνοντας την ανάγκη για πρόσβαση στη βάση δεδομένων σε κάθε αίτημα.
- Stateless: Ο διακομιστής δεν χρειάζεται να αποθηκεύει πληροφορίες συνεδρίας.
- Κρυπτογραφική υπογραφή: Διασφαλίζει την ακεραιότητα των δεδομένων.
Μειονεκτήματα:
- Αδύνατο να ανακληθεί το token: Μετά την έκδοσή του, το token ισχύει μέχρι να λήξει, εκτός αν υλοποιηθεί μηχανισμός μαύρης λίστας.
- Αποθήκευση μυστικού: Το μυστικό κλειδί πρέπει να αποθηκεύεται με ασφάλεια.
- Μέγεθος: Με την αύξηση των δεδομένων στο
payload, αυξάνεται και το μέγεθος του token.