欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

1.為什么會(huì)有它們?

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

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

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

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

2.什么是 cookie?

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

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

cookie 主要有以下屬性:

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

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

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

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

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

cookie 主要有以下特點(diǎn):

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

3.什么是 session?

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

簡(jiǎn)單描述下 session:

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

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

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

我們可以在修改一下整個(gè)請(qǐng)求過(guò)程圖,如下所示:

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

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

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

  • session 比 cookie 更加安全,因?yàn)樗谴嬖诜?wù)端的,cookie 是存在客戶端的。
  • cookie 只支持存儲(chǔ)字符串?dāng)?shù)據(jù),session 可以存儲(chǔ)任意數(shù)據(jù)。
  • cookie 的有效期可以設(shè)置較長(zhǎng)時(shí)間,session 有效期都比較短。
  • session 存儲(chǔ)空間很大,cookie 有限制。

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

5.token 是什么?

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

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

  • 增加請(qǐng)求體積,浪費(fèi)性能,因?yàn)槊看握?qǐng)求都會(huì)攜帶 cookie。
  • 增加服務(wù)端資源消耗,因?yàn)槊總€(gè)客戶端連接進(jìn)來(lái)都需要生成 session,會(huì)占用服務(wù)端資源的。
  • 容易遭受 CSRF 攻擊,即跨站域請(qǐng)求偽造。

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

token 的組成:

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

token 是如何生成的:

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

token 認(rèn)證流程:

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

用圖表示大致如下:

format,png

總結(jié)

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

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

總結(jié)下來(lái)就是:session 是空間換時(shí)間,token 是時(shí)間換空間。

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

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

7.cookie/session使用注意事項(xiàng)

1.cookie大小有限制 4k

2.cookie不能跨瀏覽器

3.cookie不支持中文

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

5.如果是訪問(wèn)量特別大的網(wǎng)站,盡量不要在session中存儲(chǔ)用戶數(shù)據(jù),因?yàn)槊總€(gè)用戶存一個(gè)session會(huì)給服務(wù)器造成很大的壓力

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

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

相關(guān)文章

  • 進(jìn)制轉(zhuǎn)換算法原理(二進(jìn)制 八進(jìn)制 十進(jìn)制 十六進(jìn)制)

    進(jìn)制轉(zhuǎn)換算法原理(二進(jìn)制 八進(jìn)制 十進(jìn)制 十六進(jìn)制)

    進(jìn)制轉(zhuǎn)換算法原理(二進(jìn)制 八進(jìn)制 十進(jìn)制 十六進(jìn)制),以前上學(xué)那會(huì)確實(shí)學(xué)過(guò),長(zhǎng)時(shí)間不用都忘了。
    2010-05-05
  • 架構(gòu)思維之緩存雪崩的災(zāi)難復(fù)盤

    架構(gòu)思維之緩存雪崩的災(zāi)難復(fù)盤

    這篇文章主要介紹了架構(gòu)思維中一次緩存雪崩的災(zāi)難復(fù)盤真實(shí)案例的分享,希望可以對(duì)大家在工作中有所啟發(fā),祝大家多多進(jìn)步早日升職加薪
    2022-01-01
  • git提交報(bào)錯(cuò)pre -commit hook failed (add --no-verify)問(wèn)題及解決

    git提交報(bào)錯(cuò)pre -commit hook failed (add 

    這篇文章主要介紹了git提交報(bào)錯(cuò)pre -commit hook failed (add --no-verify)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 防范SQL注入式攻擊

    防范SQL注入式攻擊

    SQL注入式攻擊是利用是指利用設(shè)計(jì)上的漏洞,在目標(biāo)服務(wù)器上運(yùn)行Sql命令以及進(jìn)行其他方式的攻擊動(dòng)態(tài)生成Sql命令時(shí)沒(méi)有對(duì)用戶輸入的數(shù)據(jù)進(jìn)行驗(yàn)證是Sql注入攻擊得逞的主要原因。
    2009-07-07
  • Matlab實(shí)現(xiàn)新冠病毒傳播模擬效果

    Matlab實(shí)現(xiàn)新冠病毒傳播模擬效果

    2022年4月11日?qǐng)?bào)道,日本NEC公司8日宣布已開始利用最尖端的人工智能(AI)技術(shù)開發(fā)新冠疫苗,本文給大家?guī)?lái)了Matlab實(shí)現(xiàn)新冠病毒傳播模擬效果,需要的朋友可以參考下
    2022-04-04
  • 在VSCode中如何配置Python開發(fā)環(huán)境

    在VSCode中如何配置Python開發(fā)環(huán)境

    VScode是一個(gè)相當(dāng)優(yōu)秀的IDE,具備開源、跨平臺(tái)、模塊化、插件豐富、啟動(dòng)時(shí)間快、顏值高、可高度定制等等優(yōu)秀的特質(zhì),所以用VScode來(lái)編寫Python,也是相當(dāng)?shù)暮糜玫?。所以,今天我們就?lái)講講,怎么在VScode上配置Python開發(fā)環(huán)境。
    2020-01-01
  • 在ubuntu18.04版本安裝vscode(2種)

    在ubuntu18.04版本安裝vscode(2種)

    這篇文章主要介紹了在ubuntu18.04版本安裝vscode,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • git log根據(jù)特定條件查詢?nèi)罩静⒔y(tǒng)計(jì)修改的代碼行數(shù)

    git log根據(jù)特定條件查詢?nèi)罩静⒔y(tǒng)計(jì)修改的代碼行數(shù)

    這篇文章主要介紹了git log根據(jù)特定條件查詢?nèi)罩静⒔y(tǒng)計(jì)修改的代碼行數(shù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 關(guān)于base64編碼的原理及實(shí)現(xiàn)方法分享

    關(guān)于base64編碼的原理及實(shí)現(xiàn)方法分享

    我們的圖片大部分都是可以轉(zhuǎn)換成base64編碼的data:image。 這個(gè)在將canvas保存為img的時(shí)候尤其有用
    2012-03-03
  • Git原理和常用操作

    Git原理和常用操作

    今天小編就為大家分享一篇關(guān)于Git原理和常用操作的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10

最新評(píng)論