Refresh Token para sa mga mobile app — esensya, mekanismo ng pag-refresh, at ligtas na imbakan

May-akda: IT Sectr Nai-publish: 2026-04-05 Oras ng pagbabasa: 9 min

Refresh Token — ay isang espesyal na uri ng mahabang-buhay na token na idinisenyo upang makakuha ng bagong access token nang hindi kinakailangang muling mag-input ng mga kredensyal ng gumagamit. Sa arkitektura ng OAuth 2.0 at OpenID Connect, ang access token ay may maikling buhay (15–60 minuto), habang ang refresh token ay may mas mahabang buhay (mula ilang oras hanggang buwan). Ayon sa IETF RFC 6749, 2012, pinapayagan ng refresh token ang walang patid na autentikasyon: isang beses lang nag-log in ang gumagamit, at awtomatikong nire-refresh ng app ang access nang hindi naaabala ang trabaho.

Mga Pangunahing Punto

  • Refresh Token — mahabang-buhay na token para makakuha ng bagong access token nang hindi muling nag-la-login
  • Maikling access token — binabawasan ang panganib sa pagtagas: ang attacker ay makakakuha ng access sa loob ng 15–30 minuto
  • Token rotation — bawat refresh request ay nagbabalik ng bagong refresh token, ang luma ay na-i-invalidate
  • Ligtas na imbakan — iOS Keychain, Android EncryptedSharedPreferences, huwag kailanman sa NSUserDefaults
  • Refresh token reuse detection — proteksyon laban sa pagnanakaw: kung ginamit ang ninakaw na refresh token, blinoblock ang session

Ano ang Refresh Token?

Refresh Token — ay isang kredensyal na ginagamit ng client application upang makakuha ng bagong access token pagkatapos mag-expire ang kasalukuyan. Hindi tulad ng access token, ang refresh token ay hindi ipinapadala sa bawat API request — ito ay naka-imbak sa isang ligtas na imbakan sa client at ginagamit lamang kapag ina-access ang token endpoint ng authentication server.

Ang pangunahing ideya ay paghiwalayin ang dalawang token na may magkaibang haba ng buhay. Ang access token na may maikling TTL ay nagbabawas ng window ng pag-atake kapag ito ay naharang: kung ang access token ay ninakaw, magagamit lamang ito ng attacker sa loob ng ilang minuto. Refresh token ay protektado sa pamamagitan ng hindi pagpapadala nito sa mga ordinaryong request — sa pamamagitan lamang ng secure na channel sa token endpoint. Ginagawa nitong mas mahirap ang pagnanakaw nito.

Ayon sa OAuth Security Workshop, 2025, ang pagpapatupad ng refresh token na may rotation ay nagbabawas ng panganib ng kompromiso ng session ng 85% kumpara sa pag-iimbak ng isang mahabang-buhay na access token.

Paano Gumagana ang Refresh Token

Ang proseso ng pag-refresh ay na-trigger kapag ang client ay nakatanggap ng HTTP 401 Unauthorized na tugon o nakita na ang access token ay nag-expire (pagsusuri ng exp sa JWT). Ang client ay nagpapadala ng POST request sa token endpoint ng server na may grant_type=refresh_token at ang refresh token mismo sa katawan ng request. Sinusuri ng server ang validity ng refresh token, ang expiration date nito, at ang pag-aari nito sa client_id. Kung tama ang lahat — ang server ay nagbabalik ng bagong access token at, opsyonal, isang bagong refresh token.

Daloy ng Pag-refresh ng Token

Ang iskema ng refresh request ay ganito: ang client ay nagpapadala ng POST sa /oauth/token na may mga parameter na grant_type=refresh_token, refresh_token={token}, at client_id={id}. Ang server ay nagbabalik ng JSON na may bagong access token at expiration:

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

Refresh token rotation (pagbabalik ng bagong refresh token) ay inirerekomenda ng OAuth 2.0 Security Best Current Practice (RFC 9700). Ang lumang refresh token ay na-i-invalidate sa prosesong ito. Kung ang isang attacker ay nagnakaw ng lumang refresh token at nagamit ito bago ang lehitimong client, makikita ng server ang paulit-ulit na paggamit — reuse detection — at blinoblock ang buong session.

Refresh Token vs Access Token

Access token at refresh token ay may magkaibang function at may fundamentally magkaibang mga katangian ng seguridad. Ang access token ay isang pansamantalang pass sa API, ang refresh token ay isang pangmatagalang awtorisasyon upang makakuha ng mga bagong pass.

