入門(mén)教程:http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
跨域認(rèn)證的問(wèn)題
- 用戶(hù)向服務(wù)器發(fā)送用戶(hù)名和密碼。
- 服務(wù)器驗(yàn)證通過(guò)后,在當(dāng)前對(duì)話(session)里面保存相關(guān)數(shù)據(jù),比如用戶(hù)角色、登錄時(shí)間等等。
- 服務(wù)器向用戶(hù)返回一個(gè) session_id,寫(xiě)入用戶(hù)的 Cookie。
- 用戶(hù)隨后的每一次請(qǐng)求,都會(huì)通過(guò) Cookie,將 session_id 傳回服務(wù)器。
- 服務(wù)器收到 session_id,找到前期保存的數(shù)據(jù),由此得知用戶(hù)的身份。
JWT 的原理
服務(wù)器認(rèn)證以后,生成一個(gè) JSON 對(duì)象,發(fā)回給用戶(hù),以后,用戶(hù)與服務(wù)端通信的時(shí)候,都要發(fā)回這個(gè) JSON 對(duì)象。服務(wù)器完全只靠這個(gè)對(duì)象認(rèn)定用戶(hù)身份。為了防止用戶(hù)篡改數(shù)據(jù),服務(wù)器在生成這個(gè)對(duì)象的時(shí)候,會(huì)加上簽名。
服務(wù)器就不保存任何 session 數(shù)據(jù)了,也就是說(shuō),服務(wù)器變成無(wú)狀態(tài)了,從而比較容易實(shí)現(xiàn)擴(kuò)展。
JWT 的數(shù)據(jù)結(jié)構(gòu)
- Header(頭部)
- Payload(負(fù)載)
- Signature(簽名)
JWT 的使用方式
客戶(hù)端收到服務(wù)器返回的 JWT,可以?xún)?chǔ)存在 Cookie 里面,也可以?xún)?chǔ)存在 localStorage。
此后,客戶(hù)端每次與服務(wù)器通信,都要帶上這個(gè) JWT。你可以把它放在 Cookie 里面自動(dòng)發(fā)送,但是這樣不能跨域,所以更好的做法是放在 HTTP 請(qǐng)求的頭信息Authorization字段里面。
JWT 的幾個(gè)特點(diǎn)
(1)JWT 默認(rèn)是不加密,但也是可以加密的。生成原始 Token 以后,可以用密鑰再加密一次。
(2)JWT 不加密的情況下,不能將秘密數(shù)據(jù)寫(xiě)入 JWT。
(3)JWT 不僅可以用于認(rèn)證,也可以用于交換信息。有效使用 JWT,可以降低服務(wù)器查詢(xún)數(shù)據(jù)庫(kù)的次數(shù)。
(4)JWT 的最大缺點(diǎn)是,由于服務(wù)器不保存 session 狀態(tài),因此無(wú)法在使用過(guò)程中廢止某個(gè) token,或者更改 token 的權(quán)限。也就是說(shuō),一旦 JWT 簽發(fā)了,在到期之前就會(huì)始終有效,除非服務(wù)器部署額外的邏輯。
(5)JWT 本身包含了認(rèn)證信息,一旦泄露,任何人都可以獲得該令牌的所有權(quán)限。為了減少盜用,JWT 的有效期應(yīng)該設(shè)置得比較短。對(duì)于一些比較重要的權(quán)限,使用時(shí)應(yīng)該再次對(duì)用戶(hù)進(jìn)行認(rèn)證。
(6)為了減少盜用,JWT 不應(yīng)該使用 HTTP 協(xié)議明碼傳輸,要使用 HTTPS 協(xié)議傳輸。