موبائل ایپس کے لیے Refresh Token — جوہر، تجدید کا طریقہ کار اور محفوظ ذخیرہ

مصنف: IT Sectr اشاعت: 2026-04-05 مطالعے کا وقت: 9 منٹ

Refresh Token ایک خاص قسم کا طویل المدت ٹوکن ہے جو صارف کو دوبارہ اسناد درج کیے بغیر نیا access token حاصل کرنے کے لیے ڈیزائن کیا گیا ہے۔ OAuth 2.0 اور OpenID Connect فن تعمیر میں، access token کی عمر مختصر (15–60 منٹ) ہوتی ہے، جبکہ refresh token کی عمر نمایاں طور پر لمبی ہوتی ہے (کئی گھنٹوں سے مہینوں تک)۔ IETF RFC 6749، 2012 کے مطابق، refresh_token ہموار تصدیق کو ممکن بناتا ہے: صارف ایک بار لاگ ان کرتا ہے، اور ایپلیکیشن ورک فلو میں خلل ڈالے بغیر خود بخود رسائی کی تجدید کرتی ہے۔

اہم نکات

  • Refresh Token — دوبارہ لاگ ان کیے بغیر نیا access token حاصل کرنے کے لیے طویل المدت ٹوکن
  • مختصر المدت access token — رساو کی صورت میں خطرہ کم کرتا ہے: حملہ آور 15–30 منٹ تک رسائی حاصل کرتا ہے
  • Token rotation — تجدید کی ہر درخواست نیا refresh token لوٹاتی ہے، پرانا غیر فعال ہو جاتا ہے
  • محفوظ ذخیرہ — iOS Keychain، Android EncryptedSharedPreferences، کبھی NSUserDefaults میں نہیں
  • Refresh token کے دوبارہ استعمال کا پتہ لگانا — چوری سے تحفظ: اگر چوری شدہ refresh token استعمال ہوتا ہے تو سیشن مسدود ہو جاتا ہے

Refresh Token کیا ہے؟

Refresh Token ایک اسناد ہے جو کلائنٹ ایپلیکیشن موجودہ access token کی میعاد ختم ہونے کے بعد نیا access token حاصل کرنے کے لیے استعمال کرتی ہے۔ access token کے برعکس، refresh_token ہر API درخواست کے ساتھ نہیں بھیجا جاتا — یہ کلائنٹ پر محفوظ ذخیرے میں رکھا جاتا ہے اور صرف تصدیقی سرور کے ٹوکن endpoint سے رابطہ کرتے وقت استعمال ہوتا ہے۔

بنیادی خیال مختلف عمروں والے دو ٹوکنز کو الگ کرنا ہے۔ مختصر TTL والا access_token روکے جانے کی صورت میں حملے کی کھڑکی کو کم کرتا ہے: اگر access_token چوری ہو جائے تو حملہ آور اسے صرف چند منٹوں کے لیے استعمال کر سکتا ہے۔ Refresh Token اس حقیقت سے محفوظ ہے کہ یہ عام درخواستوں کے ساتھ کبھی منتقل نہیں ہوتا — صرف ٹوکن endpoint تک محفوظ چینل کے ذریعے۔ یہ اس کی چوری کو نمایاں طور پر مشکل بنا دیتا ہے۔

OAuth Security Workshop، 2025 کے مطابق، ایک طویل المدت access token کو ذخیرہ کرنے کے مقابلے میں refresh token rotation کو نافذ کرنے سے سیشن سے سمجھوتہ ہونے کا خطرہ 85% کم ہو جاتا ہے۔

Refresh Token کیسے کام کرتا ہے