ParameterAccess TokenRefresh Token
Haba ng buhay15–60 minutoAraw, linggo, o buwan
Dalas ng pagpapadalaBawat API requestSa pag-refresh lamang
Imbakan sa clientMemorya / panandalianLigtas (Keychain / EncryptedSharedPrefs)
ScopeTiyak na hanay ng mga pahintulotBuong saklaw ng mga pahintulot ng gumagamit
PagbawiSa pamamagitan ng maikling TTLServer blacklist / pagtanggal
FormatJWT o opaqueKaraniwang opaque (random na string)

Bakit hindi maaaring maging mahabang-buhay ang access token

Maikling TTL ng access token — ito ay isang sinadyang kompromiso sa seguridad. Kung ang access token ay ninakaw (sa pamamagitan ng pagharang ng trapiko, pagtagas ng log, malware sa device), ang oras kung saan magagamit ito ng attacker ay limitado sa 15–60 minuto. Ang refresh token ay protektado sa pamamagitan ng hindi pagpapadala nito sa bawat request — ang pagharang nito ay nangangailangan ng isang target na pag-atake sa token endpoint. Ayon sa Auth0 Security Team, 2025, 90% ng mga nakompromisong access token ay naharang sa pamamagitan ng hindi secure na mga koneksyon sa network — eksakto kung saan ang refresh token ay protektado ng sarili nitong arkitektura.

Seguridad ng Refresh Token

Seguridad ng refresh token — kritikal na elemento ng buong authentication scheme. Dahil ang refresh token ay nagbibigay ng buong access sa account sa mahabang panahon, ang proteksyon nito ay dapat na maximum. Ang OWASP at OAuth Security Best Practices ay naglalathala ng mga tiyak na kinakailangan.

Pag-iimbak ng refresh token sa mga mobile device

Tamang pag-iimbak ay depende sa platform. Sa iOS — Keychain na may access na kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly. Ginagarantiyahan nito na ang token ay hindi available kapag ang password ng device ay inalis. Sa Android — EncryptedSharedPreferences mula sa AndroidX Security Library na may master key sa Android Keystore. Ang token ay naka-encrypt sa antas ng file system at hindi available kahit na may root access. Ipinagbabawal: mag-imbak ng refresh token sa SharedPreferences, NSUserDefaults, plain-text na mga file, o sa Base64 nang walang encryption.

Ayon sa Google Security Blog, 2025, ang EncryptedSharedPreferences na may AES256-GCM ay nagbabawas ng panganib ng pagtagas ng token ng 99.7% kumpara sa ordinaryong SharedPreferences sa pisikal na access sa device. Para sa pagpapalakas ng seguridad, inirerekomenda din ang paghiwalayin ang mga imbakan: ang access token ay maaaring iimbak sa operational memory (panandaliang access), refresh token — sa secure na system storage lamang (Keychain / Keystore). Kung ang app ay nakatanggap ng foreground signal mula sa system, ang refresh token ay sinusuri para sa validity at kung kinakailangan ay nire-refresh bago magsimula ang gumagamit ng interaksyon.

Refresh Token Rotation

Refresh token rotation — ay isang mekanismo kung saan ang bawat request na mag-refresh ng access token ay nagbabalik ng bagong refresh token, at ang luma ay kinakansela. Kung ang isang attacker ay nagnakaw ng refresh token at ginamit ito, ang lehitimong client ay makakatanggap ng error sa susunod na pagtatangka ng pag-refresh — makikita ng server na ang refresh token ay nagamit na (reuse detection). Ang rotation ay isang mandatoryong rekomendasyon ng OAuth 2.0 Security Best Current Practice (RFC 9700) para sa lahat ng system na nagtatrabaho sa mahabang-buhay na mga token sa mobile environment.

Reuse Detection

Algorithm ng detection ay ganito gumagana: ang server ay nag-iimbak sa database ng markang “used” para sa bawat inisyung refresh token. Sa refresh request, sinusuri ng server — kung ang refresh token ay minarkahan na bilang ginamit, nangangahulugan ito ng pagtatangka ng paulit-ulit na paggamit. Agad na i-i-invalidate ng server ang lahat ng refresh token ng session na ito at blinoblock ang access. Ang lehitimong gumagamit ay nire-redirect sa login page. Pinipigilan nito ang mga pag-atake ng pagnanakaw ng refresh token: ang attacker ay nakakakuha ng access, ngunit ang session ay blinoblock kaagad pagkatapos ng detection.

