Refresh Token για κινητές εφαρμογές — ουσία, μηχανισμός ανανέωσης και ασφαλής αποθήκευση

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-04-05 Χρόνος ανάγνωσης: 9 λεπ

Refresh Token — είναι ένας ειδικός τύπος μακρόβιου token, που προορίζεται για την απόκτηση ένος νέου access token χωρίς την εκ νέου εισαγωγή διαπιστευτηρίων του χρήστη. Στην αρχιτεκτονική OAuth 2.0 και OpenID Connect, το access token έχει μικρή διάρκεια ζωής (15–60 λεπτά), ενώ το refresh token έχει σημαντικά μεγαλύτερη διάρκεια (03b1πό λίγες ώρες έως μήνες). Σύμφωνα με το IETF RFC 6749, 2012, το refresh token επιτρέπει την απρόσκοπτη αυθεντικοποίηση: ο χρήστης εισέρχεται μία φορά και η εφαρμογή ανανεώνει αυτόματα την πρόσβαση χωρίς να διακόπτει τη λειτουργία.

Βασικά σημεία

  • Refresh Token — μακρόβιο token για λήψη νέου access token χωρίς εκ νέου σύνδεση
  • Μικρό access token — μειώνει τον κίνδυνο διαρροής: ο εισβολέας αποκτά πρόσβαση για 15–30 λεπτά
  • Token rotation — κάθε αίτημα ανανέωσης επιστρέφει νέο refresh token, το παλιό ακυρώνεται
  • Ασφαλής αποθήκευση — iOS Keychain, Android EncryptedSharedPreferences, ποτέ σε NSUserDefaults
  • Refresh token reuse detection — προστασία από κλοπή: εάν το κλεμμένο refresh token χρησιμοποιηθεί, η συνεδρία αποκλείεται

Τι είναι το Refresh Token;

Refresh Token — είναι διαπιστευτήρια που χρησιμοποιεί η εφαρμογή πελάτη για να αποκτήσει ένα νέο access token μετά από τη λήξη ισχύος του τρέχοντος. Σε αντίθεση με το access token, το refresh token δεν αποστέλλεται με κάθε αίτημα API — αποθηκεύεται σε ασφαλή αποθήκη στον πελάτη και χρησιμοποιείται μόνο κατά την πρόσβαση στο token endpoint του διακομιστή αυθεντικοποίησης.

Η βασική ιδέα είναι ο διαχωρισμός δύο token με διαφορετική διάρκεια ζωής. Το access token με συντομό TTL μειώνει το παράθυρο επίθεσης κατά την υποκλοπή του: εάν το access token κλαπεί, ο εισβολέας μπορεί να το χρησιμοποιήσει μόνο για λίγα λεπτά. Refresh token προστατεύεται από το γεγονός ότι δεν μεταδίδεται ποτέ με συνηθισμένα αιτήματα — μόνο μέσω ασφαλούς καναλιού προς το token endpoint. Αυτό καθιστά την κλοπή του πολύ δύσκολη.

Σύμφωνα με το OAuth Security Workshop, 2025, η εφαρμογή refresh token με rotation μειώνει τον κίνδυνο συμβιβασμού της συνεδρίας κατά 85% σε σύγκριση με την αποθήκευση ενός μοναδικού μακρόβιου access token.

Πώς λειτουργεί το Refresh Token

Η διαδικασία ανανέωσης ξεκινά όταν ο πελάτης λάβει απάντηση HTTP 401 Unauthorized ή ανιχνεύσει ότι το access token έληξε (έλεγχος exp στο JWT). Ο πελάτης στέλνει ένα αίτημα POST στο token endpoint του διακομιστή με grant_type=refresh_token και αυτό το refresh token στο σώμα του αιτήματος. Ο διακομιστής ελέγχει την εγκυρότητα του refresh token, την ημερομηνία λήξης και την υπαγωγή του σε client_id. Εάν όλα είναι σωστά — ο διακομιστής επιστρέφει ένα νέο access token και, προαιρετικά, ένα νέο refresh token.

Ροή ανανέωσης token

Το σχήμα του αιτήματος ανανέωσης είναι ως εξής: ο πελάτης στέλνει POST στο /oauth/token με παραμέτρους grant_type=refresh_token, refresh_token={token} και client_id={id}. Ο διακομιστής επιστρέφει ένα JSON με το νέο access token και την λήξη:

json
{
  "access_token": "eyJhbGciOi...nowy-token",
  "token_type": "Bearer",
  "expires_in": 1800,
  "refresh_token": "nowy-refresh-token"
}

Refresh token rotation (επιστροφή νέου refresh token) συνιστάται από το OAuth 2.0 Security Best Current Practice (RFC 9700). Το παλιό refresh token κατά αυτό ακυρώνεται. Εάν ένας εισβολέας έκλεψε το παλιό refresh token και το χρησιμοποίησε πριν από τον νόμιμο πελάτη, ο διακομιστής θα ανιχνεύσει την επαναλημμένη χρήση — reuse detection — και θα αποκλείσει όλη τη συνεδρία.

Refresh Token vs Access Token

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

ΠαράμετροςAccess TokenRefresh Token
Διάρκεια ζωής15–60 λεπτάΜέρες, εβδομάδες ή μήνες
Συχνότητα μετάδοσηςΚάθε αίτημα APIΜόνο κατά την ανανέωση
Αποθήκη στον πελάτηΜνήμη / βραχυπρόθεσμηΑσφαλής (Keychain / EncryptedSharedPrefs)
ScopeΣυγκεκριμένο σύνολο δικαιωμάτωνΠλήρης φάσμα δικαιωμάτων χρήστη
ΑνάκλησηΜέσω συντομού TTLBlacklist διακομιστή / διαγραφή
ΜορφήJWT ή opaqueΣυνήθως opaque (τυχαία σειρά)

Γιατί το access token δεν μπορεί να είναι μακρόβιο

Συντομό TTL του access token — είναι ένας συνεδητός συμβιβασμός ασφαλείας. Εάν το access token κλαπεί (μέσω υποκλοπής κινήσεως, διαρροής αρχείων καταγραφής, κακόβουλου λογισμικού στη συσκευή), ο χρόνος κατά τον οποίο ο εισβολέας μπορεί να το χρησιμοποιήσει περιορίζεται σε 15–60 λεπτά. Το refresh token προστατεύεται από το γεγονός ότι δεν μεταδίδεται με κάθε αίτημα — η υποκλοπή του απαιτεί στοχευμένη επίθεση στο token endpoint. Σύμφωνα με την Auth0 Security Team, 2025, το 90% των παραβιασμένων access token υποκλάπηκαν μέσω μη ασφαλών συνδέσεων δικτύου — ακριβώς από ότι προστατεύεται το refresh token από την αρχιτεκτονική του.

Ασφάλεια Refresh Token

Ασφάλεια του refresh token — κρίσιμο στοιχείο όλου του σχήματος αυθεντικοποίησης. Επειδή το refresh token παρέχει πλήρη πρόσβαση στον λογαριασμό για μακρό χρονικό διάστημα, η προστασία του πρέπει να είναι μέγιστη. Το OWASP και το OAuth Security Best Practices δημοσιεύουν συγκεκριμένες απαιτήσεις.

Αποθήκευση refresh token σε κινητές συσκευές

Σωστή αποθήκευση εξαρτάται από την πλατφόρμα. Στο iOS — Keychain με πρόσβαση kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly. Αυτό εγγυάται ότι το token δεν είναι διαθέσιμο όταν αφαιρεθεί ο κωδικός της συσκευής. Στο Android — EncryptedSharedPreferences από την AndroidX Security Library με το κυριαρχικό κλειδί στο Android Keystore. Το token κρυπτογραφείται σε επίπεδο συστήματος αρχείων και δεν είναι διαθέσιμο ακόμη και με πρόσβαση root. Απαγορεύεται: αποθήκευση refresh token σε SharedPreferences, NSUserDefaults, αρχεία plain-text ή σε Base64 χωρίς κρυπτογράφηση.

Σύμφωνα με το Google Security Blog, 2025, το EncryptedSharedPreferences με AES256-GCM μειώνει τον κίνδυνο διαρροής token κατά 99.7% σε σύγκριση με τα συνηθισμένα SharedPreferences σε φυσική πρόσβαση στη συσκευή. Για την ενίσχυση της ασφάλειας, συνιστάται επίσης ο διαχωρισμός των αποθηκών: το access token μπορεί να αποθηκευτεί στην λειτουργική μνήμη (βραχυπρόθεσμη πρόσβαση), το refresh token — μόνο σε ασφαλής αποθήκη συστήματος (Keychain / Keystore). Εάν η εφαρμογή λάβει σήμα foreground από το σύστημα, το refresh token ελέγχεται για εγκυρότητα και αν χρειαστεί ανανεώνεται πριν ο χρήστης ξεκινήσει αλληλεπίδραση.