تجدید کا عمل اس وقت شروع ہوتا ہے جب کلائنٹ کو HTTP 401 Unauthorized جواب ملتا ہے یا پتہ چلتا ہے کہ access_token کی میعاد ختم ہو گئی ہے (JWT میں exp کی جانچ)۔ کلائنٹ grant_type=refresh_token اور درخواست کے باڈی میں refresh_token کے ساتھ سرور کے ٹوکن endpoint کو POST درخواست بھیجتا ہے۔ سرور refresh_token کی درستگی، اس کی میعاد ختم ہونے اور client_id سے تعلق کی تصدیق کرتا ہے۔ اگر سب کچھ درست ہے — سرور نیا access_token اور اختیاری طور پر نیا refresh_token لوٹاتا ہے۔

ٹوکن تجدید کا بہاؤ

تجدید کی درخواست کا خاکہ اس طرح ہے: کلائنٹ /oauth/token پر پیرامیٹرز grant_type=refresh_token، refresh_token={token} اور client_id={id} کے ساتھ POST بھیجتا ہے۔ سرور نئے access_token اور میعاد ختم ہونے کے ساتھ JSON لوٹاتا ہے:

json
{
  "access_token": "eyJhbGciOi...نیا-ٹوکن",
  "token_type": "Bearer",
  "expires_in": 1800,
  "refresh_token": "نیا-refresh-ٹوکن"
}

Refresh token rotation (نیا refresh_token لوٹانا) OAuth 2.0 Security Best Current Practice (RFC 9700) کے ذریعہ تجویز کیا جاتا ہے۔ پرانا refresh_token اسی وقت غیر فعال کر دیا جاتا ہے۔ اگر کسی حملہ آور نے پرانا refresh_token چرا لیا اور جائز کلائنٹ سے پہلے اسے استعمال کرنے میں کامیاب ہو گیا، تو سرور دوبارہ استعمال کا پتہ لگاتا ہے — reuse detection — اور پورے سیشن کو مسدود کر دیتا ہے۔

Refresh Token بمقابلہ Access Token

Access token اور refresh_token مختلف کام انجام دیتے ہیں اور بنیادی طور پر مختلف حفاظتی خصوصیات رکھتے ہیں۔ access_token API کے لیے ایک عارضی پاس ہے، جبکہ refresh_token نئے پاس حاصل کرنے کے لیے طویل مدتی اجازت ہے۔

پیرامیٹرAccess TokenRefresh Token
عمر15–60 منٹدن، ہفتے یا مہینے
ترسیل کی تعددہر API درخواستصرف تجدید کے دوران
کلائنٹ کا ذخیرہمیموری / مختصر مدتمحفوظ (Keychain / EncryptedSharedPrefs)
دائرہ کاراجازتوں کا مخصوص سیٹمکمل صارف کی اجازتیں
منسوخیمختصر TTL کے ذریعےسرور بلیک لسٹ / حذف کرنا
فارمیٹJWT یا opaqueعام طور پر opaque (بے ترتیب سٹرنگ)

access_token طویل المدت کیوں نہیں ہو سکتا

access_token کے لیے مختصر TTL ایک جان بوجھ کر حفاظتی سمجھوتہ ہے۔ اگر access_token چوری ہو جاتا ہے (ٹریفک کی روک تھام، لاگ کے رساو، یا ڈیوائس پر میلویئر کے ذریعے)، وہ مدت جس کے دوران حملہ آور اسے استعمال کر سکتا ہے 15–60 منٹ تک محدود ہے۔ refresh_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 پر — kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly رسائی کے ساتھ Keychain۔ یہ یقینی بناتا ہے کہ جب ڈیوائس کا پاس کوڈ ہٹا دیا جائے تو ٹوکن ناقابل رسائی ہے۔ Android پر — Android Keystore میں ماسٹر کلید کے ساتھ AndroidX Security لائبریری سے EncryptedSharedPreferences۔ ٹوکن فائل سسٹم کی سطح پر خفیہ کردہ ہے اور root رسائی کے باوجود بھی ناقابل رسائی رہتا ہے۔ ممنوع: SharedPreferences، NSUserDefaults، سادہ متن والی فائلوں یا بغیر خفیہ کاری کے Base64 میں refresh_token کو ذخیرہ کرنا۔