Ayon sa OAuth Security Workshop, 2025, sa pagpapatupad ng rotation + reuse detection, ang posibilidad ng matagumpay na pag-atake sa pamamagitan ng ninakaw na refresh token ay bumababa mula 23% hanggang 0.3%. Para sa implementasyon ng reuse detection, ang server ay nag-iimbak ng hash ng huling inisyung refresh token kasama ng client_id. Sa refresh request, ikinukumpara ng server ang ipinakitang refresh token sa naka-imbak — kung hindi sila magkatugma, nangangahulugan ito ng paulit-ulit na paggamit at ang buong chain ng token ay kinakansela.

Sa pagtanggap ng error na invalid_grant, ang client ay dapat magsagawa ng buong logout: linisin ang lahat ng naka-imbak na token (access at refresh), tapusin ang kasalukuyang session sa device, at i-redirect ang gumagamit sa login screen. Ang muling pag-authenticate ay lumilikha ng bagong chain ng token na hindi nauugnay sa nauna. Ang pagwawalang-bahala sa error na ito at paulit-ulit na pagtatangka ng pag-refresh ay hahantong sa pag-block sa pamamagitan ng reuse detection.

Implementasyon sa Kotlin

Halimbawa ng implementasyon ng client-side na pag-refresh ng token sa Kotlin para sa Android. Ina-intercept ng app ang HTTP 401 na tugon, tinatawagan ang refresh request, at inuulit ang orihinal na request na may bagong access token. Ginagamit ang OkHttp Interceptor — isang mahalagang component para sa awtomatikong pamamahala ng token nang hindi nagda-duplicate ng logic sa bawat request.

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 nag-expire — nire-refresh sa pamamagitan ng 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")
        // I-save ang bagong refresh token sa rotation
        saveTokens(newAccessToken, json.optString("refresh_token"))
        return newAccessToken
    }
}

Mga Madalas Itanong

Paano naiiba ang refresh token sa access token?

Access token — maikling-buhay na token para sa access sa API, ipinapadala sa bawat request. Refresh token — mahabang-buhay na token para makakuha ng bagong access token, ipinapadala lamang sa token endpoint. Ang refresh token ay hindi dapat maging available sa mga ordinaryong API endpoint ng app.

Gaano kadalas dapat i-refresh ang access token?

Sa bawat pag-expire — karaniwan tuwing 15–60 minuto. Dapat subaybayan ng client ang oras ng pag-expire (pagsusuri ng exp sa JWT o timer) at simulan ang refresh request nang maaga, bago talaga makatanggap ng 401. Pinipigilan nito ang pagkawala ng data sa mga request na ipinadala sa sandali ng pag-expire ng token.

Maaari bang bawiin ang refresh token sa server?

Oo, ang refresh token ay maaari at dapat bawiin. Ang server ay nag-iimbak ng listahan ng mga aktibong refresh token (o kanilang mga hash) sa database. Sa logout, pagbabago ng password, o kahina-hinalang aktibidad, tinatanggal ng server ang record mula sa database, at ang susunod na refresh request na may token na ito ay magbabalik ng error na invalid_grant.

Ano ang mangyayari sa sabay-sabay na paggamit ng lumang refresh token ng dalawang client?

Sa naka-implement na rotation na may reuse detection: ang unang request ay matagumpay na nagre-refresh ng mga token, ang pangalawa ay nakatanggap ng error na invalid_grant. Ang server ay nagtatala rin ng paulit-ulit na paggamit — ang session ay blinoblock, parehong client ay nawawalan ng access. Ang gumagamit ay dapat mag-log in muli. Ito ay pagsasakripisyo ng kaginhawahan para sa seguridad.

Saan ligtas na mag-imbak ng refresh token sa iOS?

Ang refresh token ay dapat iimbak sa Keychain na may attribute na kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly. Ginagarantiyahan nito ang encryption ng token, hindi pagiging available kapag inalis ang password, at hindi kasama ang synchronization sa pamamagitan ng iCloud. Ang paggamit ng UserDefaults o CoreData para sa pag-iimbak ng token ay mahigpit na ipinagbabawal.

Buod

  • Refresh Token — mahabang-buhay na token para mag-refresh ng access token nang hindi muling nag-la-login
  • Maikling TTL ng access token (15–60 min) ay nagmi-minimize ng pinsala mula sa pagtagas
  • Token rotation — bawat pag-refresh ay nagbabalik ng bagong refresh token, ang luma ay na-i-invalidate
  • Reuse detection — nakakakita ng pagnanakaw ng token at blinoblock ang session
  • Imbakan — iOS Keychain, Android EncryptedSharedPreferences (AES256-GCM)
  • Pagbawi ng server — pagtanggal ng refresh token mula sa database sa logout o pagbabago ng password
  • Refresh token ay hindi kailanman ipinapadala sa mga ordinaryong API request

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din