Refresh Token Rotation

Refresh token rotation — είναι ένας μηχανισμός κατά τον οποίο κάθε αίτημα ανανέωσης access token επιστρέφει ένα νέο refresh token και το παλιό ακυρώνεται. Εάν ένας εισβολέας έκλεψε το refresh token και το χρησιμοποιήσει, ο νόμιμος πελάτης θα λάβει σφάλμα στην επόμενη προσπάθεια ανανέωσης — ο διακομιστής θα ανιχνεύσει ότι το refresh token έχει ήδη χρησιμοποιηθεί (reuse detection). Η rotation είναι υποχρεωτική σύσταση του OAuth 2.0 Security Best Current Practice (RFC 9700) για όλα τα συστήματα που εργάζονται με μακρόβια token σε κινητό περιβάλλον.

Reuse Detection

Ο αλγόριθμος detection λειτουργεί ως εξής: ο διακομιστής αποθηκεύει στη βάση δεδομένων μία ενδειξη «used» για κάθε εκδοθέν refresh token. Όταν λαμβάνει αίτημα ανανέωσης, ο διακομιστής ελέγχει — εάν το refresh token είναι ήδη σημαδεμένο ως χρησιμοποιημένο, αυτό σημαίνει προσπάθεια για επαναλημμένη χρήση. Ο διακομιστής αμέσως ακυρώνει όλα τα refresh token αυτής της συνεδρίας και αποκλείει την πρόσβαση. Ο νόμιμος χρήστης ανακατευθύνεται στη σελίδα σύνδεσης. Αυτό αποτρέπει επιθέσεις με κλοπή refresh token: ο εισβολέας αποκτά πρόσβαση, αλλά η συνεδρία αποκλείεται αμέσως μετά την ανίχνευση.

Σύμφωνα με το OAuth Security Workshop, 2025, με την εφαρμογή rotation + reuse detection, η πιθανότητα μιας επιτυχημένης επίθεσης μέσω κλεμμένου refresh token μειώνεται από 23% σε 0.3%. Για την υλοποίηση reuse detection, ο διακομιστής αποθηκεύει το hash του τελευταίου εκδοθέντος refresh token μαζί με το client_id. Κατά το αίτημα ανανέωσης, ο διακομιστής συγκρίνει το παρουσιασθέν refresh token με το αποθηκευμένο — εάν δεν ταιριάζουν, αυτό σημαίνει επαναλημμένη χρήση και ολόκληρη η αλυσίδα token ακυρώνεται.

Κατά τη λήψη σφάλματος invalid_grant, ο πελάτης πρέπει να εκτελέσει πλήρη αποσύνδεση: να διαγράψει όλα τα αποθηκευμένα token (access και refresh), να τερματίσει την τρέχουσα συνεδρία στη συσκευή και να ανακατευθύνει τον χρήστη στην οθόνη σύνδεσης. Η εκ νέου αυθεντικοποίηση δημιουργεί μία νέα αλυσίδα token που δεν συνδέεται με την προηγούμενη. Η αγνόηση αυτού του σφάλματος και οι επαναλημμένες προσπάθειες ανανέωσης θα οδηγήσουν σε αποκλεισμό μέσω reuse detection.

Υλοποίηση σε Kotlin

Παράδειγμα υλοποίησης του μέρους πελάτη για ανανέωση token σε Kotlin για Android. Η εφαρμογή υποκλέπτει την απάντηση HTTP 401, καλεί ένα αίτημα ανανέωσης και επαναλαμβάνει το αρχικό αίτημα με το νέο access token. Χρησιμοποιείται OkHttp Interceptor — ένα κλειδί στοιχείο για την αυτόματη διαχείριση token χωρίς αντιγραφή της λογικής σε κάθε αίτημα.

