前言
? ? B/S架構(gòu)大家應(yīng)該都不陌生,web1.0時代,用戶通過個人電腦瀏覽網(wǎng)站,單項獲取信息,比如我們?yōu)g覽新聞,查閱資料等。web2.0很快就到來,和1.0相比,用戶可以隨時隨地分享自己的信息。這個時候就涉及到了我們的身份認證。當我們使用http無狀態(tài)請求訪問資源服務(wù)的時候,服務(wù)端是如何知道我們的身份的,我們今天就來聊一聊。????????????
傳統(tǒng)方式下的身份認證
? ?? ?傳統(tǒng)方式的身份認證,我們要從cookie和session說起來,我們先回顧一下cookie和session是有什么特點吧。
-
Cookie:存儲在客戶端的,客戶端專門存東西的一個標識。
1.能存儲的東西很少,基本上只能存儲4k左右的東西 2.能被手動清除,不續(xù)期的情況下,只有20分鐘的有效期 3.Cookie安全問題,別人能從本地Cookie中獲取信息 4.Cookie不能直接存儲中文,如果需要,則需要進行url轉(zhuǎn)碼 5.不能跨域,不能跨域,不能跨域。
-
Session:存儲在服務(wù)器端的,服務(wù)端專門存東西的一個標識。
1.安全性:Session的安全性比Cookie的安全性要高 2.性能:當服務(wù)器訪問較多,比較占用性能 3.生命周期:異常關(guān)機會造成Session的銷毀,默認存儲30分鐘 4.Session的鈍化以及活化 鈍化:服務(wù)器正常關(guān)閉后,tomcat會自動將Session數(shù)據(jù)寫入硬盤的文件中 活化:服務(wù)器再次啟動后,從文件中加載數(shù)據(jù)到Session中 5.瀏覽器關(guān)閉后再次重啟SessionId的地址值不為同一個 4.訪問范圍:Session為一個瀏覽器共享 Cookie為多個瀏覽器共享
? ?? ?基于 cookie、session 的身份認證中,用戶登錄后,服務(wù)器會為登錄用戶創(chuàng)建一個 session,cookie的驗證是有狀態(tài)的,sessionid 會保存 在cookie 中。當用戶登錄成功后,之后的每次請求都會攜帶cookie。服務(wù)器通過 cookie 中的 sessionid 找到內(nèi)存中的 session 數(shù)據(jù),來驗證用戶身份,從而在響應(yīng)中返回相應(yīng)的數(shù)據(jù)。我們可以參照下圖進行理解
????這個圖看著是沒什么問題了對不,以前大多數(shù)B/S架構(gòu)都采用這種實現(xiàn)方式,有的同學(xué)就說了:“我現(xiàn)在這么實現(xiàn)也ok啊,我干嘛還要去研究那個token呢?”,那你們可以想一想,當你的后端服務(wù)需要水平擴展的時候,你的session怎么辦?當然我們也是有一些常規(guī)做法的。例如服務(wù)之間的session同步方案、分布式緩存方案、用戶負載方案。我們一個一個來說。
1.session同步,就是在用戶登錄成功產(chǎn)生session之后,在你的各個服務(wù)上進行session同步,保證請求能夠暢通訪問其他服務(wù),這個開銷不得不說是很大的。
2.分布式緩存,將session存儲在分布式緩存中,所有服務(wù)都從緩存中獲取用戶session。這是在集群中增加了中間件,代價也不小。
3.用戶負載,這是一個偷奸耍滑的方案,通過nginx負載,將同一個用戶的請求指向最初登錄的那個服務(wù)器。
token如何實現(xiàn)身份認證
? ?? ?前面我們說了session方案需要考慮服務(wù)擴展問題,那么有沒有更好的解決方案呢?這就得從我們的Jwt(json web token)說起了,現(xiàn)在流行的應(yīng)用架構(gòu),很多都用使用jwt基于token實現(xiàn)身份認證的。什么是Jwt前面的文章有解釋。那么如何實現(xiàn)呢,我們簡單的說明一下token實現(xiàn)身份認證的步驟。
- 用戶登錄成功服務(wù)端返回token
- 之后每次用戶請求都攜帶token,在Authorization Header中。
- 后端服務(wù)取出token進行decode,判斷有效期及失效策略。
- 返回對應(yīng)的成功失敗
? ?? ?常用的token身份認證方案有兩種,一種是單token方案,另外一種是雙token方案。下面我們就來分別看圖理解一下兩種方案的認證及續(xù)期過程。
單token續(xù)期方案
1.用戶登錄,服務(wù)端返回生成的Jwt,攜帶必要的信息。
2.用戶再次訪問時均需要在Authorization Header中攜帶Jwt。
3.服務(wù)端有配置好的token失效時間或者次數(shù),還有重新登錄期限。每次登錄會記錄當前登錄時間。
4.用戶攜帶token訪問時,服務(wù)端根據(jù)token失效時間和重新登錄期限判斷返回對應(yīng)代碼
5.當token有效時,服務(wù)端返回對應(yīng)資源。
6.當token失效時,前端拿到錯誤代碼后重新請求refresh token接口進行token刷新,該接口會返回新的有效token給前端。
7.前端下次請求會攜帶刷新后的新token訪問。
8.當某次訪問時,服務(wù)端判斷token使用時長超過了定義好的登錄期限,則返回重新登錄錯誤代碼給前端,前端拿到代碼后跳轉(zhuǎn)至登錄頁面。
雙token續(xù)期方案
1.用戶登錄返回access_token、refresh_token。
2.用戶請求資源時攜帶access_token。
3.當access_token有效時,返回對應(yīng)的資源。
4.當服務(wù)端校驗access_token失效,則返回對應(yīng)錯誤代碼。
5.前端拿到access_token失效對應(yīng)的錯誤代碼,發(fā)起刷新token請求,本次請求攜帶之前緩存的refresh_token。
6.服務(wù)端拿到refresh_token,判斷是否有效,失效則返回重新登錄錯誤代碼。
7.前端拿到重新登錄錯誤代碼則跳轉(zhuǎn)登錄頁面。文章來源:http://www.zghlxwxcb.cn/news/detail-415449.html
小結(jié)
? ?? ?可以看到,使用token進行身份認證,不僅將服務(wù)端的存儲壓力分攤到了客戶端上,并且可以讓服務(wù)端進行毫無顧及的擴展,除此之外也不存在跨域問題,對于移動端也更加友好,不僅如此,Jwt的加密使得這種方案在安全性上更上一層樓。因此,各位架構(gòu)師們,這是一種不得不掌握的身份認證方案。
點贊收藏,富婆包養(yǎng)??文章來源地址http://www.zghlxwxcb.cn/news/detail-415449.html
到了這里,關(guān)于基于token的身份認證及自動續(xù)期的解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!