先總結(jié)一下現(xiàn)階段網(wǎng)站開發(fā)中網(wǎng)絡(luò)安全登錄方面的幾種架構(gòu)。本人擅長的是JAVA語言的,所以文章中大部分寫的java方面的相關(guān)技術(shù)。
第一種:前后端不分離的模式,像以前的spring+jsp、還有現(xiàn)在還有很多用戶的spring+模板等。登錄模式采用的是session存儲登錄信息。常用的安全框架主要有shiro,security。前端cookie中存儲后端返回的sessionid,后端服務(wù)通過判斷cookie中的sessionid判斷用戶的登錄狀態(tài)。
第二種:前后端分離模式。像springboot+vue,springboot+react,springboot+angular等都是屬于這種前后端分離的模式。前后端分離之后,后端服務(wù)沒法像之前一樣直接獲取token信息,只能通過異步請求的方式,將token傳入服務(wù)端進(jìn)行驗證。這種模式前后端通過token進(jìn)行交互,通過token記錄用戶登錄狀態(tài)。
前后端分離模式驗證token又分幾種情況:
- jwt模式(全稱JSON WEB TOKEN),也就是一種token的實現(xiàn)形式,放在前端就是一串加密的字符串,jwt字符串在用戶登錄請求接口的時候,由后端服務(wù)通過密鑰以及一些用戶權(quán)限信息生成的token返回給前端,前端cookie,或者storage中存儲token,在后邊的請求中都帶著這個token去請求后端服務(wù)的需要安全認(rèn)證的接口。后端會通過這個token進(jìn)行驗證,驗證是通過對應(yīng)的解密方式解密token,然后驗證token是否過期是否偽造。這里是重點,服務(wù)端不存儲token信息,只有一套加密解密操作,進(jìn)行jwt token的驗證。
- token+redis的模式。跟第一點一樣。不同的是,這里的token可以是一串不含任何信息的唯一性字符串,然后,用戶登錄的時候生成token,并且在redis緩存服務(wù)器中以key,value加過期時間的方式進(jìn)行存儲,這里一般會把用戶信息也放入進(jìn)來,最后把token返回給前端,用戶后邊掉用接口的時候,后端服務(wù)通過這個token從redis中取數(shù)據(jù)進(jìn)行token的驗證。
- jwt+token+redis模式。通過前面的描述,前兩種方式雖然有不同點,但是兩者完全可以結(jié)合使用。redis的靈活過期時間,jwt的無狀態(tài)設(shè)計。另,需要注意的是redis只是一個緩存數(shù)據(jù)庫,token可以直接存儲在數(shù)據(jù)庫中,通過其他方式比如記錄token的生成時間,判斷token是否過期。