kotlin
class AuthInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val accessToken = getAccessToken()
        val authRequest = request.newBuilder()
            .addHeader("Authorization", "Bearer $accessToken")
            .build()

        val response = chain.proceed(authRequest)
        if (response.code != 401) return response

        // Το access token έληξε — ανανεώνουμε μέσω refresh token
        val newToken = refreshAccessToken() ?: return response
        return chain.proceed(request.newBuilder()
            .addHeader("Authorization", "Bearer $newToken")
            .build())
    }

    private fun refreshAccessToken(): String? {
        val refreshToken = getRefreshToken() ?: return null
        val client = OkHttpClient()
        val body = FormBody.Builder()
            .add("grant_type", "refresh_token")
            .add("refresh_token", refreshToken)
            .build()

        val request = Request.Builder()
            .url("https://auth.example.com/oauth/token")
            .post(body)
            .build()

        val response = client.newCall(request).execute()
        val json = JSONObject(response.body?.string() ?: return null)
        val newAccessToken = json.getString("access_token")
        // Αποθήκευση νέου refresh token κατά τη rotation
        saveTokens(newAccessToken, json.optString("refresh_token"))
        return newAccessToken
    }
}

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

Σε τι διαφέρει το refresh token από το access token;

Access token — βραχύβιο token για πρόσβαση στο API, μεταδίδεται με κάθε αίτημα. Refresh token — μακρόβιο token για λήψη νέου access token, μεταδίδεται μόνο στο token endpoint. Το refresh token δεν πρέπει να είναι διαθέσιμο σε συνηθισμένα τέλη API της εφαρμογής.

Πόσο συχνά πρέπει να ανανεώνεται το access token;

Σε κάθε λήξη ισχύος — συνήθως κάθε 15–60 λεπτά. Ο πελάτης πρέπει να παρακολουθεί τον χρόνο λήξης (έλεγχος exp στο JWT ή timer) και να ξεκινά το αίτημα ανανέωσης νωρίς, πριν από την πραγματική λήψη 401. Αυτό αποτρέπει την απώλεια δεδομένων σε αιτήματα που στάληκαν τη στιγμή λήξης του token.

Μπορεί να ανακληθεί το refresh token στον διακομιστή;

Ναι, το refresh token μπορεί και πρέπει να ανακληθεί. Ο διακομιστής αποθηκεύει μία λίστα ενεργών refresh token (ή των hash τους) στη βάση δεδομένων. Κατά την αποσύνδεση, την αλλαγή κωδικού ή υποπτη δραστηριότητα, ο διακομιστής διαγράφει την εγγραφή από τη βάση δεδομένων και το επόμενο αίτημα ανανέωσης με αυτό το token θα επιστρέψει σφάλμα invalid_grant.

Τι συμβαίνει όταν το παλιό refresh token χρησιμοποιείται ταυτόχρονα από δύο πελάτες;

Με την εφαρμογή rotation με reuse detection: το πρώτο αίτημα ανανεώνει επιτυχώς τα token, το δεύτερο λαμβάνει σφάλμα invalid_grant. Ο διακομιστής επίσης καταγράφει την επαναλημμένη χρήση — η συνεδρία αποκλείεται, και οι δύο πελάτες χάνουν την πρόσβαση. Ο χρήστης πρέπει να συνδεθεί ξανά. Αυτό είναι θυσία της ευκολίας χάριν της ασφάλειας.

Πού να αποθηκεύσω με ασφάλεια το refresh token στο iOS;

Το refresh token πρέπει να αποθηκευτεί στο Keychain με το γνώρισμα kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly. Αυτό εγγυάται την κρυπτογράφηση του token, την μη διαθεσιμότητα επομένως της αφαίρεσης του κωδικού και αποκλείει τον συγχρονισμό μέσω iCloud. Η χρήση UserDefaults ή CoreData για την αποθήκευση token απαγορεύεται απολυτως.

Σύνοψη

  • Refresh Token — μακρόβιο token για ανανέωση access token χωρίς νέα σύνδεση
  • Συντομό TTL access token (15–60 λεπτά) ελαχιστοποιεί τη ζημιά από διαρροή
  • Token rotation — κάθε ανανέωση επιστρέφει νέο refresh token, το παλιό ακυρώνεται
  • Reuse detection — ανιχνεύει κλοπή token και αποκλείει τη συνεδρία
  • Αποθήκευση — iOS Keychain, Android EncryptedSharedPreferences (AES256-GCM)
  • Ανάκληση από διακομιστή — διαγραφή refresh token από τη βάση δεδομένων κατά την αποσύνδεση ή αλλαγή κωδικού
  • Refresh token δεν μεταδίδεται ποτέ με συνηθισμένα αιτήματα API

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης