搞測(cè)試的,Cookie、Session、Token、JWT 傻傻分不清楚可不行

今天的內(nèi)容,主要是圍繞Cookie、Session、Token、JWT 來(lái)介紹的,相信大家平常也會(huì)有傻傻分不清的時(shí)候,今天我們就來(lái)好好理一理。
什么是 cookie
HTTP 是無(wú)狀態(tài)的協(xié)議:每個(gè)請(qǐng)求都是完全獨(dú)立的,服務(wù)端無(wú)法確認(rèn)當(dāng)前訪問(wèn)者的身份信息,無(wú)法分辨上一次的請(qǐng)求發(fā)送者和這一次請(qǐng)求的發(fā)送者是不是同一個(gè)客戶端。服務(wù)器與瀏覽器為了進(jìn)行會(huì)話跟蹤,就必須主動(dòng)的去維護(hù)一個(gè)狀態(tài),這個(gè)狀態(tài)用于告訴服務(wù)端前后兩個(gè)請(qǐng)求是否來(lái)自同一個(gè)瀏覽器。這個(gè)狀態(tài)就需要通過(guò) cookie 或者 session 來(lái)實(shí)現(xiàn)。
cookie 存儲(chǔ)在客戶端:cookie 是服務(wù)器發(fā)送到用戶瀏覽器,并進(jìn)行保存到本地的數(shù)據(jù),它會(huì)在瀏覽器下次向同一服務(wù)器再發(fā)起請(qǐng)求時(shí)被再一次被帶到并發(fā)送到服務(wù)器上面
cookie 是不可跨域名的:每個(gè) cookie 都會(huì)綁定單一的域名,無(wú)法在別的域名下獲取使用
什么是 Session
session 是區(qū)別 cookie 的另一種記錄服務(wù)器和客戶端會(huì)話狀態(tài)的機(jī)制
session 是基于cookie 實(shí)現(xiàn)的,session 存儲(chǔ)在服務(wù)器端,sessionid 會(huì)被存儲(chǔ)到客戶端的 cookie 中

session 認(rèn)證流程
用戶第一次請(qǐng)求服務(wù)器的時(shí)候,服務(wù)器根據(jù)用戶提交的相關(guān)信息,創(chuàng)建對(duì)應(yīng)的 session
服務(wù)器響應(yīng)客戶端的請(qǐng)求,并返回唯一標(biāo)識(shí)信息 sessionid 給瀏覽器
瀏覽器把返回的 sessionid 存儲(chǔ)到 cookie 中,同時(shí) cookie 記錄次 sessionid 屬于哪個(gè)域名
當(dāng)用戶第二次訪問(wèn)服務(wù)器的時(shí)候,請(qǐng)求自動(dòng)判斷此域名下是否存在 cookie 信息,如果存在就將 cookie 信息發(fā)送給服務(wù)端,服務(wù)端會(huì)從 cookie 中獲取 sessionid,再根據(jù) sessionid 查找對(duì)應(yīng)的 session 信息,如果找到 session 證明用戶已經(jīng)登錄,可以執(zhí)行后面操作,如果沒(méi)有找到,說(shuō)明用戶沒(méi)有登錄或者失敗。
cookie 和 session 的區(qū)別
安全性:session 比 cookie 安全,session 是存儲(chǔ)在服務(wù)器端,cookie 是存儲(chǔ)在客戶端
存儲(chǔ)值的類型不同:cookie 只支持存字符串?dāng)?shù)據(jù),設(shè)置為其它類型的數(shù)據(jù),需要將其轉(zhuǎn)換成字符串,session 可以存任意數(shù)據(jù)類型。
有效期不同:cookie 可設(shè)置為長(zhǎng)時(shí)間保持,session 的失效時(shí)間比較短,客戶端關(guān)閉就會(huì)失效
存儲(chǔ)大小不同:?jiǎn)蝹€(gè) cookie 保持的數(shù)據(jù)不能超過(guò) 4KB,Session 存儲(chǔ)數(shù)據(jù)高于 cookie,當(dāng)訪問(wèn)量過(guò)多,會(huì)占用更多的服務(wù)器資源。
什么是 Token(令牌)
訪問(wèn)接口(API)時(shí)所需要的資源憑證,比如訂單接口需要帶上登錄返回的 token 值,才能訪問(wèn)訂單接口數(shù)據(jù)
常見(jiàn)的 token 組成:UID(用戶唯一的身份標(biāo)識(shí))、time(當(dāng)前時(shí)間的時(shí)間戳)、sign(簽名,token+ 請(qǐng)求數(shù)據(jù)進(jìn)行幾次 md5 之后的值)
token 的特點(diǎn):
服務(wù)端無(wú)狀態(tài)化、可擴(kuò)展性好
支持移動(dòng)端設(shè)備
安全性好
支持跨程序調(diào)用
token 的身份驗(yàn)證流程:

①、客戶端使用用戶名和密碼,請(qǐng)求登錄
②、服務(wù)端收到請(qǐng)求,驗(yàn)證用戶名和密碼
③、驗(yàn)證成功之后,服務(wù)端返回一個(gè) token,并把這個(gè) token 發(fā)送給客戶端
④、客戶端收到 token 之后,會(huì)把它存儲(chǔ)起來(lái),放入 cookie 里面
⑤、客戶端每次想服務(wù)器請(qǐng)求資源的時(shí)候,都需要帶著這個(gè) token
⑥、服務(wù)端收到請(qǐng)求的時(shí)候,驗(yàn)證客戶端請(qǐng)求里面帶著的 token,如果驗(yàn)證成功,就向客戶端返回請(qǐng)求的數(shù)據(jù)
每一次請(qǐng)求都需要攜帶 token,需要把 token 放到 HTTP 的請(qǐng)求頭里面
基于 token 的用戶認(rèn)證,服務(wù)端不用存放 token 數(shù)據(jù)。
Token 和 session 的區(qū)別
Session 是一種記錄服務(wù)器和客戶端會(huì)話狀態(tài)的機(jī)制,使服務(wù)端有狀態(tài)化,可以記錄會(huì)話信息。
token 是一種令牌,訪問(wèn)接口(API)時(shí)需要的憑證,也像古代進(jìn)入到城里需要腰牌一樣。token 使服務(wù)器無(wú)狀態(tài)化,不會(huì)存儲(chǔ)會(huì)話信息。
token 的安全性要好于 session,每次請(qǐng)求都有簽名,也就會(huì)出現(xiàn)每次的 token 都會(huì)變化,也可以防止一定的攻擊、
什么是 JWT
JSON Web Token(簡(jiǎn)稱 JWT)是目前最流行的跨越認(rèn)證解決方案。
是一種認(rèn)證授權(quán)機(jī)制
JMT 是在網(wǎng)絡(luò)應(yīng)用環(huán)境之間傳遞聲明,而執(zhí)行的一種基于 JSON 的開(kāi)發(fā)標(biāo)準(zhǔn)
JWT 的認(rèn)證流程:

客戶端將 token 保存到本地(通常使用 localstorge)
當(dāng)用戶訪問(wèn)一個(gè)受保護(hù)的路由或者資源的時(shí)候,需要請(qǐng)求頭的 Authorization 字段中使用 Bearer 模式添加 JWT
服務(wù)端的保護(hù)路由將會(huì)檢查請(qǐng)求頭 Authorization 中的 JWT 信息,如果合法,則允許用戶的行為
JWT 內(nèi)部保護(hù)了一些會(huì)話信息,減少了需要查詢數(shù)據(jù)庫(kù)的需要
JWT 并不使用 cookie,可以使用任何域名提供你的 API 服務(wù),不需要擔(dān)心跨域的問(wèn)題
用戶的狀態(tài)不存儲(chǔ)在服務(wù)端的內(nèi)存中,是一種無(wú)狀態(tài)的認(rèn)證機(jī)制
Token 和 JWT 的區(qū)別
相同點(diǎn):
都是訪問(wèn)資源的令牌
都可以記錄用戶的信息
都是使服務(wù)端無(wú)狀態(tài)化
都是只有驗(yàn)證成功后,客戶端才能訪問(wèn)服務(wù)端上受保護(hù)的資源
兩者的區(qū)別:
Token:服務(wù)端驗(yàn)證收到客戶端發(fā)送過(guò)來(lái)的 token 時(shí),需要查詢數(shù)據(jù)庫(kù)獲取用戶信息,驗(yàn)證 Token 是否有效
JWT:將 Token 和請(qǐng)求信息加密后存儲(chǔ)在客戶端,服務(wù)端只需要使用密鑰進(jìn)行校驗(yàn)即可,不需要查詢或者減少查詢數(shù)據(jù)庫(kù),因?yàn)?JWT 自己包含了用戶信息和加密的數(shù)據(jù)
常見(jiàn)的前后端鑒權(quán)方式:
Session-Cookie
Token 驗(yàn)證(包括 JWT,sso)
Oauth2.0
聲明:本文為檸檬班庫(kù)里老師原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處!