token & refresh token 機制總結
廢話
我在專案上寫了個配置頁面,之前很簡單直接登入,畢竟配置頁面自己人用就沒有做token機制,後來公司的安全稽核不過,現在要加上token和重新整理機制。小結一下。
token和重新整理機制
token機制就是在登入成功後返回一個token,並快取起來,之後每個請求頭裡帶上token,後端驗證不通過返回401,前端就直接跳轉到登入頁。這樣就能防止直接訪問某個連結就能跳到登入頁的尷尬局面。
token重新整理機制就是在使用的時候使用某個機制使得這個token不過期,不會跳轉到登入頁。而沒有使用的時候token會過期,他隔得太久了再調介面就是401,就會跳到登入頁。
兩種token重新整理機制
第一種(後端提供重新整理介面)
客戶端 | 服務端 | |
---|---|---|
--- | 傳送username & password | ---> |
<--- | 返回accesstoken & refreshtoken | --- |
--- | 訪問介面攜帶accesstoken | ---> |
<--- | 返回資訊/401 | --- |
--- | accesstoken過期訪問重新整理介面攜帶refreshtoken | ---> |
<--- | 返回新的accesstoken/401 | --- |
--- | 訪問介面攜帶新的accesstoken | ---> |
<--- | 返回資訊/401 | --- |
這種情況下 refreshtoken可以設定的時間長一點,而accesstoken設定的時間短一點,我們固定一個使用者活躍週期;
活躍週期 = token週期 * 2 ;
eg:活躍週期(at);token週期(et);accesstoken(5 min);refreshtoken(1 day);
使用者在15:00登入,返回token生命週期(et)是[15:00-15:05];使用者活躍週期為[15:00-15:10];
如果使用者在15:06呼叫介面,攜帶accesstoken會返回401過期,此時在活躍週期範圍內,則呼叫refreshtoken重新整理介面,返回新的accesstoken;
此時:et[15:06-15:11],at[15:06-15:16];
如果使用者在15:17分呼叫介面攜帶accesstoken會返回401過期,此時不再活躍週期內,則跳轉到登入頁;
第二種(靠前端cookie實現)
客戶端 | 服務端 | |
---|---|---|
--- | 傳送username & password | ---> |
<--- | 返回accesstoken | --- |
cookie儲存設定過期時間 | ||
--- | 訪問介面攜帶accesstoken | ---> |
<--- | 返回資訊/401 | ---> |
呼叫成功,覆蓋延長cookie過期時間 | ---> |
這種情況後端accesstoken可以設定的時間長一點;
前端將token存在cookie中,維護一個過期時間,每次呼叫介面成功後就覆蓋延長這個過期時間,不呼叫介面的時候自然會超時了;
以上;