詳細分清Session,Cookie和Token之間的區別,以及JWT是什么東西

Cookie

Cookie是一種小型的文本文件,由網站在用戶訪問時存儲在其計算機或移動設備上,Cookie主要用于跟蹤、識別和存儲有關用戶的信息。

簡單來說Cookie就是用來存儲某些后端發送給前端的數據,例如我們登陸后,后端會返回一個登錄憑證,這樣子你才能正常執行網站登錄之后的功能。

我們的session和token其實就大部分作為一個登錄憑證使用

我們Cookie就是來存儲類似的這種東西,我們每次在域名內跳轉的時候,我們都默認附加這個Cookie請求,這樣子我們就可以保存登錄狀態來操作

例如我是在bilibili這個域名登錄的

我點開其他視頻的時候,我是在這個域名內跳轉

例如這樣子,但是我們跳到了不同的界面,我們還是保持登錄狀態的,這就是Cookie的作用

Cookie可以在域名內跳轉的時候保存一些我們想保存的東西,

所以那種保持登錄狀態和7天免登錄就是Cookie的用處。

所以Cookie其實和Session和Token是不同的東西,我們不要搞混了

但是Session和Token是類似的東西,是一種保持登錄狀態的東西,是一種登錄憑證


Session

然后我們來講講Session

Session是我們的服務器里面的一個東西,例如我們的小貓咪Tomcat服務器

我們的Session是由我們的服務器生成,然后Session這個東西我們保存到我們的服務器里面,

我們Session會生成一個叫SessionId的東西返回給前端,然后如果我們檢測到我們由SessionId這個和東西我們就可以操作我們的服務器里面的Session

例如我們可以往我們的Session里面存東西,像下面那樣

看到了這個Context這個東西了嗎,這個東西就是可以做上下文的

我們存進上下文的東西是可以全局使用,調用的

這個的意思是,我們用Session來統計,其實不同的瀏覽器執行時,我們拿到的SeesionId是不同的,所以我就做了個簡單的登錄統計,我們往這個全局上下文的“olcount”存儲,如果session!=null,我們就加1,這個就是簡單的往Session的Context上下文里面存的東西邏輯

其實我們也可以直接往session里面存,session.set就行了

例如我們寫代碼的時候,像調用一些東西,例如我們登錄,然后像后面調用它的用戶名

我們就Session.set("username","kira"),我們往session里面存了個username的變量,變量的值是kira,然后我們后面寫邏輯的時候,想得到我們當前用戶的用戶名我們直接session.get("username"),就把kira這個用戶名給拿出來了

總的來說就是,Session是在我們的服務器生成的,然后我們生成一個SessionId給前端存儲到Cookie里,有了SessionId我們就可以操作我們的服務器里面對應的Session以及里面的方法

Seesion是一種服務器自己生成的東西,返回給前端的SeesionId是我們的登錄憑證

但其實Session有缺點,如果Seesion過多它會占用服務器的內存,然后Session的很多東西都是服務器生成的,我們這種后端很難靈活地操作和修改,例如它設定這個Seesion的過期時間為10分鐘,我們只想讓一個Session30分鐘過期,其他Seesion保持不變,我們只能直接修改服務器配置改成30分鐘,但修改服務器Seesion過期時間配置的話,其他所有的Seesion都會跟著修改過期時間,無法做到某個特例不同


Token

然后我們來講Token

Token是一種基于加密算法,由后端自己做的一種登錄憑證

而Seesion是一種服務器生成的東西,SessionId是服務器生成的登陸憑證

區別在于:一個是服務器規定好生成的,一個是后端自己基于加密算法做好的,我們的操作主體是不同的,一個是服務器,一個是后端

我們可以用UUID來隨機生成一個Token,UUID其實也是一種算法,例如我們這樣子,生成一個東西來當作Token

我們使用正確的密碼成功登錄之后,我們用生成的UUID,把它存到我們的Redis里面,設置例如30分鐘的過期時間

最重要的一點來了,我們要把這個東西返回給前端

我們一般都是,把這個Token(我是用UUID做的)存到請求頭里面,請求頭里的參數名是Authorization,把我們的uuid存到這個請求頭的變量里面

然后我們在全局攔截器里面弄一個操作邏輯,就是任何請求,我們都要有一個判斷就是判斷用戶是否是登錄狀態,如果我們的Authorization不為空,且uuid的值和后端里存的uuid可以對上,那么就可以確認這個用戶是登錄狀態的

怎么樣?之前我們是用SessionId來找到服務器對應session判斷用戶是否是登錄狀態,

現在是我們用Token去找對應的東西是否存在來判斷用戶是否是登錄狀態

所以Session和Token其實有很多類似的地方,但是Session里面可能有些操作方法什么的可以調用,不僅僅只有個SessionId作為登錄憑證,而Token大部分時間是做登錄憑證的,反正我還沒了解到Token的其他大用途。


還記得之前提到的Session的一個小問題嗎?

修改服務器Seesion過期時間配置的話,其他所有的Seesion都會跟著修改過期時間,無法做到某個特例不同

但是如果我們用Token然后存到我們的Redis里面的這個邏輯的話,我們可以用Redis來給不同的Token來設置過期時間,這樣子就可以設置不同的用戶的過期時間了是吧?

例如A用戶10分鐘過期,B用戶20分鐘過期,C用戶30分鐘過期

但是如果我們用session的話,我們無法做到這種多個不同的過期時間,我們只能統一所有的session都是一個過期時間,所以Token的優點就在這里。而且Token的話不會像Session那樣占用服務器內存,它只是一個小數據,我們存到數據庫里面使用,還可以隨意設置過期時間。


JWT

jwt其實就是token的另一種實現方式,上面的例子我是用UUID來演示我們的token的,然后存到redis里面設置過期時間

而JWT的話就更加簡便了,我就拿黑馬課程的這章節來舉例子

實戰篇-07_JWT令牌_嗶哩嗶哩_bilibili

里面提供了一個生成jwt的工具類,有特定的算法,和我們的那個uuid的算法不同,下面的就是提供的jwt工具類,它把jwt常用的方法非封裝成了工具類

首先我們要引入jwt的依賴

<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.4.0</version>
</dependency>

我們的這個jwt算法生成工具類的話,可以指定生成算法

其中jwt是由這三部分組成的

分別是? Header(頭) Payload(有效載荷) Signature(簽名)

有效載荷里面可以存儲一些自定義信息,我們可以把想要的信息通過jwt工具類加密,變成有效載荷

簽名可以防止Token被修改,簽名里面有指定我們需要的加密算法,這樣子我們拿到后端解析的時候,簽名可以解析出對應的算法,然后用對應的算法把我們的token以及token里面的信息成功解析出來

你看下面我們用工具類造token的時候有三個邏輯

?添加信息

添加過期時間

指定我們的加密算法

所以我們就不需要按照我一開始的邏輯那樣用Redis來設置我們的過期時間了

因為我們的過期時間的設置可以存到我們的有效載荷里面,然后我們后端的jwt工具類解析token,就可以知道這個token過期沒有了,就不用存到我們的Redis里面了

?所以jwt只是一種現在主流的token的實現方式,不過他確實簡便然后復雜程度也比我舉例子的那個uuid高,所以我們以后用jwt就行了,不用UUID。

但是有一個應用場景,會讓我們的jwt的使用出問題,就是我們更新密碼的時候,按理來說我們會生成新的token,但是我們舊的token不能自動過期

所以我們要結合redis,把token存到我們的redis中,如果我們修改了密碼,我們就手動讓舊的token過期,然后讓新的token存到redis里面然后生效。

其實我覺得既然要結合redis,那么我們的token沒必要在弄的時候就設置過期事件,直接用redis設置過期時間其實也是一種思路,不過其實都一樣,redis在這起到的作用就是在更新密碼的時候主動過期我們的token。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12812.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12812.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12812.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue3 + Avue中 Header slot寫法

