JWT: δομή και τρωτά σημεία
1) Τι είναι η JWT και πού χρησιμοποιείται
Το JWT είναι ένα συμπαγές αυτόνομο περιέκτη απαιτήσεων σε μορφή «Base64Url (κεφαλίδα)». (ωφέλιμο φορτίο). (υπογραφή) '.
Χρησιμοποιείται για:- JWS (υπογεγραμμένες μάρκες - αυθεντικότητα/ακεραιότητα),
- JWE (κρυπτογραφημένες μάρκες - ιδιωτικότητα),
- ως πρόσβαση/ID μάρκες, καθώς και ταυτοποίηση υπηρεσίας προς υπηρεσία.
Επαγγελματίες: αυτονομία, δυνατότητα αποθήκευσης, χαμηλά εναέρια έξοδα. Κατά: κίνδυνος εσφαλμένης επικύρωσης, περίπλοκες περιπτώσεις ανάκλησης.
2) Δομή JWT
2. Κεφαλίδα (JSON)
Ελάχιστο: αλγόριθμος και αναγνωριστικό κλειδιού.
json
{ "alg": "ES256", "kid": "jwt-2025-10", "typ": "JWT" }
'alg': αλγόριθμος υπογραφής/κρυπτογράφησης (RS256/ES256/PS256/HS256 κ.λπ.).
'kid': δείκτης προς κλειδί (για περιστροφή JWKS).
Προαιρετικές βασικές πηγές: 'jku', 'x5u' (βλέπε τρωτά σημεία § 6. 3).
2. 2 Ωφέλιμο φορτίο (JSON)
Τυποποιημένα γραμματόσημα:- «is (εκδότης),» au (ακροατήριο), «sub» (υποκείμενο)
- «exp» (χρόνος λήξης), «nbf» (όχι πριν), «iat» (εκδοθέν)
- 'jti' (συμβολική ταυτότητα, ανακλητέα)
- σφραγίδες πεδίου: «πεδίο εφαρμογής/ρόλοι», «ενοικιαστής», «kyc _ level» κ.λπ.
2. Υπογραφή
JWS = 'sign [base64url (κεφαλίδα) + ". + base64url (ωφέλιμο φορτίο), private_key)'
Επαλήθευση: αυστηρά αντίστοιχο δημόσιο κλειδί και ακριβώς ο αλγόριθμος που αναμένει ο εξυπηρετητής.
3) Βασικοί έλεγχοι αναλλοίωτοι
1. Ο αλγόριθμος καθορίζεται από τη διαμόρφωση του εξυπηρετητή πόρων (επιτρεπόμενη λίστα), και δεν είναι αξιόπιστος με το περιεχόμενο του 'header. alg '.
2. Ελέγξτε το 'is και το' aud 'για ένα ακριβές ταίριασμα,' exp/nbf '- λαμβάνοντας υπόψη το μικρό' ρολόι _ skew '(± 30-60).
3. Αρνούνται μάρκες χωρίς «παιδί» μόνο εάν υπάρχει ένα μόνο κλειδί και καμία περιστροφή. διαφορετικά, απαιτούν «παιδί».
4. Μην εμπιστεύεστε κανένα γραμματόσημο χωρίς άδεια επιπέδου αντικειμένου (BOLA-first).
5. Ανάλυση - μετά από κρυπτογραφική επαλήθευση. ελέγχους βασικού μεγέθους πριν από την αποκωδικοποίηση.
4) JWS vs JWE
Υπογεγραμμένο αλλά αναγνώσιμο. Μη τοποθετείτε σε ωφέλιμο φορτίο PII/μυστικά.
JWE: κρυπτογραφεί ωφέλιμο φορτίο. η ολοκλήρωση είναι πιο δύσκολη, το βασικό μοντέλο είναι κρίσιμο.
Στις περισσότερες API, αρκεί η απαγόρευση JWS + για ευαίσθητα δεδομένα σε ωφέλιμο φορτίο.
5) Συμβολικός κύκλος ζωής
Πρόσβαση: βραχυπρόθεσμη (5-30 λεπτά).
Ανανέωση: μεγαλύτερη (7- 30 ημέρες), εναλλασσόμενη χρήση (εφάπαξ), διατήρηση της «μαύρης λίστας» «jti/sid».
Ανάκληση: λίστες "jti 'with TTL, ενδοσκόπηση για αδιαφανείς μάρκες, συντομογραφία' exp 'for περιστατικά.
Εναλλαγή κλειδιού: JWKS με επικάλυψη (παλιά + νέα), βλέπε άρθρο «Εναλλαγή κλειδιού».
6) Συχνές αδυναμίες και τρόπος κλεισίματός τους
6. 1 'alg = καμία '/υποκατάσταση αλγορίθμου
Κάτω γραμμή: Ο διακομιστής εμπιστεύεται το πεδίο 'alg' και δέχεται ένα μη υπογεγραμμένο σύμβολο.
Προστασία: σκληρός επιτρεπόμενος κατάλογος αλγορίθμων στον εξυπηρετητή. να απορρίπτει «όχι» και απροσδόκητες τιμές.
6. 2 RS256→HS256 swap (συμμετρία)
Τέλος: ένας επιτιθέμενος αντικαθιστά το "alg 'with HS256 και χρησιμοποιεί το δημόσιο κλειδί ως μυστικό του HMAC.
Προστασία: συνδέστε το κλειδί με τον αλγόριθμο με τη διαμόρφωση. δεν αναμειγνύονται συμμετρικοί/ασύμμετροι πάροχοι σε ένα «kid».
6. Βασική ένεση ('παιδί/jku/x5u')
Σενάρια:- "jku 'σημεία σε ένα ελεγχόμενο από τον επιτιθέμενο JWKS (θα γλιστρήσει το κλειδί του).
- 'x5u '/' x5 κατάχρηση εξωτερικών πιστοποιητικών.
- 'kid' with/SQL path injection ('.. "/../privkey. pem «'ή' '' OR 1 = 1 --» ').
- Αγνοήστε τη διαγραφή 'jku/x5u' ή το φίλτρο με αυστηρά επιτρεπόμενα πεδία.
- 'kid' should να χρησιμοποιείται μόνο ως κλειδί στον τοπικό κατάλογο (πίνακας/κρύπτη), χωρίς μονοπάτια αρχείων/συστοιχίες SQL.
- Φορτίο JWKS από εμπιστευμένα URL, σύντομο TTL, κανάλι υπογραφής/καρφίτσας.
6. Ασθενή μυστικά HS256 (ωμή δύναμη)
Κάτω γραμμή: το μυστικό HMAC είναι σύντομο/διαρρέει → υπογραφή spoofing.
Προστασία: χρήση ασυμμετρίας (RS/ES/PS) ή μυστικού μήκους ≥ 256 bit, μυστικών - μόνο στο KMS.
6. 5 Ελλείπουσες/άκυρες σφραγίδες
Το σύμβολο «au /» is /« exp» είναι διασταυρωμένο ή άπειρο.
Υπερβολικά μακρύς → κίνδυνος συμβιβασμού.
Προστασία: απαιτείται πλήρης σειρά σημάτων, 'exp' short, 'nbf '/' iat' validate με 'rock _ skew'.
6. 6 Επανάληψη και κλοπή μάρκας
Ουσία: υποκλοπή/επανάληψη μιας μάρκας (διαρροή σε αρχεία καταγραφής, XSS, MitM χωρίς TLS).
Προστασία:- TLS везде, 'Secure' + 'HttpOnly' cookie, SameSite = Lax/Strict.
- DPoP/PoP (δεσμεύοντας ένα σύμβολο σε ένα κλειδί πελάτη) ή/και mTLS για τους εταίρους.
- Σύντομη 'exp', ανανέωση-περιστροφή, σύνδεση συσκευής.
6. 7 Διαρροές XSS/Αποθήκευση
Κάτω γραμμή: αποθήκευση JWT σε «localStorage »/« surveStorage» → διατίθεται στην JS.
Προστασία: αποθήκευση σημάτων πρόσβασης σε HttpOnly-cookie (εάν είναι δυνατό το μοντέλο cookie) + αυστηρούς τύπους CSP/εμπίστευσης.
Για SPA χωρίς cookies - απομονώστε το σύμβολο στη μνήμη, ζήστε ελάχιστα, προστατεύστε από XSS.
6. 8 CSRF
Η ουσία: κατά τη διάρκεια των συνεδριών cookie, αιτήματα από τρίτους.
Προστασία: SameSite, αντι-CSRF μάρκες (διπλή υποβολή), έλεγχος 'Origin/Reference', φίλτρα Fetch-Metadata.
6. 9 Κατάχρηση υπερμεγέθους/μεγέθους
Κύρια σημεία: τεράστιο ωφέλιμο φορτίο/πρωτοσέλιδα, DOS στην ανάλυση.
Προστασία: όρια τίτλου/μεγέθους σώματος, πρόωρη απόρριψη 431/413, σταθερή σειρά γραμματοσήμων.
6. 10 Υποκατάσταση 'typ '/' cty'
Ουσία: σύγχυση τύπων ('typ: «JWT»), ένθετα αντικείμενα JOSE.
Προστασία: αγνοήστε το «typ/cty» για την ασφάλεια, βασιστείτε σε σταθερούς αλγόριθμους και σύστημα σήμανσης.
7) Συμβολική αποθήκευση και μεταφορά
7. 1 API εξυπηρετητή (μηχανή προς μηχανή)
mTLS/HMAC, κατά προτίμηση ασυμμετρία για JWT, διοχετεύεται μέσω ματιών.
Κατάστημα κλειδών - KMS/HSM, προγραμματισμένη εναλλαγή, αλληλεπικάλυψη JWKS.
7. 2 Πελάτες περιηγητή
HttpOnly Secure Cookie для πρόσβαση/ανανέωση; σύντομη TL· ενημέρωση - μέσω «σιωπηλής ανανέωσης» με το 'SameSite = Κανένα' only υπό HTTPS.
Αυστηρός CSP, εμπίστευση τύπων, προστασία από XSS. για SPA - εάν είναι δυνατόν, μην αποθηκεύσετε τη μάρκα στο δίσκο.
8) JWKS, εναλλαγή και ανάκληση
το JWKS δημοσιεύεται από τον εξουσιοδοτητή· οι καταναλωτές κρύπτονται για 5-15 λεπτά.
Σχέδιο περιστροφής: προσθέστε ένα νέο 'παιδί' → αρχίστε να υπογράφετε → μετά από N ημέρες αφαιρέστε το παλιό από JWKS → καθαρίστε.
Ανάδραση: «jti/sid» λίστες με TTL; σε περίπτωση συμβάντος, να μειώσει προσωρινά το «exp» και το «force-out» (απενεργοποίηση της ανανέωσης).
9) Πολυπληθής και ελαχιστοποίηση δεδομένων
Να συμπεριληφθεί η ένδειξη «ενοικιαστής »/« org» στη μάρκα μόνο εάν είναι απαραίτητο με αρχιτεκτονική. διαφορετικά, τραβήξτε τα χαρακτηριστικά από το PDP από το 'sub'.
Δεν υπάρχουν PII· ελάχιστη σειρά γραμματοσήμων → μικρότερο κίνδυνο διαρροών και συσχέτισης.
10) Πρακτικός κατάλογος ελέγχου επικύρωσης (εξυπηρετητής πόρων)
- Παρσίμ μόνο μετά από επαλήθευση των ορίων υπογραφής και βασικού μεγέθους.
- 'alg' από τη διαμόρφωση· απορρίπτουν απροσδόκητα.
- Ελέγξτε 'is ' aud ' ' exp ' ' nbf ' ' iat '(με' ρολόι _ skew ').
- Ελέγξτε το 'kid' στον τοπικό κατάλογο/JWKS (σύντομο TTL).
- Φίλτρο/ομαλοποίηση εξωτερικών δεικτών ('jku/x5u' - επιτρεπόμενη λίστα μόνο).
- Όριο μήκους/σύνθεσης σφραγίδας (σύστημα).
- Εφαρμόστε την εξουσιοδότηση πόρων αντικειμένων (BOLA-first).
- Log «παιδί», «sub», «au ,» is , «jti», «exp», «ενοικιαστής», «trace _ id» (χωρίς PII).
- Μετρήσεις σφαλμάτων υπογραφής, καθυστερήσεις, εκ περιτροπής έλεγχοι.
11) Παραδείγματα ασφαλών πολιτικών (ψευδο)
11. 1 Διαμόρφωση των προσδοκιών του αλγόριθμου
yaml jwt:
expected_issuer: "https://auth. example. com"
expected_audience: ["wallet-service"]
allowed_algs: ["ES256"] # fix the jwks_url: "https ://auth. example. com/.well-known/jwks. json"
jwks_cache_ttl: 600s clock_skew: 60s required_claims: ["iss","aud","sub","exp","iat"]
11. 2 Ρίχνοντας το απομακρυσμένο 'jku/x5u'
yaml reject_untrusted_key_sources: true allowed_jku_hosts: ["auth. example. com"] # if absolutely necessary
11. 3 Κατάλογος ανάδρασης δειγμάτων (Redis)
pseudo if redis. exists("revoke:jti:" + jti) then deny()
if now() > exp then deny()
12) Παρατηρησιμότητα και συχνότητα εμφάνισης
: 'jwt _ verify _ fail _ total {reason}', 'jwt _ lied _ total', 'jwks _ refresh _ total', 'kid'.
Κούτσουρα (δομημένα): 'iss/aud/sub/kid/jti/exp/ενοικιαστής/trace _ id', λόγος αποτυχίας.
Dashboards: «λήγει σύντομα», ένα κύμα σφαλμάτων επικύρωσης, διανομή ανά περιοχή/πελάτη.
Ειδοποιήσεις: ανάπτυξη του 'verify _ fail' (υπογραφή/αλγόριθμος), σφάλματα JWKS, μερίδιο των σημάτων που έχουν λήξει.
13) Αντιπατερίδια
Εμπιστοσύνη 'alg' από τη μάρκα. υποστήριξη 'none'.
Μακροχρόνιες μάρκες πρόσβασης και καμία ανανέωση της περιστροφής.
με ένα σύντομο μυστικό/μυστικό στο ENV χωρίς KMS.
Αποδοχή 'jku/x5u' από οποιοδήποτε πεδίο; δυναμικά φορτίο JWKS χωρίς επιτρεπόμενη λίστα.
Τοποθέτηση PII/μυστικών σε JWS ωφέλιμου φορτίου.
Φυλάσσετε τις μάρκες στο «localStoration» όταν υπάρχουν κίνδυνοι για το XSS.
Καταστολή σφαλμάτων επικύρωσης (επιστροφή 200 s «μαλακό σφάλμα»).
Καμία BOLA δεν ελέγχει και βασίζεται μόνο στο «πεδίο εφαρμογής/ρόλο».
14) Ιδιαιτερότητες του iGaming/Finance
Μάρκες: 'kyc _ level', 'risk _ tier', 'renant', αυστηρά 'aud'.
Σύντομη TTL για πράξεις εγγραφής (καταθέσεις/εκροές), PoP/DPoP ή mTLS για κρίσιμες διαδρομές.
Κανονιστικός έλεγχος: αμετάβλητα αρχεία εισροών/αστοχιών, αποθήκευση κορμών εντός των ορίων της περιοχής.
Συνεργάτες/PSP έχουν ξεχωριστά κλειδιά/' aud ', κλειδιά ενοικιαστών και ξεχωριστά JWKS.
15) Κατάλογος ελέγχου ετοιμότητας Prod
- Σκληρός επιτρεπόμενος κατάλογος αλγορίθμων. Το «none» δεν επιτρέπεται.
- «iss/aud/exp/nbf/iat/jti» ελέγχονται· σύντομη «exp».
- επικαλυπτόμενη μνήμη JWKS, σύντομη μνήμη TTL· παρακολούθηση των μετοχών «παιδιού».
- Ανανέωση - περιστροφή κατά τη χρήση. 'jti/sid' lists with TTL? αναθεώρηση του playbook.
- PoP/DPoP ή mTLS σε κρίσιμες διαδρομές.
- HttpOnly-cookies για browser, CSP/Trusted Types έναντι XSS; Προστασία CSRF.
- Δεν υπάρχει PII σε ωφέλιμο φορτίο· ελάχιστη σειρά σημάτων.
- Μετρήσεις/καταγραφές επικύρωσης και αστοχίας. ειδοποιήσεις JWKS/verify_fail.
- Αρνητικές δοκιμές σεναρίου: RS→HS swap, 'kid' - injections, 'jku' spoofing, oversize, rock-skew.
16) TL· DR
Καθορίστε τον αλγόριθμο και τα κλειδιά στην πλευρά του εξυπηρετητή, μην εμπιστεύεστε το 'alg' από το σήμα, ζητήστε 'iss/aud/exp/nbf/iat/jti'. Περιστροφή κλειδιών μέσω επικαλυπτόμενων JWKS, διατήρηση μαρκών βραχύβια και ανανέωση μιας χρήσης. Αποθηκεύστε τις μάρκες με ασφάλεια (HttpOnly-cookie για το διαδίκτυο), ελαχιστοποιήστε τα γραμματόσημα, μην τοποθετήσετε PII. Κλείσιμο διανυσμάτων 'jku/x5u/kid', αποφυγή HS256 με αδύναμα μυστικά, προσθήκη PoP/DPoP ή mTLS σε κρίσιμες διαδρομές και πάντα έλεγχος BOLA σε επίπεδο πόρων.