Google Security Blog، 2025 کے مطابق، AES256-GCM کے ساتھ EncryptedSharedPreferences ڈیوائس تک جسمانی رسائی کی صورت میں عام SharedPreferences کے مقابلے میں ٹوکن کے رساو کے خطرے کو 99.7% تک کم کرتی ہیں۔ حفاظت بڑھانے کے لیے، ذخیرہ کو الگ کرنے کی بھی سفارش کی جاتی ہے: 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) کی ایک لازمی سفارش ہے۔

دوبارہ استعمال کا پتہ لگانا

پتہ لگانے کا الگورتھم اس طرح کام کرتا ہے: سرور ڈیٹا بیس میں جاری کردہ ہر refresh_token کے لیے ایک "استعمال شدہ" جھنڈا ذخیرہ کرتا ہے۔ تجدید کی درخواست پر، سرور جانچ کرتا ہے — اگر refresh_token پہلے سے استعمال شدہ کے طور پر نشان زد ہے، تو دوبارہ استعمال کی کوشش ہوئی ہے۔ سرور فوری طور پر اس سیشن کے تمام refresh_token کو غیر فعال کر دیتا ہے اور رسائی کو مسدود کر دیتا ہے۔ جائز صارف لاگ ان صفحے پر بھیج دیا جاتا ہے۔

OAuth Security Workshop، 2025 کے مطابق، rotation + reuse detection کو نافذ کرنے سے چوری شدہ refresh_token کے ذریعے کامیاب حملے کا امکان 23% سے 0.3% تک کم ہو جاتا ہے۔ دوبارہ استعمال کا پتہ لگانے کو نافذ کرنے کے لیے، سرور client_id کے ساتھ جوڑا بنا کر آخری جاری کردہ refresh_token کا ہیش ذخیرہ کرتا ہے۔ تجدید کی درخواست پر، سرور پیش کردہ refresh_token کا ذخیرہ شدہ سے موازنہ کرتا ہے — اگر وہ مماثل نہیں ہیں، تو دوبارہ استعمال ہوا ہے اور پوری ٹوکن چین منسوخ کر دی جاتی ہے۔

invalid_grant خرابی موصول ہونے پر، کلائنٹ کو مکمل لاگ آؤٹ کرنا ہوگا: ذخیرہ شدہ تمام ٹوکنز (access اور refresh) صاف کریں، ڈیوائس پر موجودہ سیشن ختم کریں، اور صارف کو لاگ ان اسکرین پر بھیج دیں۔ دوبارہ تصدیق پچھلے سلسلے سے غیر متعلق ایک نیا ٹوکن سلسلہ بناتی ہے۔ اس خرابی کو نظر انداز کرنا اور تجدید کی دوبارہ کوشش کرنا دوبارہ استعمال کا پتہ لگنے کی وجہ سے مسدود ہونے کا باعث بنے گا۔

Kotlin میں نفاذ

Android کے لیے Kotlin میں کلائنٹ سائیڈ ٹوکن تجدید کے نفاذ کی ایک مثال۔ ایپ HTTP 401 جواب کو روکتی ہے، تجدید کی درخواست شروع کرتی ہے، اور نئے access_token کے ساتھ اصل درخواست کو دوبارہ آزماتی ہے۔ OkHttp Interceptor استعمال کیا جاتا ہے — ہر درخواست میں منطق کو نقل کیے بغیر خودکار ٹوکن مینجمنٹ کے لیے ایک اہم جزو۔

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")
        // rotation کے دوران نیا refresh token محفوظ کریں
        saveTokens(newAccessToken, json.optString("refresh_token"))
        return newAccessToken
    }
}

اکثر پوچھے گئے سوالات

refresh token access token سے کیسے مختلف ہے؟

Access token — API تک رسائی کے لیے مختصر المدت ٹوکن، ہر درخواست کے ساتھ بھیجا جاتا ہے۔ Refresh_token — نیا access_token حاصل کرنے کے لیے طویل المدت ٹوکن، صرف ٹوکن endpoint پر بھیجا جاتا ہے۔ Refresh_token ایپلیکیشن کے عام API endpoints سے قابل رسائی نہیں ہونا چاہیے۔

access token کو کتنی بار تجدید کرنا چاہیے؟

ہر میعاد ختم ہونے پر — عام طور پر ہر 15–60 منٹ بعد۔ کلائنٹ کو میعاد ختم ہونے کے وقت کو ٹریک کرنا چاہیے (JWT میں exp کی جانچ یا ٹائمر کا استعمال) اور حقیقت میں 401 موصول ہونے سے پہلے تجدید کی درخواست شروع کرنی چاہیے۔ یہ ٹوکن کی میعاد ختم ہونے کے لمحے بھیجی گئی درخواستوں پر ڈیٹا کے نقصان کو روکتا ہے۔

کیا سرور پر refresh token منسوخ کیا جا سکتا ہے؟

جی ہاں، refresh_token کو منسوخ کیا جا سکتا ہے اور کیا جانا چاہیے۔ سرور ڈیٹا بیس میں فعال refresh_token (یا ان کے ہیش) کی ایک فہرست رکھتا ہے۔ لاگ آؤٹ، پاس ورڈ کی تبدیلی یا مشکوک سرگرمی پر، سرور ڈیٹا بیس سے اندراج ہٹا دیتا ہے، اور اس ٹوکن کے ساتھ تجدید کی اگلی درخواست invalid_grant خرابی لوٹائے گی۔

اگر دو کلائنٹ ایک ساتھ پرانا refresh token استعمال کریں تو کیا ہوتا ہے؟

rotation اور دوبارہ استعمال کا پتہ لگانے کے فعال ہونے پر: پہلی درخواست کامیابی سے ٹوکنز کی تجدید کرتی ہے، دوسری کو invalid_grant خرابی ملتی ہے۔ سرور دوبارہ استعمال کو بھی ریکارڈ کرتا ہے — سیشن مسدود ہو جاتا ہے، دونوں کلائنٹ رسائی کھو دیتے ہیں۔ صارف کو دوبارہ لاگ ان کرنا ہوگا۔ یہ سہولت کو حفاظت کی خاطر قربان کرتا ہے۔

iOS میں refresh token کہاں محفوظ طریقے سے ذخیرہ کیا جائے؟

Refresh_token کو kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly وصف کے ساتھ Keychain میں ذخیرہ کیا جانا چاہیے۔ یہ ٹوکن کی خفیہ کاری، پاس کوڈ ہٹانے پر ناقابل رسائی ہونے کی ضمانت دیتا ہے، اور iCloud مطابقت پذیری کو روکتا ہے۔ ٹوکن کو ذخیرہ کرنے کے لیے UserDefaults یا CoreData کا استعمال سختی سے منع ہے۔

خلاصہ

  • Refresh Token — دوبارہ لاگ ان کیے بغیر access_token کی تجدید کے لیے طویل المدت ٹوکن
  • access_token کا مختصر TTL (15–60 منٹ) رساو سے نقصان کو کم کرتا ہے
  • Token rotation — ہر تجدید نیا refresh_token لوٹاتی ہے، پرانا غیر فعال ہو جاتا ہے
  • دوبارہ استعمال کا پتہ لگانا — ٹوکن کی چوری کا پتہ لگاتا ہے اور سیشن کو مسدود کرتا ہے
  • ذخیرہ — iOS Keychain، Android EncryptedSharedPreferences (AES256-GCM)
  • سرور کی منسوخی — لاگ آؤٹ یا پاس ورڈ کی تبدیلی پر ڈیٹا بیس سے refresh_token ہٹانا
  • Refresh token عام API درخواستوں کے ساتھ کبھی منتقل نہیں ہوتا

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں