动态

详情 返回 返回

Cookie、Token和Session那麼美妙~ - 动态 详情

原創聲明,轉載請註明文章鏈接來源、作者信息

三個好基友~

Cookie、Token和Session區別

hello,我是索奇~

精心寫了一篇Cookie、Session和Token的 vivid 文章,並分享給大家

我們可以把Cookie、Token和Session看作是三個好基友,它們都是用來跟蹤用户的身份和狀態的,但是它們之間有一些區別和使用場景。

Cookie
  • Cookie:曲奇餅,小甜餅;……樣的人;(瀏覽網頁後存儲在計算機的)緩存文件;<蘇格蘭>淡麪包;漂亮的女孩

    啊,不是讓你翻譯~ 是讓你介紹計算機中Cookie~(不過也學會了一個單詞)

image-20230626173232723

image-20230625213015793

Cookie就像是你的小秘書,它的主要作用是保存用户的偏好和瀏覽歷史。比如説,你在網上買了一件衣服,但是還沒決定是否買下,這時候你可以把這件衣服放進購物車,Cookie就會幫你記住這個購物車裏有什麼。等到你下次再來這個網站的時候,Cookie就會幫你把購物車裏的東西顯示出來,讓你可以繼續購物。

Cookie的數據存儲在客户端的瀏覽器中,不會佔用服務器的資源

在瀏覽器的控制枱中,可以直接輸入:document.Cookie來查看Cookie。Cookie是一個由鍵值對構成的字符串,出於安全考慮

httponly類型的獲取不到的,不要找半天httponly發現找不到

又多一個名詞,再探索一下?

httponly又是什麼啊?

HttpOnly就是一個設置在HTTP響應頭中的標誌,它可以防止某些類型的客户端腳本(如JavaScript)訪問cookie。當服務器向客户端發送帶有HttpOnly標誌的cookie時,客户端的JavaScript代碼將無法通過document.cookie訪問該cookie,這可以有效地提高Web應用程序的安全性。

如果給某個 cookie 設置了 httponly 屬性,則無法通過 JS 腳本讀取到該 cookie 的信息,但還是能通過Application 中手動修改 cookie, 所以只是在一定程度上可以防止 XSS 攻擊,但也不是絕對的安全

  • Cookie主要用於跟蹤用户的偏好和行為,以便提供個性化的體驗。例如,在網站上保存用户的登錄狀態、購物車信息等。

    啊,平時刷視頻、逛tb、個性化廣告等等的信息居然就是這樣被頁面記錄、推送的

搞笑視頻剪輯

還有一個大家都在討論(眾説紛紜)的話題就是-我們平時的瀏覽記錄等信息會被記錄嗎?

  • 答案是不確定(不保證一定不被記錄,不保證一定被記錄)

    Cookie本身是存儲在客户端的,而不是服務器端,所以服務器不需要把

    Cookie記錄保存到數據庫中

    但至於記錄個人的愛好、瀏覽記錄等信息是否被記錄到數據庫,如何被記錄到數據庫,這取決於具體的軟件、網站、隱私政策和數據收集方式..

Session

Session就像是你的個人檔案,它的主要作用是保存用户的狀態和權限。比如説,你在網站上登錄之後,服務器就會為你創建一個Session,裏面保存了你的登錄狀態和購物車信息等等。這樣,當你在瀏覽網站的時候,服務器就會根據Session來提供個性化的體驗,比如顯示你的購物車裏有什麼,或者顯示你最近瀏覽過的商品。

也可以理解為是一個比較特殊的map ,除了可以像其它map一樣存取數據,它還有過期時間、唯一的id區分不同session,

創建該session時,會同時創建一個Cookie,Cookie的keyJSESSIONID,而Cookie的value是該session的id。

又遇到不懂的了嗎?Cookie的key是啥東西?

JSESSIONID是一種用於在客户端和服務器端之間傳遞會話信息的Cookie名稱。當用户在瀏覽器中訪問一個需要登錄的網站時,服務器會

在後台創建一個會話,並生成一個唯一的Session ID,將其存儲在服務器端的Session中,同時,服務器會將Session ID通過Cookie的方式發送給客户端,通常使用的Cookie名稱就是JSESSIONID

image-20230625222742156

  • Session的數據信息存放在服務器上,Session的數據只能被服務器訪問,因此相對來説比較安全,但是需要佔用服務器的資源,
  • Session主要用於跟蹤用户的狀態和權限,以便提供個性化的體驗。例如,你搜索的內容、在網站上保存用户的登錄狀態、購物車信息等。
  • 對於Session並沒有上限,但出於對服務器端的性能考慮,Session內不要存放過多的東西
Token

img

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

img

比如用户已經登錄了系統, 我給他發一個token, 裏邊包含了這個用户的 user id, 下一次這個用户再次通過Http 請求訪問我的時候, 把這個token 通過Http header 帶過來就可以了。

但是這時候感覺和session沒區別啊,萬一有人偽造做假攻擊呢?於是就用算法對數據做了簽名,用簽名+數據 = token ,簽名不知道,也就無法偽造token了

這個token 不保存, 當用户把這個token 給我發過來的時候,我再用同樣的算法和同樣的密鑰,對數據再計算一次簽名, 和token 中的簽名做個比較, 如果相同, 我就知道用户已經登錄過了,並且可以直接取到用户的user id , 如果不相同, 數據部分肯定被人篡改過, 就知道這個人是冒充貨,返給它沒有認證的信息

img

Token是一種無狀態的身份驗證機制,意味着服務器不需要保存Token的狀態(這不是大大的減輕了服務器的壓力~),前後端分離架構中前端無法直接訪問後端的Session。但是,前後端分離架構中依然可以使用Session來存儲應用程序的其他狀態信息,例如購物車數據等,只是不能用來保存用户的登錄狀態。

  • 既可以保存在服務器也可以在客户端
  • Token是一種無狀態的身份驗證機制,它可以在多個服務器之間共享,而Session則需要在每個服務器上都保存一份。使用Token可以避免Session共享和Session過期等問題,同時也可以降低服務器的負擔。
  • Token 中的數據是明文保存的, 還是可以被別人看到的, 所以我不能在其中保存像密碼這樣的敏感信息
  • 基於Token的身份驗證是無狀態的,我們不將用户信息存在服務器或Session中。
  • 大多數使用Web API的互聯網公司中,它是Tokens多用户下處理認證的最佳方式
  • 被攻擊是不是很煩惱! Token通常用於API身份驗證等場景,可以有效避免跨站請求偽造(CSRF)等攻擊~

拓展一下Token的身份驗證過程

  • 用户在客户端進行登錄操作,將用户名和密碼發送到服務器端。
  • 服務器端通過驗證用户名和密碼的正確性,生成一個Token,並將Token返回給客户端。
  • 客户端將Token保存在本地,例如在瀏覽器的Cookie或localStorage中。
  • 客户端在後續的請求中,將Token發送給服務器端進行身份驗證。
  • 服務器端接收到請求後,從請求中獲取Token,並對Token進行解密和驗證。
  • 如果Token驗證通過,服務器端將響應請求並返回所需的數據,否則返回身份驗證失敗的錯誤信息。

在身份驗證過程中,服務器端通常會對Token進行解密、驗證簽名、檢查Token是否過期等操作,以確保Token的有效性和安全性

栩栩如生、通俗易懂~ 重點講完了!

簡單記一些知識

看完了沒,啥也沒懂?好吧,無奈,簡單記一下區別吧,面試時候不能啞口無言吧

img

  • Session和Token是在服務器端保存數據的機制,而Cookie是在客户端保存數據的機制

    通常情況單個Cookie保存的數據在4KB以內(面試官:這都知道,給你offer!欣喜若狂的自己:太好了!)

  • Session和Token通常用於身份驗證和狀態管理,而Cookie通常用於跟蹤用户的偏好和行為
  • Session和Token通常用於敏感數據的存儲和傳輸,而Cookie通常用於非敏感數據的存儲和傳輸。
  • Session和Token需要服務器端進行管理和維護,而Cookie可以由客户端自行管理和維護。
  • Token可以跨域使用,而Session通常只能在同一個域名下使用;Token可以在分佈式系統中使用,而Session通常只能在單一服務器上使用。

(可以忽略)寫着寫着又想要拓展了,哈哈哈,想要探索的夥伴們,一定想要知道單個站點可以存儲的Cookie數量,

這裏有疑惑?

國際互聯網標準是每個網站可以存儲的 Cookie 數量不得超過 300 個,具體還是根據不同的瀏覽器來定,

發現部分博主説單個站點最多保存20個Cookie,這是不合理的,也有近100點贊

網上一連串的信息是複製的,有時我們不能輕易的相信,要學會自己去探索,去驗證!不然就誤人耳目了

cookie

image-20230625215109616

這裏是僅僅是為了説明下Cookie的數量,幫助更多夥伴學會探索知識,對原博主沒有任何惡意哈

Add a new 评论

Some HTML is okay.