Refresh Token — egy speciális típusú, hosszú élettartamú token, amely új access token beszerzésére szolgál anélkül, hogy a felhasználónak újra meg kellene adnia hitelesítő adatait. Az OAuth 2.0 és OpenID Connect architektúra esetén az access token rövid élettartamú (15–60 perc), míg a refresh token lényegesen hosszabb élettartamú (néhány órától hónapokig). Az IETF RFC 6749, 2012 szerint a refresh token lehetővé teszi a závarmentes hitelesítést: a felhasználó egyszer jelentkezik be, az alkalmazás pedig automatikusan frissíti a hozzáférést anélkül, hogy megzavarná a munkát.
Főbb pontok
Refresh Token — olyan hitelesítő adat, amelyet a kliensalkalmazás használ új access token beszerzésére a jelenlegi token lejárata után. Az access tokentől eltérően a refresh token nem kerül elküldésre minden API-kéréssel — a kliens oldali biztonságos tárban tárolódik, és csak a hitelesítési szerver token endpointjának elérésekor használjuk.
A fő ötlet a két különböző élettartamú token szétválasztása. A rövid TTL-lel rendelkező access token csökkenti a támadási ablakot az elfogáskor: ha az access token lopott, a támadó csak néhány percig használhatja. Refresh token azáltal védett, hogy soha nem kerül elküldésre a szokványos kérésekkel — csak egy biztonságos csatornán keresztül a token endpointra. Ez lényegesen megnehezíti az ellopását.
A OAuth Security Workshop, 2025 szerint a refresh token rotationnal történő bevezetése 85%-kal csökkenti a munkamenet kompromittálódásának kockázatát egyetlen hosszú élettartamú access token tárolásához képest.
A frissítési folyamat akkor indul, amikor a kliens HTTP 401 Unauthorized választ kap, vagy észleli, hogy az access token lejárt (exp ellenőrzés JWT-ben). A kliens POST kérést küld a szerver token endpointjára grant_type=refresh_token és magával a refresh tokennel a kérés törzsében. A szerver ellenőrzi a refresh token érvényességét, lejárati idejét és a client_id-hez való tartozását. Ha minden rendben van — a szerver új access tokent és opcionálisan új refresh tokent ad vissza.
A frissítési kérés sémája így néz ki: a kliens POST-ot küld a /oauth/token címre a grant_type=refresh_token, refresh_token={token} és client_id={id} paraméterekkel. A szerver JSON-t ad vissza az új access tokennal és lejárattal:
{
"access_token": "eyJhbGciOi...nowy-token",
"token_type": "Bearer",
"expires_in": 1800,
"refresh_token": "nowy-refresh-token"
}
Refresh token rotation (új refresh token visszaadása) az OAuth 2.0 Security Best Current Practice (RFC 9700) által ajánlott. A régi refresh token ezzel érvénytelenítődik. Ha egy támadó ellopta a régi refresh tokent, és sikerült azt a jogos kliens előtt használnia, a szerver észleli az ismételt használatot — reuse detection — és blokkolja a teljes munkamenetet.
Access token és refresh token különböző funkciókat töltenek be és alapvetően különböző biztonsági jellemzőkkel rendelkeznek. Az access token ideiglenes belépő az API-hoz, a refresh token hosszú távú engedély új belépők beszerzésére.
| Paraméter | Access Token | Refresh Token |
|---|---|---|
| Élettartam | 15–60 perc | Napok, hetek vagy hónapok |
| Küldési gyakoriság | Minden API-kérés | Csak frissítéskor |
| Tároló a kliensen | Memória / rövid távú | Biztonságos (Keychain / EncryptedSharedPrefs) |
| Scope | Meghatározott jogosultságkészlet | A felhasználó teljes jogosultsági köre |
| Visszavonás | Rövid TTL útján | Szerver oldali blacklist / törlés |
| Formátum | JWT vagy opaque | Általában opaque (véletlenszerű karakterlánc) |
Rövid TTL (élettartam) az access token esetén — tudatos biztonsági kompromisszum. Ha az access tokent ellopják (forgalom elfogásával, naplószivárgással, rosszindulatú programmal az eszközön), az idő, amíg a támadó használhatja, 15–60 percre korlátozódik. A refresh token azáltal védett, hogy soha nem kerül elküldésre minden kéréssel — elfogása célzott támadást igényel a token endpoint ellen. A Auth0 Security Team, 2025 szerint a kompromittált access tokenek 90%-a nem biztonságos hálózati kapcsolatokon keresztül került elfogásra — pontosan az, ami ellen a refresh token az architektúrája által védett.
Biztonság a refresh token esetén — a teljes hitelesítési rendszer kritikus eleme. Mivel a refresh token teljes hozzáférést biztosít a fiókhoz hosszú időn keresztül, védelmének maximálisnak kell lennie. Az OWASP és az OAuth Security Best Practices konkrét követelményeket tesz közzé.
Helyes tárolás a platformtól függ. iOS-en — Keychain kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly hozzáféréssel. Ez garantálja, hogy a token nem érhető el, ha az eszköz jelszavát eltávolítják. Androidon — EncryptedSharedPreferences az AndroidX Security Library-ből, a rendszergazda kulccsal az Android Keystore-ban. A token fájlszinten van titkosítva, és még root hozzáféréssel sem érhető el. Tilos: refresh token tárolása SharedPreferences-ben, NSUserDefaults-ban, plain-text fájlokban vagy Base64-ben titkosítás nélkül.
A Google Security Blog, 2025 szerint az AES256-GCM-mel ellátott EncryptedSharedPreferences 99.7%-kal csökkenti a token szivárgásának kockázatát a hagyományos SharedPreferences-hez képest fizikai eszközhozzáférés esetén. A biztonság fokozása érdekében ajánlott a tárolók szétválasztása is: az access token tárolható az operatív memóriában (rövid távú hozzáférés), a refresh token — csak a biztonságos rendszertárolóban (Keychain / Keystore). Ha az alkalmazás foreground jelet kap a rendszertől, a refresh token érvényessége ellenőrződik, és szükség esetén frissül, mielőtt a felhasználó megkezdené az interakciót.
Refresh token rotation — olyan mechanizmus, amelyben minden access token frissítési kérés új refresh tokent ad vissza, és a régit törli. Ha egy támadó ellopott egy refresh tokent és használja, a jogos kliens a következő frissítési próbálkozáskor hibát kap — a szerver érzékeli, hogy a refresh token már használatban volt (reuse detection). A rotation az OAuth 2.0 Security Best Current Practice (RFC 9700) kötelező ajánlása minden olyan rendszer számára, amely hosszú élettartamú tokenekkel dolgozik mobil környezetben.
A detection algoritmusa így működik: a szerver „used” jelzőt tárol az adatbázisban minden kiadott refresh tokenhez. A frissítési kérésnél a szerver ellenőrzi — ha a refresh token már használtként van megjelőlve, ez ismételt használati kísérletet jelent. A szerver azonnal érvényteleníti a munkamenet összes refresh tokenjét és blokkolja a hozzáférést. A jogos felhasználó átirányítódik a bejelentkezési oldalra. Ez megakadályozza a refresh token lopási támadásokat: a támadó hozzáférést szerez, de a munkamenet azonnal blokkolódik észlelés után.
A OAuth Security Workshop, 2025 szerint a rotation + reuse detection bevezetésével a sikeres támadás valószínűsége ellopott refresh token segítségével 23%-ról 0.3%-ra csökken. A reuse detection megvalósításához a szerver az utolsó kiadott refresh token hash-ét tárolja a client_id-vel párosítva. A frissítési kérésnél a szerver összehasonlítja a bemutatott refresh tokent a tárolttal — ha nem egyeznek, az ismételt használatot jelent, és a teljes tokenlánc érvénytelenítődik.
Az invalid_grant hiba kézhezvételekor a kliensnek teljes kijelentkezést kell végrehajtania: törölnie kell az összes tárolt tokent (access és refresh), be kell fejeznie az aktuális munkamenetet az eszközön, és át kell irányítania a felhasználót a bejelentkezési képernyőre. Az újrahitelesítés új tokenláncot hoz létre, amely nem kapcsolódik az előzőhöz. A hiba figyelmen kívül hagyása és az ismételt frissítési kísérletek a reuse detection általi blokkoláshoz vezetnek.
Példa a token frissítés kliens oldali megvalósítására Kotlinban Androidhoz. Az alkalmazás elfogja a HTTP 401-es választ, meghív egy frissítési kérést, és megismétli az eredeti kérést az új access tokennal. OkHttp Interceptor használatos — egy kulcsfontosságú komponens a tokenek automatikus kezeléséhez anélkül, hogy a logikát minden kérésben meg kellene ismételni.
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 lejárt — frissítjük refresh token segítségével
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")
// Új refresh token mentése rotation esetén
saveTokens(newAccessToken, json.optString("refresh_token"))
return newAccessToken
}
}
Gyakran Ismételt Kérdések
Access token — rövid élettartamú token az API-hoz való hozzáféréshez, minden kéréssel elküldődik. Refresh token — hosszú élettartamú token új access token beszerzéséhez, csak a token endpointra küldődik. A refresh token nem lehet elérhető az alkalmazás szokványos API-végpontjai számára.
Minden lejáratkor — általában 15–60 percenként. A kliensnek nyomon kell követnie a lejárati időt (exp ellenőrzés JWT-ben vagy időzítő), és előre el kell indítania a frissítési kérést, még a tényleges 401 fogadása előtt. Ez megakadályozza az adatvesztést a token lejáratának pillanatában elküldött kérések esetén.
Igen, a refresh token visszavonható és vissza is kell vonni. A szerver az aktív refresh tokenek (vagy azok hash-einek) listáját tárolja az adatbázisban. Kijelentkezéskor, jelszóváltoztatáskor vagy gyanús tevékenységnél a szerver törli a rekordot az adatbázisból, és a következő frissítési kérés ezzel a tokennal invalid_grant hibát ad vissza.
Bevezetett rotation mellett reuse detection: az első kérés sikeresen frissíti a tokeneket, a második invalid_grant hibát kap. A szerver rögzíti az ismételt használatot — a munkamenet blokkolódik, mindkét kliens elveszíti a hozzáférést. A felhasználónak újra be kell jelentkeznie. Ez a kényelem feláldozása a biztonságért.
A refresh tokent a Keychain-ben kell tárolni a kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly attribútummal. Ez garantálja a token titkosítását, elérhetetlenségét a jelszó eltávolításakor, és kizárja az iCloudon keresztüli szinkronizálást. A UserDefaults vagy CoreData használata a token tárolására szigorúan tilos.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is