淺談node使用jwt生成的token應該存在哪裡
答:通常存儲在客戶端裡。
jwt 即 JSON Web Token,是一種認證協議,一般用來校驗請求的身份信息和身份權限。
早上逛某乎的時候,遇到一位同學在問這個問題,很好奇jwt的存儲位置。剛好前段時間在學習此內容,不請自邀,厚顏強答。
最開始我也很好奇這個token怎麼保存,還差點想搞個redis存儲這個token。
後來查閱資料才知道,原來這個token,服務端是可以不保存的。隻需要客戶端保存好就行,無論什麼保持方式,甚至你讓用戶寫紙條揣兜裡都可以!
那這個token是怎麼工作的呢?
先來說說需要服務端存儲的操作,即傳統的session會話的做法。
首先要做用戶登陸,先要在服務端維護一個登陸表,這個登陸表可以放在緩存裡,也可以放進數據庫裡。
當用戶登陸的時候,把用戶信息寫入這個登陸表,然後導出一個登陸id,也就是所謂的session,把這個session返回給客戶的,讓客戶端下次請求把這個信息帶上來。
對於前端的小夥伴來說,這個過程通常無感知,後端的老哥們使用一個叫set-cookie的http頭字段,自己把數據寫入瀏覽器cookie裡瞭。然後請求的時候,瀏覽器又會自己把cookie寫進請求頭裡面。
當客戶端請求進入服務端時,服務端拿到cookie裡面的session,然後到登陸表裡面去查用戶信息,校驗用戶權限,然後即可完成正常的業務交互。
誒,那現在我因為各種亂七八糟的原因,不想維護一個登錄表瞭,想想要怎麼搞?
簡單呀,直接把用戶信息發給客戶端,讓客戶端每次把用戶信息都帶過來,這樣請求一進來,連表都不用查,直接就知道是哪個用戶在請求。
但是這樣子,用戶的信息都曝光瞭,那些中間人呀,最喜歡這種耿直請求瞭,他們直接拿個凳子坐在你服務器端口,坐個幾天,你數據庫裡的全傢老表就被別人扒個清清楚楚。
這樣肯定不行,那怎麼辦?
加個密再混個淆唄,這樣老哥們拿到你的token,一時半會也一臉懵逼,大概率會大大咧咧地走瞭,隻留下少部分有備(KPI)而來的老哥在苦苦尋求破解。
而你在服務端一解密,你就拿到用戶信息瞭,同樣的,你把過期時間也寫進密文裡面,遇到過期就401跳登錄頁。這樣,一個不需要後端存儲登錄憑證的方案就出爐咯。
這就是jwt最基本的工作原理:就是把身份信息交給客戶端保管。
jwt生成的token由header、payload、signature三部分組成,這三個部分用小數點“.”分隔開。
header,也就是頭部信息,是描述這個token基本信息,是一個json格式:
{ "alg":"HS256", "typ":"JWT" }
alg代表的是後面signature簽名部分的生成加密算法,typ表示該token是jwt類型。
payload,就是你的那些用戶數據啦,也是一個json格式。不過jwt不建議將敏感數據放進裡面,因為規范裡,payload和header一樣,僅僅隻是做一次base64編碼後顯示在token上。
signature,是這個token的簽名,通常情況下是將前面的header和payload加上一個你自己定義的私鑰字符串一起加密生成的字符串。
因為前面說瞭,jwt僅僅是將payload的內容做一次base64編碼,所以那些攻擊者老哥要改你的內容還是很簡單的,但是老哥們不知道你的私鑰啊,改瞭之後沒法生成正確的簽名,用加密的方式再次對請求進來的header.payload進行校驗,發現跟signature對不上,這時候你就可以很清楚知道,有人在搞事情,直接返回個500假裝服務器掛瞭。
如果想更安全,建議全程使用https協議進行請求通信。
當然,你已經瞭解瞭這個工作原理,自己搞一套惡心人的規范,也不是不行,比如,把payload再加一次密然後gzip下等等。
那,采用jwt的好處都有啥?
第一點,自然是服務端不需要維護一個登陸表瞭,節省空間,特別是用戶多的情況。
第二點,拓展簡單,前提是你不搞事情,老老實實遵守采用json格式去表述你的內容。
第三點,無狀態,隻要服務端支持解析,就可以開展業務,不需要專門搞個機制去共享session,方便加機子。
第四點,支持各種各樣的客戶端,不支持cookie也能玩。
壞處嘛,自然就是每次請求都要把這些數據帶來帶去的,肯定是增加瞭請求內容的。而且,每次請求進來你都要去校驗,去拿header和paylaod加一次密與signature校驗,也會增加請求的處理時間。這個與傳統操作相比,其實是一個時間與空間之間的權衡問題,最後,還是看你選擇咯。
到此這篇關於淺談node使用jwt生成的token應該存在哪裡的文章就介紹到這瞭,更多相關jwt生成的token存哪裡內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 關於JWT與cookie和token的區別說明
- 前端node Session和JWT鑒權登錄示例詳解
- Node使用koa2實現一個簡單JWT鑒權的方法
- java開發web前端cookie session及token會話機制詳解
- JS前端認證授權技巧歸納總結