為什么需要refresh token
refreshToken就是用來(lái)在accessToken過(guò)期以后來(lái)重新獲取accessToken的
0.使用流程
-> 1.登錄成功獲得 refresh token 并持久化
-> 2.通過(guò) refresh token 請(qǐng)求刷新得到 access token 并臨時(shí)儲(chǔ)存
-> 3.請(qǐng)求業(yè)務(wù)接口使用 access token
-> 4.access token 過(guò)期或者快過(guò)期再次回到「 2 」
-> 5.refresh token 也過(guò)期則生命周期結(jié)束,需重新登錄
1.使用場(chǎng)景來(lái)看
- 如果是一個(gè)前后端分離的項(xiàng)目,使用springsecurity+jwt這種,前端用戶(hù)在登錄以后,后端返回給前端一個(gè)accessToken,如果沒(méi)有refresh token,又因?yàn)橐驗(yàn)榘踩騛ccessToken過(guò)期時(shí)間會(huì)設(shè)置的比較短,在accessToken過(guò)期以后,用戶(hù)將會(huì)被強(qiáng)制重新登錄,影響用戶(hù)體驗(yàn)
而如果使用refresh Token,如果用戶(hù)持續(xù)地訪問(wèn)這個(gè)網(wǎng)站,他們可以一直保持登錄狀態(tài),而不需要定期重新登錄 - 如果是業(yè)務(wù)服務(wù)器之間的相互調(diào)用,那么此時(shí)只用一個(gè)Access Token即可,強(qiáng)制重新登錄影響不大,只不過(guò)是如果使用 Refresh Token 在獲取新的 Access Token 的時(shí)候比直接重新登錄會(huì)方便一小丟丟
2.從是否需要讀取額外的狀態(tài)來(lái)看
token 的過(guò)期時(shí)間一般會(huì)比 refeshToken 的過(guò)期時(shí)間短很多,保證 token 被盜取后無(wú)法持久的做壞事,通過(guò) AccessToken 訪問(wèn),只要通過(guò)簽名校驗(yàn)合法即可通行,無(wú)需讀取額外的狀態(tài)來(lái)進(jìn)一步確認(rèn)是否撤銷(xiāo),當(dāng) AccessToken 過(guò)期以后再通過(guò) RefreshToken 讀取額外的狀態(tài)(數(shù)據(jù)庫(kù) /緩存)確認(rèn)是否繼續(xù)簽發(fā)
3.從安全程度來(lái)看
access token 有效期短 被盜損失更小 安全性更高
如果refresh token被盜了 想刷新access token的話(huà) 也需要提供過(guò)期的refresh token 盜取難度增加
同時(shí)refresh token只有在第一次獲取和刷新access token時(shí)才會(huì)在網(wǎng)絡(luò)中傳輸,因此被盜的風(fēng)險(xiǎn)遠(yuǎn)小于access token 從而在一定程度上 更安全了一點(diǎn)
所謂的更安全就是讓盜取信息者更不容易獲得而已
關(guān)于 token 過(guò)期的疑惑,為什么需要 refresh token? - 糯米PHP (nuomiphp.com)
沒(méi)有理解refresh token的必要性或者說(shuō)其為何比access token安全
Web API與OAuth:既生access token,何生refresh token
RFC 6819: OAuth 2.0 Threat Model and Security Considerations (rfc-editor.org)