avue示例 <template><avue-crud ref"crud":option"option":data"data"><template #name-header"{column}"><el-tag>{{(column || {}).label}}-{{(column || {}).prop}}</el-tag></template><…

02、網絡協議、IP地址、網絡狀況、網絡異質性問題的解決

聲明&#xff1a;本教程不收取任何費用&#xff0c;歡迎轉載&#xff0c;尊重作者勞動成果&#xff0c;不得用于商業用途&#xff0c;侵權必究&#xff01;&#xff01;&#xff01; 目錄 前言 一、IP地址 二、網絡協議 三、網絡狀況【了解】 四、網絡異質性問題的解決 前…

C++ requires關鍵字簡介

requires 是 C20 中引入的一個新關鍵字&#xff0c;用于在函數模板或類模板中聲明所需的一組語義要求&#xff0c;它可以用來限制模板參數&#xff0c;類似于 typename 和 class 關鍵字。 requires關鍵字常與type_traits頭文件下類型檢查函數匹配使用&#xff0c;當requires后…

激光雷達技術:科技之眼,照亮前行

在科技與人文關懷的交響樂章中&#xff0c;一項名為“蝙蝠避障”使用了激光雷達技術原理及應用的創新成果&#xff0c;正悄然改變著視障朋友們的生活方式&#xff0c;為他們的日常出行鋪設了一條充滿希望的光明之路。今天&#xff0c;讓我們一起深入探討這項技術如何成為盲人出…

深化市場布局與產業鏈整合,三清互聯以創新為公司發展賦能

近年來&#xff0c;我國大力發展現代化電力體系&#xff0c;并不斷推進智能電網的發展&#xff0c;電力物聯網作為支撐電力行業數字化發展的關鍵基礎設施&#xff0c;迎來了快速發展黃金時期。作為電力物聯網領域領先企業之一&#xff0c;三清互聯憑借敏銳的市場洞察力和技術創…

探索軟件測試中的創新測試方法:測試左移

軟件測試中的測試左移方法 在當今競爭激烈的市場中&#xff0c;滿足客戶的期望和需求是所有公司在競爭中成為市場領導者的關鍵。這就是為什么越來越多的公司現在轉向測試左移&#xff0c;并將其應用于產品開發過程。 在本文中&#xff0c;我們將從初學者的角度來介紹測試左移…

cmd如何以管理員身份運行

打開開始菜單。 在搜索框中輸入cmd。 在搜索結果中&#xff0c;找到cmd&#xff0c;右鍵單擊&#xff0c;選擇“以管理員身份運行”。 參考&#xff1a; cmd如何以管理員身份運行

2024最新大廠C++面試真題合集,大廠面試百日沖刺 bay10

字節后端 什么叫進程&#xff1f;什么叫線程&#xff1f;他倆有什么區別和聯系&#xff1f; 進程是操作系統進行資源分配和調度的基本單位&#xff0c;是一個程序關于某數據集合上的一次運行活動&#xff0c;是系統進行資源分配和調度的獨立單位。 線程是進程的一個執行流&am…

刷題之字母異位詞(leetcode 哈希表)

https://leetcode.cn/problems/group-anagrams/ class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string,vector<string>>map;//哈希表鍵為排序后或者處理后的字符串&#xff0c;值為某…

(1)醫療圖像處理:MRI磁共振成像-基本原理--(楊正漢

一、基本原理 1.組成 對應了解 1&#xff09;主磁體&#xff1a; 基本構建&#xff0c;用于產生磁場&#xff0c;主要有兩種方式產生磁場永磁&#xff08;磁鐵&#xff09;、電磁&#xff08;給線圈通電&#xff09;。MR按主磁場的場強分類主要有四類&#xff0c;分類的原因…

5.14學習總結

java聊天室項目 分片上傳 將大文件切分為多個小的數據塊&#xff08;通常大小為1MB~10MB&#xff09;&#xff0c;然后將這些小數據塊分別上傳至服務器&#xff0c;最后由服務器將這些小塊組合成完整的文件。這種方式可以避免由于網絡中斷或超時而導致上傳失敗&#xff0c;并…

【PMP練習題】

PMP練習題 PMP練習題 PMP練習題 2、 [單選] 由于缺乏資金&#xff0c;一個項目在啟動階段被終止&#xff0c;項目經理必須對項目收尾。項目經理首先應該做什么&#xff1f; Due to lack of funding, a project is terminated during its initiation phase and the project man…

第83天: 代碼審計-PHP 項目RCE 安全調試追蹤代碼執行命令執行

案例一&#xff1a;CNVD拿1day-RCE命令執行-百家CMS 這里用代碼審計系統搜索system&#xff0c;可以利用的是第一種 打開看細節 查找函數引用 查找$_file第一次出現的地方 這個時候就明白了&#xff0c;必須上傳文件&#xff0c;然后利用文件名&#xff0c;去執行system命令 …

Java項目:基于ssm框架實現的房屋租售網站管理系統(房屋租賃和房屋出售一體)(B/S架構+源碼+數據庫+畢業論文+開題+任務書)

一、項目簡介 本項目是一套基于ssm框架實現的房屋租售網站管理系統 包含&#xff1a;項目源碼、數據庫腳本等&#xff0c;該項目附帶全部源碼可作為畢設使用。 項目都經過嚴格調試&#xff0c;eclipse或者idea 確保可以運行&#xff01; 該系統功能完善、界面美觀、操作簡單、…

Hadoop Java API操作 及讀取序列化文件(04-05-06)

針對于04-05-06班級整合。 1.創建java項目 2.修改pom.xml文件 添加依賴 <dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.1.4</version></dependenc…

【Linux網絡編程】IO多路轉接之poll

poll 1.poll初始2.poll函數接口3.poll服務器4.poll的優點缺點 點贊&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;關注&#x1f496;&#x1f496; 你的支持是對我最大的鼓勵&#xff0c;我們一起努力吧!&#x1f603;&#x1f603; 1.poll初始 poll也是一種linux…

Unity設計模式之工廠模式

什么是工廠模式&#xff1f; 工廠是一種創建型設計模式。通俗來講就是提供一種封裝對象創建的方式&#xff0c;將對象的創建和使用區分開。就是Unity里面通常用到的創建和管理對象。 工廠模式有什么優點&#xff1f; 1、封裝對象的創建方式&#xff0c;使其更加靈活、易于管理…

vue elementui時間選擇器返回的時間轉成年月日-格式

關鍵點&#xff1a;value-format“yyyy-MM-dd” <template><el-date-pickerv-model"date"type"date"placeholder"選擇日期"format"yyyy-MM-dd"value-format"yyyy-MM-dd"></el-date-picker> </template…

【教學類-55-04】20240515圖層順序挑戰(四格長條紙加黑色邊框、4*4、7張,不重復5400張,16坐標點顏色哈希值去重、保留7色)

背景需求&#xff1a; 前文實現了7張色彩紙條加上黑色邊框的需求。 【教學類-55-02】20240512圖層順序挑戰&#xff08;四格長條紙加黑色邊框、4*4、7張 、43200張去掉非7色有23040張&#xff0c;哈希算法快速去重剩余1221張&#xff09;-CSDN博客文章瀏覽閱讀1k次&#xff0…

GPT-4o模型介紹和使用方法

大家好,我是herosunly。985院校碩士畢業,現擔任算法研究員一職,熱衷于機器學習算法研究與應用。曾獲得阿里云天池比賽第一名,CCF比賽第二名,科大訊飛比賽第三名。擁有多項發明專利。對機器學習和深度學習擁有自己獨到的見解。曾經輔導過若干個非計算機專業的學生進入到算法…