Java 進(jìn)階 & 1分鐘理解Token ,Cookie,Session

在Web應(yīng)用中,HTTP請求是無狀態(tài)的。即:用戶第一次發(fā)起請求,與服務(wù)器建立連接并登錄成功后,為了避免每次打開一個(gè)頁面都需要登錄一下,就出現(xiàn)了cookie,Session。

Cookie

Cookie是客戶端保存用戶信息的一種機(jī)制,用來記錄用戶的一些信息,也是實(shí)現(xiàn)Session的一種方式。Cookie存儲(chǔ)的數(shù)據(jù)量有限,且都是保存在客戶端瀏覽器中。不同的瀏覽器有不同的存儲(chǔ)大小,但一般不超過4KB。因此使用Cookie實(shí)際上只能存儲(chǔ)一小段的文本信息。
例如:登錄網(wǎng)站,今輸入用戶名密碼登錄了,第二天再打開很多情況下就直接打開了。這個(gè)時(shí)候用到的一個(gè)機(jī)制就是Cookie。

Session

Session是另一種記錄客戶狀態(tài)的機(jī)制,它是在服務(wù)端保存的一個(gè)數(shù)據(jù)結(jié)構(gòu)(主要存儲(chǔ)的的SessionID和Session內(nèi)容,同時(shí)也包含了很多自定義的內(nèi)容如:用戶基礎(chǔ)信息、權(quán)限信息、用戶機(jī)構(gòu)信息、固定變量等),這個(gè)數(shù)據(jù)可以保存在集群、數(shù)據(jù)庫、文件中,用于跟蹤用戶的狀態(tài)。客戶端瀏覽器訪問服務(wù)器的時(shí)候,服務(wù)器把客戶端信息以某種形式記錄在服務(wù)器上。這就是Session。客戶端瀏覽器再次訪問時(shí)只需要從該Session中查找該客戶的狀態(tài)就可以了。

用戶第一次登錄后,瀏覽器會(huì)將用戶信息發(fā)送給服務(wù)器,服務(wù)器會(huì)為該用戶創(chuàng)建一個(gè)SessionId,并在響應(yīng)內(nèi)容(Cookie)中將該SessionId一并返回給瀏覽器,瀏覽器將這些數(shù)據(jù)保存在本地. 當(dāng)用戶再次發(fā)送請求時(shí),瀏覽器會(huì)自動(dòng)的把上次請求存儲(chǔ)的Cookie數(shù)據(jù)自動(dòng)的攜帶給服務(wù)器。服務(wù)器接收到請求信息后,會(huì)通過瀏覽器請求的數(shù)據(jù)中的SessionId判斷當(dāng)前是哪個(gè)用戶,然后根據(jù)SessionId在Session庫中獲取用戶的Session數(shù)據(jù)返回給瀏覽器。

例如:購物車,添加了商品之后客戶端處可以知道添加了哪些商品,而服務(wù)器端如何判別呢,所以也需要存儲(chǔ)一些信息就用到了Session。

如果說Cookie機(jī)制是通過檢查客戶身上的“通行證”來確定客戶身份的話,那么Session機(jī)制就是通過檢查服務(wù)器上的“客戶明細(xì)表”來確認(rèn)客戶身份。Session相當(dāng)于程序在服務(wù)器上建立的一份客戶檔案,客戶來訪的時(shí)候只需要查詢客戶檔案表就可以了。Session生成后,只要用戶繼續(xù)訪問,服務(wù)器就會(huì)更新Session的最后訪問時(shí)間,并維護(hù)該Session。為防止內(nèi)存溢出,服務(wù)器會(huì)把長時(shí)間內(nèi)沒有活躍的Session從內(nèi)存刪除。這個(gè)時(shí)間就是Session的超時(shí)時(shí)間。如果超過了超時(shí)時(shí)間沒訪問過服務(wù)器,Session就自動(dòng)失效了。


image.png
Token

HTTP請求都是以無狀態(tài)的形式對接。即HTTP服務(wù)器不知道本次請求和上一次請求是否有關(guān)聯(lián)。所以就有了Session的引入,即服務(wù)端和客戶端都保存一段文本,客戶端每次發(fā)起請求都帶著,這樣服務(wù)器就知道客戶端是否發(fā)起過請求。
這樣,就導(dǎo)致客戶端頻繁向服務(wù)端發(fā)出請求數(shù)據(jù),服務(wù)端頻繁的去數(shù)據(jù)庫查詢用戶名和密碼并進(jìn)行對比,判斷用戶名和密碼正確與否。而Session的存儲(chǔ)是需要空間的,頻繁的查詢數(shù)據(jù)庫給服務(wù)器造成很大的壓力。
在這種情況下,Token應(yīng)用而生。

Token是服務(wù)端生成的一串字符串,以作客戶端進(jìn)行請求的一個(gè)令牌。當(dāng)客戶端第一次訪問服務(wù)端,服務(wù)端會(huì)根據(jù)傳過來的唯一標(biāo)識userId,運(yùn)用一些算法,并加上密鑰,生成一個(gè)Token,然后通過BASE64編碼一下之后將這個(gè)Token返回給客戶端,客戶端將Token保存起來(可以通過數(shù)據(jù)庫或文件形式保存本地)。下次請求時(shí),客戶端只需要帶上Token,服務(wù)器收到請求后,會(huì)用相同的算法和密鑰去驗(yàn)證Token。

最簡單的Token組成:uid(用戶唯一的身份標(biāo)識)、time(當(dāng)前時(shí)間的時(shí)間戳)、sign(簽名,由Token的前幾位+鹽以哈希算法壓縮成一定長的十六進(jìn)制字符串,可以防止惡意第三方拼接Token請求服務(wù)器)。

使用基于 Token 的身份驗(yàn)證方法,在服務(wù)端不需要存儲(chǔ)用戶的登錄記錄。大概的流程是這樣的:

客戶端使用用戶名跟密碼請求登錄
服務(wù)端收到請求,去驗(yàn)證用戶名與密碼
驗(yàn)證成功后,服務(wù)端會(huì)簽發(fā)一個(gè) Token,再把這個(gè) Token 發(fā)送給客戶端
客戶端收到 Token 以后可以把它存儲(chǔ)起來,比如放在 Cookie 里或者數(shù)據(jù)庫里
客戶端每次向服務(wù)端請求資源的時(shí)候需要帶著服務(wù)端簽發(fā)的 Token
服務(wù)端收到請求,然后去驗(yàn)證客戶端請求里面帶著的 Token,如果驗(yàn)證成功,就向客戶端返回請求的數(shù)據(jù)

APP登錄的時(shí)候發(fā)送加密的用戶名和密碼到服務(wù)器,服務(wù)器驗(yàn)證用戶名和密碼,如果成功,以某種方式比如隨機(jī)生成32位的字符串作為Token,存儲(chǔ)到服務(wù)器中,并返回Token到APP,以后APP請求時(shí),凡是需要驗(yàn)證的地方都要帶上該Token,然后服務(wù)器端驗(yàn)證Token,成功返回所需要的結(jié)果,失敗返回錯(cuò)誤信息,讓他重新登錄。對于同一個(gè)APP同一個(gè)手機(jī)當(dāng)前只有一個(gè)Token;手機(jī)APP會(huì)存儲(chǔ)一個(gè)當(dāng)前有效的Token。其中服務(wù)器上Token設(shè)置一個(gè)有效期,每次APP請求的時(shí)候都驗(yàn)證Token和有效期。


image.png

下面這個(gè)例子,可以很好的理解:

『給我來份煎餅(token我是你對面攤賣烤冷面的,scope賒賬)』『好』
『雞蛋(token我是你對面攤賣烤冷面的,scope賒賬)』『好』
『再加個(gè)雞蛋(token我是你對面攤賣烤冷面的,scope賒賬)』『好』

最終得到一份普通煎餅,外加兩個(gè)雞蛋……

如果服務(wù)器重啟或者因?yàn)槠渌碛桑?wù)器端已保存token丟失。那么用戶需 要重新登錄和認(rèn)證。

『給我來份煎餅(token我是你對面攤賣烤冷面的)』『那個(gè)……我沒見過你』

END


如果你喜歡我的分享,那就在右下角點(diǎn)個(gè)喜歡吧
你的鼓勵(lì)是我最大的動(dòng)力來源,在此深表感恩
軟件測試的路上,我們可以互相關(guān)注,相互學(xué)習(xí),共同進(jìn)步,微信ID:929194573


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,973評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內(nèi)容