Sobes.tech
Junior

Τι είναι το 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
    }
    
  • 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.