JSON Web Token,一般用它來(lái)替換掉Session實(shí)現(xiàn)數(shù)據(jù)共享。
使用基于 Token 的身份驗(yàn)證方法,在服務(wù)端不需要存儲(chǔ)用戶的登錄記錄。大概的流程是這樣的:
1、客戶端通過(guò)用戶名和密碼登錄服務(wù)器;
2、服務(wù)端對(duì)客戶端身份進(jìn)行驗(yàn)證;
3、服務(wù)端對(duì)該用戶生成Token,返回給客戶端;
4、客戶端將Token保存到本地瀏覽器,一般保存到cookie中;
5、客戶端發(fā)起請(qǐng)求,需要攜帶該Token;
6、服務(wù)端收到請(qǐng)求后,首先驗(yàn)證Token,之后返回?cái)?shù)據(jù)。
如上圖為Token實(shí)現(xiàn)方式,瀏覽器次訪問(wèn)服務(wù)器,根據(jù)傳過(guò)來(lái)的唯一標(biāo)識(shí)userId,服務(wù)端會(huì)通過(guò)一些算法,如常用的HMAC-SHA256算法,然后加一個(gè)密鑰,生成一個(gè)token,然后通過(guò)BASE64編碼一下之后將這個(gè)token發(fā)送給客戶端;客戶端將token保存起來(lái),下次請(qǐng)求時(shí),帶著token,服務(wù)器收到請(qǐng)求后,然后會(huì)用相同的算法和密鑰去驗(yàn)證token,如果通過(guò),執(zhí)行業(yè)務(wù)操作,不通過(guò),返回不通過(guò)信息。
可以對(duì)比下圖session實(shí)現(xiàn)方式,流程大致一致。
優(yōu)點(diǎn):
無(wú)狀態(tài)、可擴(kuò)展 :在客戶端存儲(chǔ)的Token是無(wú)狀態(tài)的,并且能夠被擴(kuò)展?;谶@種無(wú)狀態(tài)和不存儲(chǔ)Session信息,負(fù)載均衡器能夠?qū)⒂脩粜畔囊粋€(gè)服務(wù)傳到其他服務(wù)器上。
安全:請(qǐng)求中發(fā)送token而不再是發(fā)送cookie能夠防止CSRF(跨站請(qǐng)求偽造)。
可提供接口給第三方服務(wù):使用token時(shí),可以提供可選的權(quán)限給第三方應(yīng)用程序。
多平臺(tái)跨域
對(duì)應(yīng)用程序和服務(wù)進(jìn)行擴(kuò)展的時(shí)候,需要介入各種各種的設(shè)備和應(yīng)用程序。 假如我們的后端api服務(wù)器a.com只提供數(shù)據(jù),而靜態(tài)資源則存放在cdn 服務(wù)器b.com上。當(dāng)我們從a.com請(qǐng)求b.com下面的資源時(shí),由于觸發(fā)瀏覽器的同源策略限制而被阻止。
我們通過(guò)CORS(跨域資源共享)標(biāo)準(zhǔn)和token來(lái)解決資源共享和安全問(wèn)題。
舉個(gè)例子,我們可以設(shè)置b.com的響應(yīng)首部字段為: