三個好基友Cookie、Session和Token

原創(chuàng)聲明,轉(zhuǎn)載請注明文章鏈接來源、作者信息
https://mp.weixin.qq.com/s/JGuo0HPAEmcNQMAQ22Mhjg
Cookie、Token和Session區(qū)別
hello,我是索奇~
精心寫了一篇Cookie、Session和Token的 vivid 文章,并分享給大家
我們可以把Cookie、Token和Session看作是三個好基友,它們都是用來跟蹤用戶的身份和狀態(tài)的,但是它們之間有一些區(qū)別和使用場景。
Cookie
Cookie:曲奇餅,小甜餅;……樣的人;(瀏覽網(wǎng)頁后存儲在計算機的)緩存文件;<蘇格蘭>淡面包;漂亮的女孩
啊,不是讓你翻譯~ 是讓你介紹計算機中Cookie~(不過也學(xué)會了一個單詞)


Cookie就像是你的小秘書,它的主要作用是保存用戶的偏好和瀏覽歷史。比如說,你在網(wǎng)上買了一件衣服,但是還沒決定是否買下,這時候你可以把這件衣服放進購物車,Cookie就會幫你記住這個購物車里有什么。等到你下次再來這個網(wǎng)站的時候,Cookie就會幫你把購物車里的東西顯示出來,讓你可以繼續(xù)購物。
Cookie的數(shù)據(jù)存儲在客戶端的瀏覽器中,不會占用服務(wù)器的資源
在瀏覽器的控制臺中,可以直接輸入:document.Cookie來查看Cookie。Cookie是一個由鍵值對構(gòu)成的字符串,出于安全考慮
httponly類型的獲取不到的,不要找半天httponly發(fā)現(xiàn)找不到
又多一個名詞,再探索一下?
httponly又是什么?。?/strong>
HttpOnly就是一個設(shè)置在HTTP響應(yīng)頭中的標志,它可以防止某些類型的客戶端腳本(如JavaScript)訪問cookie。當(dāng)服務(wù)器向客戶端發(fā)送帶有HttpOnly標志的cookie時,客戶端的JavaScript代碼將無法通過document.cookie訪問該cookie,這可以有效地提高Web應(yīng)用程序的安全性。
如果給某個 cookie 設(shè)置了 httponly 屬性,則無法通過 JS 腳本讀取到該 cookie 的信息,但還是能通過Application 中手動修改 cookie, 所以只是在一定程度上可以防止 XSS 攻擊,但也不是絕對的安全
Cookie主要用于跟蹤用戶的偏好和行為,以便提供個性化的體驗。例如,在網(wǎng)站上保存用戶的登錄狀態(tài)、購物車信息等。
啊,平時刷視頻、逛tb、個性化廣告等等的信息居然就是這樣被頁面記錄、推送的

還有一個大家都在討論(眾說紛紜)的話題就是-我們平時的瀏覽記錄等信息會被記錄嗎?
答案是不確定(不保證一定不被記錄,不保證一定被記錄)
Cookie本身是存儲在客戶端的,而不是服務(wù)器端,所以服務(wù)器不需要把
Cookie記錄保存到數(shù)據(jù)庫中
但至于記錄個人的愛好、瀏覽記錄等信息是否被記錄到數(shù)據(jù)庫,如何被記錄到數(shù)據(jù)庫,這取決于具體的軟件、網(wǎng)站、隱私政策和數(shù)據(jù)收集方式..
Session
Session就像是你的個人檔案,它的主要作用是保存用戶的狀態(tài)和權(quán)限。比如說,你在網(wǎng)站上登錄之后,服務(wù)器就會為你創(chuàng)建一個Session,里面保存了你的登錄狀態(tài)和購物車信息等等。這樣,當(dāng)你在瀏覽網(wǎng)站的時候,服務(wù)器就會根據(jù)Session來提供個性化的體驗,比如顯示你的購物車里有什么,或者顯示你最近瀏覽過的商品。
也可以理解為是一個比較特殊的map ,除了可以像其它map一樣存取數(shù)據(jù),它還有過期時間、唯一的id區(qū)分不同session,
創(chuàng)建該session時,會同時創(chuàng)建一個Cookie,Cookie的key
為JSESSIONID
,而Cookie的value
是該session的id。
又遇到不懂的了嗎?Cookie的key是啥東西?
JSESSIONID
是一種用于在客戶端和服務(wù)器端之間傳遞會話信息的Cookie名稱。當(dāng)用戶在瀏覽器中訪問一個需要登錄的網(wǎng)站時,服務(wù)器會
在后臺創(chuàng)建一個會話,并生成一個唯一的Session ID,將其存儲在服務(wù)器端的Session中,同時,服務(wù)器會將Session ID通過Cookie的方式發(fā)送給客戶端,通常使用的Cookie名稱就是JSESSIONID

Session的數(shù)據(jù)信息存放在服務(wù)器上,Session的數(shù)據(jù)只能被服務(wù)器訪問,因此相對來說比較安全,但是需要占用服務(wù)器的資源,
Session主要用于跟蹤用戶的狀態(tài)和權(quán)限,以便提供個性化的體驗。例如,你搜索的內(nèi)容、在網(wǎng)站上保存用戶的登錄狀態(tài)、購物車信息等。
對于Session并沒有上限,但出于對服務(wù)器端的性能考慮,Session內(nèi)不要存放過多的東西
Token

