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