Refresh Token — istifadəçinin daxil etdiyi məlumatları təkrar daxil etmədən yeni access token əldə etmək üçün nəzərdə tutulmuş xüsusi bir uzunömürlü token növüdür. OAuth 2.0 və OpenID Connect arxitekturasında access token qısa ömürlüdür (15–60 dəqiqə), refresh token isə çox daha uzun müddət ömürlüdür (bir neçə saatdan aylara qədər). IETF RFC 6749, 2012 məlumatlarına görə, refresh token fasiləsiz autentifikasiyanı həyata keçirməyıməə imkan verir: istifadəçi bir dəfə daxil olur və tətbiq işi dayandırmadan avtomatik olaraq girişi yeniləyir.
Başlıca
Refresh Token — müştəri tətbiqinin cari access tokenin müddəti bitdikdən sonra yenisini əldə etmək üçün istifadə etdiyi etimadnamədir. Access token-dən fərqli olaraq, refresh token hər API sorğusunda göndərilmir — o, müştəri tərəfdə təhlükəsiz anbarda saxlanılır və yalnız autentifikasiya serverinin token endpoint-ə müraciət edərkən istifadə olunur.
Əsas ideya müxtəlif ömürlü iki tokenin ayrılmasıdır. Qısa TTL ilə access token onun kəsilməsi zamanı hücum pəncərəsini azaldır: əgər access token oğurlandıqda, təcavüzkar onu yalnız bir neçə dəqiqə istifadə edə bilər. Refresh token adi sorğularda heç vaxt göndərilməməklə qorunur — yalnız token endpoint-ə təhlükəsiz kanal vasitəsilə. Bu, onun oğurlandılmasını xeyli çətinləşdirir.
OAuth Security Workshop, 2025 məlumatlarına görə, rotation ilə refresh token tətbiqi bir uzunömürlü access token saxlamaqla müqayisədə sessiyanın kompromat olma riskini 85% azaldır.
Yeniləmə prosesi müştəri HTTP 401 Unauthorized cavabı aldıqda və ya access tokenin müddətinin bitdiyini aşkarladıqda (JWT-də exp yoxlanılması) başlayır. Müştəri sorğunun gövdəsində grant_type=refresh_token və refresh token özü ilə serverin token endpoint-ə POST sorğusu göndərir. Server refresh tokenin etibarlılığını, onun istifadə müddətini və client_id-ə aidliyini yoxlayır. Hər şey düzgündürsə — server yeni access token və isteğə bağlı olaraq yeni refresh token qaytarır.
Yeniləmə sorğu sxemi belə görünür: müştəri /oauth/token ünvanına grant_type=refresh_token, refresh_token={token} və client_id={id} parametrləri ilə POST göndərir. Server yeni access token və müddət ilə JSON qaytarır:
{
"access_token": "eyJhbGciOi...nowy-token",
"token_type": "Bearer",
"expires_in": 1800,
"refresh_token": "nowy-refresh-token"
}
Refresh token rotation (yeni refresh tokenin qaytarılması) OAuth 2.0 Security Best Current Practice (RFC 9700) tərəfindən tövsiyə olunur. Köhnə refresh token bununla etibarsız edilir. Əgər təcavüzkar köhnə refresh tokeni oğurlamış və onu qanuni müştəridən əvvəl istifadə etməyə müvəffəq olmuşsa, server təkrari istifadəni aşkar edəcək — reuse detection — və bütün sessiyanı bloklayacaq.
Access token və refresh token müxtəlif funksiyaları yerinə yetirir və prinsipial olaraq fərqli təhlükəsizlik xüsusiyyətlərinə malikdir. Access token API-ə müvəqqəti keçiddir, refresh token isə yeni keçidlər əldə etmək üçün uzunmüddətli icazədir.
| Parametr | Access Token | Refresh Token |
|---|---|---|
| Ömür müddəti | 15–60 dəqiqə | Günlər, həftələr və ya aylar |
| Göndərilmə tezliyi | Hər API sorğusu | Yalnız yeniləmə zamanı |
| Müştəri anbarı | Yaddaş / qısamüddətli | Təhlükəsiz (Keychain / EncryptedSharedPrefs) |
| Scope | Müəyyən edilmiş hüquq dəsti | İstifadəçinin tam hüquq dairəsi |
| Ləğv | Qısa TTL vasitəsilə | Server blacklist / silinmə |
| Format | JWT və ya opaque | Adətən opaque (təsadüfi sətir) |
Qısa TTL access token — bu şürurlı təhlükəsizlik kompromisidir. Əgər access token oğurlandıqda (trafikin kəsilməsi, log sızıntısı, cihazdakı zərərli proqram vasitəsilə), təcavüzkarın onu istifadə edə biləcəyi vaxt 15–60 dəqiqə ilə məhdudlaşır. Refresh token hər sorğuda heç vaxt göndərilməməklə qorunur — onun kəsilməsi token endpoint-ə yönəldilmiş hücum tələb edir. Auth0 Security Team, 2025 məlumatlarına görə, kompromat olmuş access tokenlərin 90%-i qorunmayan şəbəkə əlaqələri vasitəsilə kəsilmişdir — yəni refresh tokenin arxitekturanın özü ilə qorunduğu şey.
Təhlükəsizlik refresh token — bütün autentifikasiya sxeminin kritik elementidir. Refresh token uzun müddət ərzində hesaba tam giriş təmin etdiyindən, onun qorunması maksimum olmalıdır. OWASP və OAuth Security Best Practices konkret tələblər dərc edir.
Düzgün saxlama platformadan asılıdır. iOS-da — kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly girişi ilə Keychain. Bu, tokenin cihaz şifrəsi çıxarıldıqda əlçatmaz olmasını təmin edir. Android-də — Android Keystore-da master açarla EncryptedSharedPreferences AndroidX Security Library-dən. Token fayl sistemi səviyyəsində şifrələnir və hətta root girişində belə əlçatmazdır. Qadağandır: refresh tokeni SharedPreferences, NSUserDefaults, plain-text fayllarda və ya şifrələmədən Base64-də saxlamaq.
Google Security Blog, 2025 məlumatlarına görə, AES256-GCM ilə EncryptedSharedPreferences cihaza fiziki giriş zamanı adi SharedPreferences ilə müqayisədə token sızıntısı riskini 99.7% azaldır. Təhlükəsizliyi gücləndirmək üçün anbarları ayırmaq da tövsiyə olunur: access token operativ yaddaşda saxlanıla bilər (qısamüddətli giriş), refresh token — yalnız qorunan sistem anbarında (Keychain / Keystore). Əgər tətbiq sistemdən foreground siqnalı alırsa, refresh token etibarlılıq üçün yoxlanılır və zəruri olduqda istifadəçi qarşılıqlı əlaqəyə başlamazdan əvvəl yenilənir.
Refresh token rotation — hər access token yeniləmə sorğusunun yeni refresh token qaytardığı və köhnəsinin ləğv edildiyi mexanizmdir. Əgər təcavüzkar refresh tokeni oğurlamış və ondan istifadə edərsə, qanuni müştəri növbəti yeniləmə cəhdində xəta alacaq — server refresh tokenin artıq istifadə edildiyini aşkar edəcək (reuse detection). Rotation OAuth 2.0 Security Best Current Practice (RFC 9700) tərəfindən mobil mühitdə uzunömürlü tokenlərlə işləyən bütün sistemlər üçün məcburi tövsiyədir.
Detection alqoritmi belə işləyir: server verilənlər bazasında hər verilmiş refresh token üçün „used” işarəsi saxlayır. Yeniləmə sorğusunda server yoxlayır — əgər refresh token artıq istifadə edilmiş kimi qeyd olunubsa, bu təkrari istifadə cəhdi deməkdir. Server dərhal bu sessiyanın bütün refresh tokenlərini etibarsız edir və girişi bloklayır. Qanuni istifadəçi giriş səhifəsinə yönləndirilir. Bu, refresh token oğurlandılması hücumlarının qarşısını alır: təcavüzkar giriş əldə edir, lakin aşkarlandıqdan dərhal sonra sessiya bloklanır.
OAuth Security Workshop, 2025 məlumatlarına görə, rotation + reuse detection tətbiqi ilə oğurlandıq refresh token vasitəsilə uğurlu hücum ehtimalı 23%-dən 0.3%-ə düşür. Reuse detection tətbiqi üçün server son verilmiş refresh tokenin hashini client_id ilə cütdə saxlayır. Yeniləmə sorğusunda server təqdim edilmiş refresh tokeni saxlanılan ilə müqayisə edir — əgər uyğum gəlməzlərsə, bu təkrari istifadə deməkdir və bütün token zənciri ləğv edilir.
invalid_grant xətasını aldıqda müştəri tam logout həyata keçirməlidir: bütün saxlanılan tokenləri (access və refresh) təmizləməli, cihazda cari sessiyanı bitirməli və istifadəçini giriş ekranına yönləndirməlidir. Təkrar autentifikasiya əvvəlki ilə əlaqəsi olmayan yeni token zənciri yaradır. Bu xətanı görməməzlikdən gəlmək və təkrar refresh cəhdləri reuse detection səbəbindən bloklanmaya səbəb olacaq.
Android üçün Kotlin-də token yeniləməsinin müştəri hissəsinin tətbiq nümunəsi. Tətbiq HTTP 401 cavabını kəsir, refresh sorğusu göndərir və orijinal sorğunu yeni access token ilə təkrarlayır. OkHttp Interceptor istifadə olunur — hər sorğuda mantiqanı təkrarlamadan tokenləri avtomatik idarə etmək üçün əsas komponent.
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 tokenin müddəti bitdi — refresh token vasitəsilə yeniləyirik
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")
// Rotation zamanı yeni refresh token saxla
saveTokens(newAccessToken, json.optString("refresh_token"))
return newAccessToken
}
}
Tez-tez verilən suallar
Access token — API-ə giriş üçün qısamüddətli token, hər sorğu ilə göndərilir. Refresh token — yeni access token əldə etmək üçün uzunömürlü token, yalnız token endpoint-ə göndərilir. Refresh token tətbiqin adəti API endpointləri üçün əlçatan olmamalıdır.
Hər müddət bitdikdə — adətən hər 15–60 dəqiqə. Müştəri müddətin bitmə vaxtını izləməli (JWT-də exp yoxlanılması və ya taymer) və faktiki 401 alınmazdan əvvəl refresh sorğusunu başlatmalıdır. Bu, tokenin müddətinin bitdiyi anda göndərilmiş sorğularda məlumat itkisinin qarşısını alır.
Bəli, refresh tokeni ləğv etmək olar və lazımdır. Server verilənlər bazasında aktiv refresh tokenlərin (və ya onların heşlərinin) siyahısını saxlayır. Logout, şifrə dəyişikliyi və ya şühbəli aktivlik zamanı server verilənlər bazasından qeydi silir və bu token ilə növbəti yeniləmə sorğusu invalid_grant xətası qaytaracaq.
Tətbiq edilmiş rotation reuse detection ilə: birinci sorğu tokenləri uğurla yeniləyir, ikincisi invalid_grant xətası alır. Server də təkrari istifadəni qeyd edir — sessiya bloklanır, hər iki müştəri girişi itirir. İstifadəçi yenidən daxil olmalıdır. Bu, təhlükəsizlik naminə rahatlıqdan qurban verməkdir.
Refresh tokeni Keychain-də kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly atributu ilə saxlamaq lazımdır. Bu, tokenin şifrələnməsini, şifrə çıxarıldıqda əlçatmazlığını təmin edir və iCloud vasitəsilə sinxronizasiyanı istisna edir. Token saxlamaq üçün UserDefaults və ya CoreData istifadəsi qəti qadağandır.
Nəticələr
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun