服務器端維護登陸狀態,使用傳統Cookie和Session方案,擴展性很差。而JWT可實現服務器無狀態,擴展性好。html
在單點登陸的時候,共享登陸狀態信息的實現有如下兩種方案:前端
JSON Web Token(JWT)是一個開放標準(RFC 7519),它定義了一種緊湊且獨立的方式,用於在各方之間做爲JSON對象安全地傳輸信息。 此信息能夠經過數字簽名進行驗證和信任。 JWT可使用HMAC對稱加密算法或RSA (ECDSA) 非對稱加密算法進行簽名。web
服務器認證之後,生成一個json對象,發回給客戶端。以後,客戶端與服務端通訊,回傳這個JSON對象。服務器靠這個對象認定用戶身份。爲防止用戶篡改數據,服務器生成這個對象的時候,會加上簽名。服務器再也不保存任何session數據,實現了服務無狀態,從而比較容易實現擴展。算法
Header.Payload.Signature數據庫
Base64URL算法json
Base64編碼後的字符串中可能包含 + 、/ 和 = 三個字符,在 URL 裏面有特殊含義,因此要被替換掉:= 被省略、+ 替換成-,/ 替換成 _ 。這就是 Base64URL 算法。api
JWT做爲一個令牌(token),有些場景可能會放到URL(如:api.example.com/?token=xxx),所以須要採用Base64URL 算法將Header 和 Payload 轉化爲字符串。瀏覽器
JWT可選擇的客戶端存儲位置包括sessionStorage、localStorage和cookie。三個位置各有優缺點,具體比較以下。安全
優勢 | 缺點 | |
---|---|---|
sessionStorage | 瀏覽器關閉即自動清除數據 | 存在不可跨瀏覽器窗口共享數據,跨窗口需從新登陸;可被JS讀取,可能受到XSS攻擊 |
localStorage | 可跨窗口共享數據,過時時間前可實現自動登陸 | 退出登陸或JWT過時需主動清除數據;可被JS讀取,可能受到XSS攻擊 |
cookie | 可設置httpOnly屬性防止被JS讀取,防止XSS攻擊;可設置secure保證JWT只在HTTPS下傳輸 | 容易受到CSRF攻擊 |
Token的初衷是防範CSRF攻擊。防範大概的原理是,cookie會被瀏覽器自動帶上,而token 或 JWT須要在發送請求前,前端代碼中去設置請求頭,防範了CSRF的攻擊。XSS攻擊的防範比較容易,所以筆者我的不推薦將JWT存在cookie裏(我的意見,不喜勿碰)。服務器
優勢:
缺點:
若是在用戶使用過程當中,JWT失效(過時時間到了),頁面跳轉至登陸頁,這樣會形成很差的用戶體驗。
從範圍來說,JWT屬於Token,Token的形式能夠多種多樣,不限於JWT這種Header.Payload.Signature樣子。JWT的特色大部分都適用於Token,固然Token也有本身的特性,本文(本次討論)沒有詳細討論Token相關內容,感興趣的小夥伴能夠自行發掘。