Token就像是你的身份證,它的主要作用是用于身份驗證和授權(quán)。比如說,你在使用某個APP的時候,需要登錄才能使用一些功能,這時候APP就會頒發(fā)給你一個Token(令牌),你需要在每個請求中攜帶這個Token,服務(wù)器會通過驗證Token來確定你的身份和權(quán)限,以確保你只能訪問你有權(quán)訪問的內(nèi)容。

比如用戶已經(jīng)登錄了系統(tǒng), 我給他發(fā)一個token, 里邊包含了這個用戶的 user id, 下一次這個用戶再次通過Http 請求訪問我的時候, 把這個token 通過Http header 帶過來就可以了。
但是這時候感覺和session沒區(qū)別啊,萬一有人偽造做假攻擊呢?于是就用算法對數(shù)據(jù)做了簽名,用簽名+數(shù)據(jù) = token ,簽名不知道,也就無法偽造token了
這個token 不保存, 當(dāng)用戶把這個token 給我發(fā)過來的時候,我再用同樣的算法和同樣的密鑰,對數(shù)據(jù)再計算一次簽名, 和token 中的簽名做個比較, 如果相同, 我就知道用戶已經(jīng)登錄過了,并且可以直接取到用戶的user id , 如果不相同, 數(shù)據(jù)部分肯定被人篡改過, 就知道這個人是冒充貨,返給它沒有認證的信息

Token是一種無狀態(tài)的身份驗證機制,意味著服務(wù)器不需要保存Token的狀態(tài)(這不是大大的減輕了服務(wù)器的壓力~),前后端分離架構(gòu)中前端無法直接訪問后端的Session。但是,前后端分離架構(gòu)中依然可以使用Session來存儲應(yīng)用程序的其他狀態(tài)信息,例如購物車數(shù)據(jù)等,只是不能用來保存用戶的登錄狀態(tài)。
既可以保存在服務(wù)器也可以在客戶端
Token是一種無狀態(tài)的身份驗證機制,它可以在多個服務(wù)器之間共享,而Session則需要在每個服務(wù)器上都保存一份。使用Token可以避免Session共享和Session過期等問題,同時也可以降低服務(wù)器的負擔(dān)。
Token 中的數(shù)據(jù)是明文保存的, 還是可以被別人看到的, 所以我不能在其中保存像密碼這樣的敏感信息
基于Token的身份驗證是無狀態(tài)的,我們不將用戶信息存在服務(wù)器或Session中。
大多數(shù)使用Web API的互聯(lián)網(wǎng)公司中,它是Tokens多用戶下處理認證的最佳方式
被攻擊是不是很煩惱! Token通常用于API身份驗證等場景,可以有效避免跨站請求偽造(CSRF)等攻擊~
拓展一下Token的身份驗證過程
用戶在客戶端進行登錄操作,將用戶名和密碼發(fā)送到服務(wù)器端。
服務(wù)器端通過驗證用戶名和密碼的正確性,生成一個Token,并將Token返回給客戶端。
客戶端將Token保存在本地,例如在瀏覽器的Cookie或localStorage中。
客戶端在后續(xù)的請求中,將Token發(fā)送給服務(wù)器端進行身份驗證。
服務(wù)器端接收到請求后,從請求中獲取Token,并對Token進行解密和驗證。
如果Token驗證通過,服務(wù)器端將響應(yīng)請求并返回所需的數(shù)據(jù),否則返回身份驗證失敗的錯誤信息。
在身份驗證過程中,服務(wù)器端通常會對Token進行解密、驗證簽名、檢查Token是否過期等操作,以確保Token的有效性和安全性
栩栩如生、通俗易懂~ 重點講完了!
簡單記一些知識
看完了沒,啥也沒懂?好吧,無奈,簡單記一下區(qū)別吧,面試時候不能啞口無言吧

Session和Token是在服務(wù)器端保存數(shù)據(jù)的機制,而Cookie是在客戶端保存數(shù)據(jù)的機制
通常情況單個Cookie保存的數(shù)據(jù)在4KB以內(nèi)(面試官:這都知道,給你offer!欣喜若狂的自己:太好了?。?/span>
Session和Token通常用于身份驗證和狀態(tài)管理,而Cookie通常用于跟蹤用戶的偏好和行為
Session和Token通常用于敏感數(shù)據(jù)的存儲和傳輸,而Cookie通常用于非敏感數(shù)據(jù)的存儲和傳輸。
Session和Token需要服務(wù)器端進行管理和維護,而Cookie可以由客戶端自行管理和維護。
Token可以跨域使用,而Session通常只能在同一個域名下使用;Token可以在分布式系統(tǒng)中使用,而Session通常只能在單一服務(wù)器上使用。
(可以忽略)寫著寫著又想要拓展了,哈哈哈,想要探索的伙伴們,一定想要知道單個站點可以存儲的Cookie數(shù)量,
這里有疑惑?
國際互聯(lián)網(wǎng)標準是每個網(wǎng)站可以存儲的 Cookie 數(shù)量不得超過 300 個,具體還是根據(jù)不同的瀏覽器來定,
發(fā)現(xiàn)部分博主說單個站點最多保存20個Cookie,這是不合理的,也有近100點贊
網(wǎng)上一連串的信息是復(fù)制的,有時我們不能輕易的相信,要學(xué)會自己去探索,去驗證!不然就誤人耳目了


這里是僅僅是為了說明下Cookie的數(shù)量,幫助更多伙伴學(xué)會探索知識,對原博主沒有任何惡意哈