最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文徹底理清session、cookie、token的區(qū)別

 更新時間:2023年02月27日 09:54:11   作者:W-MoMo  
session和token本質(zhì)上是沒有區(qū)別的,都是對用戶身份的認(rèn)證機制,只是他們實現(xiàn)的校驗機制不一樣而已,下面這篇文章主要給大家介紹了關(guān)于session、cookie、token區(qū)別的相關(guān)資料,需要的朋友可以參考下

前言

今天就來理一理session、cookie、token這三者之間的關(guān)系!

1.為什么會有它們?

我們都知道 HTTP 協(xié)議是無狀態(tài)的,所謂的無狀態(tài)就是客戶端每次想要與服務(wù)端通信,都必須重新與服務(wù)端鏈接,意味著請求一次客戶端和服務(wù)端就連接一次,下一次請求與上一次請求是沒有關(guān)系的。

這種無狀態(tài)的方式就會存在一個問題:如何判斷兩次請求的是同一個人?就好比用戶在頁面 A 發(fā)起請求獲取個人信息,然后在另一個頁面同樣發(fā)起請求獲取個人信息,我們?nèi)绾未_定這倆個請求是同一個人發(fā)的呢?

為了解決這種問題,我們就迫切需要一種方式知道發(fā)起請求的客戶端是誰?此時,cookie、token、session 就出現(xiàn)了,它們就可以解決客戶端標(biāo)識的問題,在擴大一點就是解決權(quán)限問題。

它們就好比讓每個客戶端或者說登錄用戶有了自己的身份證,我們可以通過這個身份證確定發(fā)請求的是誰!

2.什么是 cookie?

cookie 是保存在客戶端或者說瀏覽器中的一小塊數(shù)據(jù),大小限制大致在 4KB 左右,在以前很多開發(fā)人員通常用 cookie 來存儲各種數(shù)據(jù),后來隨著更多瀏覽器存儲方案的出現(xiàn),cookie 存儲數(shù)據(jù)這種方式逐漸被取代,主要原因有如下:

  • cookie 有存儲大小限制,4KB 左右。
  • 瀏覽器每次請求會攜帶 cookie 在請求頭中。
  • 字符編碼為 Unicode,不支持直接存儲中文。
  • 數(shù)據(jù)可以被輕易查看。

cookie 主要有以下屬性:

屬性名稱屬性含義
namecookie 的名稱
valuecookie 的值
commentcookie 的描述信息
domain可以訪問該 cookie 的域名
expirescookie 的過期時間,具體某一時間
maxAgecookie 的過期時間,比如多少秒后 cookie 過期。
pathcookie 的使用路徑,
securecookie 是否使用安全協(xié)議傳輸,比如 SSL 等
versioncookie 使用的版本號
isHttpOnly指定該 Cookie 無法通過 JavaScript 腳本拿到,比如 Document.cookie 屬性、XMLHttpRequest 對象和 Request API 都拿不到該屬性。這樣就防止了該 Cookie 被腳本讀到,只有瀏覽器發(fā)出 HTTP 請求時,才會帶上該 Cookie。

我們介紹了 cookie,那么我們是如何通過 cookie 來實現(xiàn)用戶確定或者權(quán)限的確定呢?

我們就以一個普通網(wǎng)站的用戶登錄操作以及后續(xù)操作為例,主要過程可以簡單用下圖表示:

從上圖中可以看到使用 cookie 進行用戶確認(rèn)流程是比較簡單的,大致分為以下幾步:

  1. 客戶端發(fā)送請求到服務(wù)端(比如登錄請求)。
  2. 服務(wù)端收到請求后生成一個 session 會話。
  3. 服務(wù)端響應(yīng)客戶端,并在響應(yīng)頭中設(shè)置 Set-Cookie。Set-Cookie 里面包含了 sessionId,它的格式如下:Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]。其中 sessionId 就是用來標(biāo)識客戶端的,類似于去飯店里面,服務(wù)員給你一個號牌,后續(xù)上菜通過這個號牌來判斷上菜到哪里。
  4. 客戶端收到該請求后,如果服務(wù)器給了 Set-Cookie,那么下次瀏覽器就會在請求頭中自動攜帶 cookie。
  5. 客戶端發(fā)送其它請求,自動攜帶了 cookie,cookie 中攜帶有用戶信息等。
  6. 服務(wù)端接收到請求,驗證 cookie 信息,比如通過 sessionId 來判斷是否存在會話,存在則正常響應(yīng)。

cookie 主要有以下特點:

  • cookie 存儲在客戶端
  • cookie 不可跨域,但是在如果設(shè)置了 domain,那么它們是可以在一級域名和二級域名之間共享的。

3.什么是 session?

在上一節(jié)中,我們通過 Cookie 來實現(xiàn)了用戶權(quán)限的確認(rèn),在其中我們提到了一個詞:session。顧名思義它就是會話的意思,session 主要由服務(wù)端創(chuàng)建,主要作用就是保存 sessionId,用戶與服務(wù)端之間的權(quán)限確認(rèn)主要就是通過這個 sessionId。

簡單描述下 session:

session 由服務(wù)端創(chuàng)建,當(dāng)一個請求發(fā)送到服務(wù)端時,服務(wù)器會檢索該請求里面有沒有包含 sessionId 標(biāo)識,如果包含了 sessionId,則代表服務(wù)端已經(jīng)和客戶端創(chuàng)建過 session,然后就通過這個 sessionId 去查找真正的 session,如果沒找到,則為客戶端創(chuàng)建一個新的 session,并生成一個新的 sessionId 與 session 對應(yīng),然后在響應(yīng)的時候?qū)?sessionId 給客戶端,通常是存儲在 cookie 中。如果在請求中找到了真正的 session,驗證通過,正常處理該請求。

總之每一個客戶端與服務(wù)端連接,服務(wù)端都會為該客戶端創(chuàng)建一個 session,并將 session 的唯一標(biāo)識 sessionId 通過設(shè)置 Set-Cookie 頭的方式響應(yīng)給客戶端,客戶端將 sessionId 存到 cookie 中。

通常情況下,我們 cookie 和 session 都是結(jié)合著來用,當(dāng)然你也可以單獨只使用 cookie 或者單獨只使用 session,這里我們就將 cookie 和 session 結(jié)合著來用。

我們可以在修改一下整個請求過程圖,如下所示:

4.cookie 和 session 的區(qū)別?

前面兩節(jié)我們介紹了 cookie 和 session,它們兩者之間主要是通過 sessionId 關(guān)聯(lián)起來的,所以我們總結(jié)出:sessionId 是 cookie 和 session 之間的橋梁。我們?nèi)粘5南到y(tǒng)中如果在鑒權(quán)方面如果使用的是 cookie 方式,那么大部分的原理就和我們前面說的一樣。

或者我們可以換個說法,session 是基于 cookie 實現(xiàn)的,它們兩個主要有以下特點:

  • session 比 cookie 更加安全,因為它是存在服務(wù)端的,cookie 是存在客戶端的。
  • cookie 只支持存儲字符串?dāng)?shù)據(jù),session 可以存儲任意數(shù)據(jù)。
  • cookie 的有效期可以設(shè)置較長時間,session 有效期都比較短。
  • session 存儲空間很大,cookie 有限制。

系統(tǒng)想要實現(xiàn)鑒權(quán),可以單獨使用 cookie,也可以單獨使用 session,但是建議結(jié)合兩者使用。

5.token 是什么?

前面我們說的 sessionId 可以叫做令牌,令牌顧名思義就是確認(rèn)身份的意思,服務(wù)端可以通過令牌來確認(rèn)身份。

cookie+session 是實現(xiàn)認(rèn)證的一種非常好的方式,但是凡事都有兩面性,它們實現(xiàn)的認(rèn)證主要有以下缺點:

  • 增加請求體積,浪費性能,因為每次請求都會攜帶 cookie。
  • 增加服務(wù)端資源消耗,因為每個客戶端連接進來都需要生成 session,會占用服務(wù)端資源的。
  • 容易遭受 CSRF 攻擊,即跨站域請求偽造。

那么為了避免這些缺點,token 方式的鑒權(quán)出現(xiàn)了,它可以說是一個民間的認(rèn)證方式,但是不得不說它帶來了非常多的好處。

token 的組成:

token 其實就是一串字符串而已,只不過它是被加密后的字符串,它通常使用 uid(用戶唯一標(biāo)識)、時間戳、簽名以及一些其它參數(shù)加密而成。我們將 token 進行解密就可以拿到諸如 uid 這類的信息,然后通過 uid 來進行接下來的鑒權(quán)操作。

token 是如何生成的:

前面我們說 cookie 是服務(wù)端設(shè)置了 set-cookie 響應(yīng)頭之后,瀏覽器會自動保存 cookie,然后下一次發(fā)送請求的時候會自動把 cookie 攜帶上。但是我們說 cookie 算是一種民間的實現(xiàn)方式,所以說瀏覽器自然不會對它進行成么處理。token 主要是由服務(wù)器生成,然后返回給客戶端,客戶端手動把 token 存下來,比如利用 localstorage 或者直接存到 cookie 當(dāng)中也行。

token 認(rèn)證流程:

  1. 客戶端發(fā)起登錄請求,比如用戶輸入用戶名和密碼后登錄。
  2. 服務(wù)端校驗用戶名和密碼后,將用戶 id 和一些其它信息進行加密,生成 token。
  3. 服務(wù)端將 token 響應(yīng)給客戶端。
  4. 客戶端收到響應(yīng)后將 token 存儲下來。
  5. 下一次發(fā)送請求后需要將 token 攜帶上,比如放在請求頭中或者其它地方。
  6. 服務(wù)端 token 后校驗,校驗通過則正常返回數(shù)據(jù)。

用圖表示大致如下:

format,png

總結(jié)

雖然前面解釋 cookie、session、token 用了不少口舌,但是歸根結(jié)底啊,它們的目的都是一樣的:鑒權(quán)和認(rèn)證。

鑒權(quán)認(rèn)證方式特點優(yōu)點缺點
cookie1.存儲在客戶端。2.請求自動攜帶 cookie。3.存儲大小 4KB。1.兼容性好,因為是比較老的技術(shù)。2.很容易實現(xiàn),因為 cookie 會自動攜帶和存儲。1.需要單獨解決跨域攜帶問題,比如多臺服務(wù)器如何共享 cookie。2.會遭受 CSRF 攻擊。3.存儲在客戶端,不夠安全。
session1.存儲在服務(wù)端。2.存儲大小無限制。1.查詢速度快,因為是個會話,相當(dāng)于是在內(nèi)存中操作。2.結(jié)合 cookie 后很容易實現(xiàn)鑒權(quán)。3.安全,因為存儲在服務(wù)端。1.耗費服務(wù)器資源,因為每個客戶端都會創(chuàng)建 session。2.占據(jù)存儲空間,session 相當(dāng)于存儲了一個完整的用戶信息。
token1.體積很小。2.自由操作存儲在哪里。1.安全,因為 token 一般只有用戶 id,就算被截取了也沒什么用。2.無需消耗服務(wù)器內(nèi)存資源,它相當(dāng)于只存了用戶 id,session 相當(dāng)于存儲了用戶的所有信息。3.跨域處理較為方便,比如多臺服務(wù)器之間可以共用一個 token。1.查詢速度慢,因為 token 只存了用戶 id,每次需要去查詢數(shù)據(jù)庫。

總結(jié)下來就是:session 是空間換時間,token 是時間換空間。

附:cookie/session的聯(lián)系

session雖說存放在服務(wù)器端,但是仔細看剛才的執(zhí)行流程你會明白,session是依賴于cookie的,這一點也是本篇文章想要著重強調(diào)的

7.cookie/session使用注意事項

1.cookie大小有限制 4k

2.cookie不能跨瀏覽器

3.cookie不支持中文

4.如果是安全性較高的數(shù)據(jù)應(yīng)存放在session中,因為cookie存放在客戶端總會輕易被不法分子獲取

5.如果是訪問量特別大的網(wǎng)站,盡量不要在session中存儲用戶數(shù)據(jù),因為每個用戶存一個session會給服務(wù)器造成很大的壓力

但需要注意的是,若服務(wù)器做了負載均衡,用戶的下一次請求可能會被定向到其它服務(wù)器節(jié)點,若那臺節(jié)點上沒有用戶的Session信息,就會導(dǎo)致會話驗證失敗。所以Session默認(rèn)機制下是不適合分布式部署的。

到此這篇關(guān)于session、cookie、token區(qū)別的文章就介紹到這了,更多相關(guān)session、cookie、token區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Postman 使用指南及小技巧

    Postman 使用指南及小技巧

    Postman 簡化了構(gòu)建 API 的每個步驟,并簡化了協(xié)作,這樣就可以更快地創(chuàng)建 API。接下來通過本文給大家介紹Postman 使用指南及小技巧,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • sublime 格式化Json文件的方式

    sublime 格式化Json文件的方式

    這篇文章主要介紹了sublime 格式化Json的相關(guān)資料,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • 寫給正在讀計算機專業(yè)的同學(xué) 該如何學(xué)習(xí)

    寫給正在讀計算機專業(yè)的同學(xué) 該如何學(xué)習(xí)

    現(xiàn)在IT新技術(shù)日新月異。就常用編程語言而言,有c/c++、匯編、java,c#、Python等;操作系統(tǒng)平臺有unix/linux,windows系列
    2009-11-11
  • 解決VS2017不能打開stdio.h等文件的問題

    解決VS2017不能打開stdio.h等文件的問題

    下面小編就為大家?guī)硪黄鉀QVS2017不能打開stdio.h等文件的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Git命令常用操作之代碼拉取和提交方式

    Git命令常用操作之代碼拉取和提交方式

    這篇文章主要介紹了Git命令常用操作之代碼拉取和提交方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Jar包一鍵重啟的Shell腳本及新服務(wù)器部署的一些經(jīng)驗分享

    Jar包一鍵重啟的Shell腳本及新服務(wù)器部署的一些經(jīng)驗分享

    這篇文章主要介紹了Jar包一鍵重啟的Shell腳本及新服務(wù)器部署的一些經(jīng)驗,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Git版本回退之reset和revert使用詳解

    Git版本回退之reset和revert使用詳解

    這篇文章主要介紹了Git版本回退之reset和revert使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 詳解秒殺系統(tǒng)設(shè)計的5個要點

    詳解秒殺系統(tǒng)設(shè)計的5個要點

    這篇文章主要為大家介紹了秒殺系統(tǒng)設(shè)計的5個要點詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 微信小程序設(shè)置http請求的步驟詳解

    微信小程序設(shè)置http請求的步驟詳解

    這篇文章給大家介紹了微信小程序如何進行http請求的詳細步驟,相信對大家學(xué)習(xí)微信小程序網(wǎng)絡(luò)請求會有所幫助,有需要的朋友們下面來一起看看吧。
    2016-09-09
  • git分支或指定文件回退到指定版本命令詳解

    git分支或指定文件回退到指定版本命令詳解

    作為一名后端開發(fā),相信大家一定遇到過這樣的情景,代碼開發(fā)人員過多,并且開發(fā)分支過多,導(dǎo)致代碼版本管理困難,這樣就難免遇到一些代碼合并出錯,下面這篇文章主要給大家介紹了關(guān)于git分支或指定文件回退到指定版本命令的相關(guān)資料,需要的朋友可以參考下
    2023-12-12

最新評論

安庆市| 鹰潭市| 福建省| 莒南县| 敦煌市| 北流市| 九龙城区| 宜都市| 泾阳县| 漠河县| 湖北省| 望城县| 安岳县| 布拖县| 辽宁省| 商都县| 庄河市| 历史| 陵川县| 准格尔旗| 盖州市| 海城市| 定襄县| 台东县| 噶尔县| 安义县| 长乐市| 赞皇县| 灵台县| 天柱县| 吉水县| 康保县| 夏河县| 黄冈市| 开原市| 保山市| 蓝山县| 张家口市| 永胜县| 宿迁市| 商洛市|