Refresh Token হল একটি বিশেষ ধরনের দীর্ঘস্থায়ী টোকেন যা ব্যবহারকারীকে পুনরায় credentials প্রদান না করেই একটি নতুন access token পাওয়ার জন্য ডিজাইন করা হয়েছে। OAuth 2.0 এবং OpenID Connect আর্কিটেকচারে, access token-এর জীবনকাল ছোট (15–60 মিনিট), অন্যদিকে refresh token-এর জীবনকাল উল্লেখযোগ্যভাবে দীর্ঘ (কয়েক ঘন্টা থেকে মাস পর্যন্ত)। IETF RFC 6749, 2012 অনুসারে, refresh_token নির্বিঘ্ন প্রমাণীকরণ সক্ষম করে: ব্যবহারকারী একবার লগইন করে, এবং অ্যাপ্লিকেশন ওয়ার্কফ্লোকে বাধা না দিয়ে স্বয়ংক্রিয়ভাবে অ্যাক্সেস নবায়ন করে।
মূল পয়েন্ট
Refresh Token হল একটি credential যা ক্লায়েন্ট অ্যাপ্লিকেশন বর্তমান 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% হ্রাস পায়।
রিফ্রেশ প্রক্রিয়া শুরু হয় যখন ক্লায়েন্ট 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 ফেরত দেয়:
{
"access_token": "eyJhbGciOi...নতুন-টোকেন",
"token_type": "Bearer",
"expires_in": 1800,
"refresh_token": "নতুন-refresh-token"
}
Refresh token rotation (নতুন refresh_token ফেরত দেওয়া) OAuth 2.0 Security Best Current Practice (RFC 9700) দ্বারা সুপারিশকৃত। পুরানো refresh_token একই সময়ে বাতিল করা হয়। যদি কোনো আক্রমণকারী পুরানো refresh_token চুরি করে এবং বৈধ ক্লায়েন্টের আগে এটি ব্যবহার করতে সফল হয়, সার্ভার পুনর্ব্যবহার সনাক্ত করে — reuse detection — এবং পুরো সেশন ব্লক করে দেয়।
Access token এবং refresh_token ভিন্ন ভিন্ন কাজ করে এবং মৌলিকভাবে ভিন্ন নিরাপত্তা বৈশিষ্ট্য রাখে। access_token হল API-তে একটি অস্থায়ী পাস, অন্যদিকে refresh_token হল নতুন পাস পাওয়ার জন্য একটি দীর্ঘমেয়াদী অনুমতি।
| প্যারামিটার | Access Token | Refresh Token |
|---|---|---|
| জীবনকাল | 15–60 মিনিট | দিন, সপ্তাহ বা মাস |
| প্রেরণ ফ্রিকোয়েন্সি | প্রতি API অনুরোধ | শুধুমাত্র রিফ্রেশের সময় |
| ক্লায়েন্ট সংরক্ষণ | মেমোরি / স্বল্পমেয়াদী | নিরাপদ (Keychain / EncryptedSharedPrefs) |
| পরিধি | নির্দিষ্ট অনুমতির সেট | সম্পূর্ণ ব্যবহারকারীর অনুমতি |
| বাতিলকরণ | ছোট TTL-এর মাধ্যমে | সার্ভার ব্ল্যাকলিস্ট / মুছে ফেলা |
| ফরম্যাট | JWT বা opaque | সাধারণত opaque (এলোমেলো স্ট্রিং) |
access_token-এর জন্য ছোট TTL একটি ইচ্ছাকৃত নিরাপত্তা আপস। যদি access_token চুরি হয় (ট্র্যাফিক ইন্টারসেপশন, লগ লিকেজ, বা ডিভাইসে ম্যালওয়ারের মাধ্যমে), যে সময়কালে আক্রমণকারী এটি ব্যবহার করতে পারে তা 15–60 মিনিটের মধ্যে সীমাবদ্ধ। refresh_token সুরক্ষিত কারণ এটি প্রতিটি অনুরোধের সাথে কখনও প্রেরিত হয় না — এটি ইন্টারসেপ্ট করতে টোকেন endpoint-এ লক্ষ্যবস্তু আক্রমণের প্রয়োজন হয়। Auth0 Security Team, 2025 অনুসারে, 90% আপোসকৃত access_token অসুরক্ষিত নেটওয়ার্ক সংযোগের মাধ্যমে ইন্টারসেপ্ট করা হয়েছিল — ঠিক সেই জিনিস যা থেকে refresh_token তার নিজস্ব আর্কিটেকচার দ্বারা সুরক্ষিত।
refresh_token-এর নিরাপত্তা是整个 প্রমাণীকরণ স্কিমের একটি গুরুত্বপূর্ণ উপাদান। যেহেতু refresh_token একটি বর্ধিত সময়ের জন্য অ্যাকাউন্টে সম্পূর্ণ অ্যাক্সেস প্রদান করে, তাই এর সুরক্ষা সর্বাধিক হতে হবে। OWASP এবং OAuth Security Best Practices নির্দিষ্ট প্রয়োজনীয়তা প্রকাশ করে।
সঠিক সংরক্ষণ প্ল্যাটফর্মের উপর নির্ভর করে। 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 হল একটি প্রক্রিয়া যেখানে access_token রিফ্রেশ করার প্রতিটি অনুরোধ একটি নতুন refresh_token ফেরত দেয় এবং পুরানোটিকে বাতিল করা হয়। যদি কোনো আক্রমণকারী refresh_token চুরি করে এবং এটি ব্যবহার করে, বৈধ ক্লায়েন্ট পরবর্তী রিফ্রেশ প্রচেষ্টায় একটি ত্রুটি পাবে — সার্ভার সনাক্ত করে যে refresh_token ইতিমধ্যে ব্যবহার করা হয়েছে (reuse detection)। Rotation হল OAuth 2.0 Security Best Current Practice (RFC 9700)-এর একটি বাধ্যতামূলক সুপারিশ যা মোবাইল পরিবেশে দীর্ঘস্থায়ী টোকেনের সাথে কাজ করা সমস্ত সিস্টেমের জন্য।
সনাক্তকরণ অ্যালগরিদম নিম্নরূপ কাজ করে: সার্ভার প্রতিটি জারি করা refresh_token-এর জন্য ডাটাবেসে একটি "used" ফ্ল্যাগ সংরক্ষণ করে। রিফ্রেশ অনুরোধে, সার্ভার পরীক্ষা করে — যদি 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) মুছুন, ডিভাইসে বর্তমান সেশন শেষ করুন এবং ব্যবহারকারীকে লগইন স্ক্রিনে পুনঃনির্দেশিত করুন। পুনঃপ্রমাণীকরণ পূর্ববর্তীটির সাথে সম্পর্কহীন একটি নতুন টোকেন চেইন তৈরি করে। এই ত্রুটিটি উপেক্ষা করা এবং রিফ্রেশ পুনরায় চেষ্টা করা পুনর্ব্যবহার সনাক্তকরণের কারণে ব্লক হওয়ার কারণ হবে।
Android-এর জন্য Kotlin-এ ক্লায়েন্ট-সাইড টোকেন রিফ্রেশ বাস্তবায়নের একটি উদাহরণ। অ্যাপ HTTP 401 রেসপন্স ইন্টারসেপ্ট করে, একটি রিফ্রেশ অনুরোধ ট্রিগার করে এবং নতুন access_token সহ মূল অনুরোধটি পুনরায় চেষ্টা করে। OkHttp Interceptor ব্যবহার করা হয় — প্রতিটি অনুরোধে লজিক ডুপ্লিকেট না করে স্বয়ংক্রিয় টোকেন ব্যবস্থাপনার জন্য একটি মূল উপাদান।
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
}
}
সচরাচর জিজ্ঞাসিত প্রশ্ন
Access token — API অ্যাক্সেসের জন্য স্বল্পস্থায়ী টোকেন, প্রতিটি অনুরোধের সাথে পাঠানো হয়। refresh_token — নতুন access_token পাওয়ার জন্য দীর্ঘস্থায়ী টোকেন, শুধুমাত্র টোকেন endpoint-এ পাঠানো হয়। refresh_token অ্যাপ্লিকেশনের সাধারণ API endpoints-এ অ্যাক্সেসযোগ্য হওয়া উচিত নয়।
প্রতিটি মেয়াদ শেষ হওয়ায় — সাধারণত প্রতি 15–60 মিনিটে। ক্লায়েন্টের মেয়াদ শেষ হওয়ার সময় ট্র্যাক করা উচিত (JWT-তে exp চেক বা টাইমার ব্যবহার করে) এবং প্রকৃতপক্ষে 401 পাওয়ার আগেই রিফ্রেশ অনুরোধ শুরু করা উচিত। এটি টোকেন মেয়াদ শেষ হওয়ার মুহূর্তে পাঠানো অনুরোধগুলিতে ডেটা ক্ষতি প্রতিরোধ করে।
হ্যাঁ, refresh_token বাতিল করা সম্ভব এবং করা উচিত। সার্ভার ডাটাবেসে সক্রিয় refresh_token (বা তাদের হ্যাশ) এর একটি তালিকা রাখে। লগআউট, পাসওয়ার্ড পরিবর্তন বা সন্দেহজনক কার্যকলাপে, সার্ভার ডাটাবেস থেকে এন্ট্রি সরিয়ে দেয়, এবং সেই টোকেন সহ পরবর্তী রিফ্রেশ অনুরোধ invalid_grant ত্রুটি ফেরত দেবে।
rotation এবং পুনর্ব্যবহার সনাক্তকরণ সক্রিয় থাকলে: প্রথম অনুরোধ সফলভাবে টোকেন রিফ্রেশ করে, দ্বিতীয়টি invalid_grant ত্রুটি পায়। সার্ভার পুনর্ব্যবহারও লগ করে — সেশন ব্লক হয়ে যায়, উভয় ক্লায়েন্ট অ্যাক্সেস হারায়। ব্যবহারকারীকে আবার লগইন করতে হবে। এটি নিরাপত্তার জন্য সুবিধা ত্যাগ করে।
refresh_token kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly অ্যাট্রিবিউট সহ Keychain-এ সংরক্ষণ করা উচিত। এটি টোকেন এনক্রিপশন, পাসকোড সরানো হলে অ্যাক্সেসযোগ্য না হওয়া নিশ্চিত করে এবং iCloud সিঙ্ক্রোনাইজেশন প্রতিরোধ করে। টোকেন সংরক্ষণের জন্য UserDefaults বা CoreData ব্যবহার করা কঠোরভাবে নিষিদ্ধ।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন