自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

熬夜徹底搞懂Cookie Session Token JWT

開發(fā) 前端
在分布式微服務(wù)技術(shù)日趨流行的今天,大型網(wǎng)站的設(shè)計(jì)都盡量避免使用 session 實(shí)現(xiàn) HTTP 狀態(tài)化。

[[416130]]

本文轉(zhuǎn)載自微信公眾號(hào)「愛笑的架構(gòu)師」,作者雷小帥 。轉(zhuǎn)載本文請(qǐng)聯(lián)系愛笑的架構(gòu)師公眾號(hào)。

一切的根源就是因?yàn)?HTTP 是一個(gè)無狀態(tài)的協(xié)議。

HTTP 是一個(gè)無狀態(tài)的協(xié)議

什么是無狀態(tài)呢?就是說這一次請(qǐng)求和上一次請(qǐng)求是沒有任何關(guān)系的,互不認(rèn)識(shí)的,沒有關(guān)聯(lián)的。

看過電影《夏洛特?zé)馈返男』锇榭隙ㄓ浀孟穆搴痛鬆數(shù)囊欢螌?duì)話:

夏洛:大爺,樓上322住的是馬冬梅家嗎?

大爺:馬冬什么?

夏洛:馬冬梅。

大爺:什么冬梅啊?

夏洛:馬冬梅啊。

大爺:馬什么梅啊?

夏洛:……行,大爺,您先涼快吧。

「打岔」大爺記不住馬冬梅,就如同 HTTP 協(xié)議記不住上一次請(qǐng)求。說得通俗一點(diǎn):HTTP 的記憶力不太好,需要借助『助聽器』。

記憶力不好的優(yōu)點(diǎn)就是一個(gè)字「快」;缺點(diǎn)也很明顯,需要借靠 cookie、session 、token等機(jī)制將客戶端多次請(qǐng)求關(guān)聯(lián)起來。

想象一下如果沒有 cookie、session、token 這樣的機(jī)制,我們?cè)诰W(wǎng)站上每次點(diǎn)擊都需要重新輸入密碼認(rèn)證,這樣槽糕的體驗(yàn)?zāi)氵€愿意繼續(xù)用嗎?

在講解cookie、session 、token前我們先簡(jiǎn)單講解兩個(gè)概念:認(rèn)證、授權(quán)。

什么是認(rèn)證?

認(rèn)證(Authentication)簡(jiǎn)單來講就是驗(yàn)證當(dāng)前者的身份,證明你是你自己。

最常見的認(rèn)證方式是通過用戶名和密碼,除此之外還有:

  • 通過用戶手機(jī):手機(jī)短信、手機(jī)二維碼掃描、手勢(shì)密碼
  • 用戶的電子郵箱
  • 身份證號(hào)碼
  • 基于時(shí)間序列和用戶相關(guān)的一次性口令
  • 用戶的生物學(xué)特征:指紋、語音、眼睛虹膜等

為了確認(rèn)用戶的身份,防止請(qǐng)求偽造,在安全要求高的場(chǎng)合,經(jīng)常會(huì)使用組合認(rèn)證(也叫多因素認(rèn)證),也就是同時(shí)使用多個(gè)認(rèn)證方式對(duì)用戶的身份進(jìn)行校驗(yàn)。

什么是授權(quán)?

授權(quán)(Authorization)簡(jiǎn)單來講就是授予第三方訪問用戶資源的權(quán)限。

在互聯(lián)網(wǎng)應(yīng)用開發(fā)中,主要通過下面幾種方式實(shí)現(xiàn)授權(quán):

  • 通過 session 機(jī)制,一個(gè)訪問會(huì)話保持著用戶的授權(quán)信息
  • 通過 cookie 機(jī)制,一個(gè)網(wǎng)站的 cookie 保持著用戶的授權(quán)信息
  • 頒發(fā)授權(quán)令牌(token),一個(gè)合法有效的令牌中保持著用戶的授權(quán)信息

什么是 cookie?

cookie 的特點(diǎn)

  • cookie 最開始被設(shè)計(jì)出來是為了彌補(bǔ)HTTP在狀態(tài)管理上的不足。
  • cookie 存儲(chǔ)在客戶端:cookie 是服務(wù)器發(fā)送到用戶瀏覽器并保存在本地的一小塊數(shù)據(jù),它會(huì)在瀏覽器下次向同一服務(wù)器再發(fā)起請(qǐng)求時(shí)被攜帶并發(fā)送到服務(wù)器上。
  • cookie 是不可跨域的:每個(gè) cookie 都會(huì)綁定單一的域名(包括子域),無法在別的域名下獲取使用。

設(shè)置 cookie

服務(wù)器向客戶端發(fā)送 Cookie 是通過 HTTP 響應(yīng)報(bào)文實(shí)現(xiàn)的,在 Set-Cookie 中設(shè)置需要向客戶端發(fā)送的cookie,cookie格式如下:

  1. Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure] 

cookie 工作流程

(1)瀏覽器向服務(wù)器發(fā)送請(qǐng)求;

(2)服務(wù)器響應(yīng)請(qǐng)求,向?yàn)g覽器設(shè)置 cookie;

(3)瀏覽器將 cookie 存在本地,下一次請(qǐng)求帶上該 cookie;

(4)服務(wù)器響應(yīng)請(qǐng)求。

cookie 常見屬性

(1)name=value

鍵值對(duì),設(shè)置 Cookie 的名稱及相對(duì)應(yīng)的值。

(2)domain

指定 cookie 所屬域名,默認(rèn)是當(dāng)前域名。如果 cookie 的 domain 設(shè)置為 taobao.com,那么 item.taobao.com, order.taobao.com 都是可以共享 cookie 的, 但是訪問 tmall.com 就不能共享 cookie 了,這就涉及跨域訪問的問題,跨域問題如何解決,這里不展開,有興趣可以自行搜索。

(3)path

指定 cookie 在哪個(gè)路徑(路由)下生效,默認(rèn)是 '/'。如果設(shè)置為 /abc,則只有 /abc 下的路由可以訪問到該 cookie,如:/abc/read。

(4)expires

指定 cookie 的過期時(shí)間(GMT時(shí)間格式),到達(dá)該時(shí)間點(diǎn)后該 cookie 就會(huì)自動(dòng)失效。

(5)max-age

HTTP 1.1中定義的,優(yōu)先級(jí)高于 expires 字段。

max-age 表示 cookie 有效期,單位秒。如果為正數(shù),則該 cookie 在 max-age 秒后失效;如果為負(fù)數(shù),該 cookie 為臨時(shí) cookie ,關(guān)閉瀏覽器即失效,瀏覽器也不會(huì)以任何形式保存該 cookie ;如果為 0,表示刪除該 cookie 。默認(rèn)為 -1。

(6)HttpOnly

如果給某個(gè) cookie 設(shè)置了 httpOnly 屬性,則無法通過 JS 腳本讀寫該 cookie 的信息。

(7)secure

該 cookie 是否僅被使用安全協(xié)議傳輸,默認(rèn)為false。當(dāng) secure 值為 true 時(shí),cookie 在 HTTP 中是無效的。

什么是 session?

session 翻譯過來就是『會(huì)話』。用戶打開一個(gè)瀏覽器, 點(diǎn)擊多個(gè)超鏈接, 訪問服務(wù)器多個(gè)web資源, 然后關(guān)閉瀏覽器, 整個(gè)過程稱之為一個(gè)會(huì)話。

(1)session 的特點(diǎn)

session 是另一種記錄服務(wù)器和客戶端會(huì)話狀態(tài)的機(jī)制;

session 存儲(chǔ)在服務(wù)器端,一般是文件中,也可以存在數(shù)據(jù)庫(kù)或緩存中。

session 一般基于 cookie 實(shí)現(xiàn)。session 中包含敏感信息存儲(chǔ)在服務(wù)器端,通常將 sessionId 存儲(chǔ)在客戶端的 cookie 中,客戶端每次請(qǐng)求攜帶 sessionId 即可識(shí)別用戶。

(2)session 工作流程

(1)用戶第一次請(qǐng)求,提交用戶名密碼等信息進(jìn)行登錄認(rèn)證,服務(wù)器根據(jù)用戶提交的信息進(jìn)行鑒權(quán),鑒權(quán)成功后創(chuàng)建 session 對(duì)象,并將 sessionId 塞入 cookie 中,瀏覽器收到響應(yīng)信息將 cookie 存入本地;

(2)用戶第二次請(qǐng)求,以查看訂單信息為例,瀏覽器自動(dòng)將當(dāng)前域名下的 cookie 信息發(fā)送給服務(wù)端,服務(wù)端解析 cookie,獲取到 sessionId 后再查找對(duì)應(yīng)的 session 對(duì)象,如果 session 對(duì)象存在說明用戶已經(jīng)登錄,繼續(xù)下一步操作。

從上面的流程可知,sessionId 是 cookie 和 session 中間的一道橋梁。

需要注意:如果客戶端禁用了 cookie,還可以通過 url 重寫等方法傳遞 sessionId。

cookie 和 session 的區(qū)別

  • 存儲(chǔ)方式:cookie 數(shù)據(jù)存放在客戶的瀏覽器上,session 數(shù)據(jù)放在服務(wù)器上;
  • 安全性:cookie 是本地存儲(chǔ),不是很安全,別人可以分析存放在本地的 cookie 并進(jìn)行欺騙;
  • 存儲(chǔ)大小:很多瀏覽器限制單個(gè) cookie 保存的數(shù)據(jù)不能超過4K,一個(gè)站點(diǎn)最多保存20個(gè)cookie,session 沒有類似的限制;
  • 生存周期:cookie 可設(shè)置為長(zhǎng)時(shí)間保持,Session 一般失效時(shí)間較短,一般客戶端關(guān)閉 session 就會(huì)失效。

什么是 token ?

(1)token 的組成

token 是驗(yàn)證用戶身份的憑證,我們通常叫它:令牌。

最簡(jiǎn)單的token組成: uid(用戶唯一的身份標(biāo)識(shí))、time(當(dāng)前時(shí)間的時(shí)間戳)、sign(簽名,以哈希算法壓縮成一定長(zhǎng)的十六進(jìn)制字符串)

(2)token 特點(diǎn)

  • 無狀態(tài)、可擴(kuò)展
  • 支持移動(dòng)端設(shè)備
  • 支持跨程序調(diào)用
  • 安全

(3)token 工作流程

第一步:客戶端使用用戶名密碼或者掃碼等形式請(qǐng)求登錄;

第二步:服務(wù)端收到請(qǐng)求后進(jìn)行鑒權(quán),鑒權(quán)成功后服務(wù)端會(huì)生成一個(gè) token 并發(fā)送給客戶端,客戶端收到 token 以后,會(huì)把它存儲(chǔ)起來,比如放在 cookie 里或者 localStorage 里;

第三步:客戶端下一次向服務(wù)端請(qǐng)求資源的時(shí)候需要帶著存儲(chǔ)的 token;

第四步:服務(wù)端收到請(qǐng)求,然后去驗(yàn)證客戶端請(qǐng)求里面帶著的 token ,如果驗(yàn)證成功,就向客戶端返回請(qǐng)求的數(shù)據(jù)。

需要注意:

  • 客戶端請(qǐng)求時(shí)可以將 token 放到 HTTP 的 Header 里;
  • 基于 token 的用戶認(rèn)證是一種服務(wù)端無狀態(tài)的認(rèn)證方式,服務(wù)端不用存放 token 數(shù)據(jù)。
  • 用解析 token 的計(jì)算時(shí)間換取 session 的存儲(chǔ)空間,從而減輕服務(wù)器的壓力,減少頻繁的查詢數(shù)據(jù)庫(kù)

什么是 JWT?

(1)JWT 是標(biāo)準(zhǔn) 化的 token

從本質(zhì)上講 JWT 也是一種 token,只不過 JWT 是被大家廣泛接受的標(biāo)準(zhǔn)。

JWT 即:Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于 JSON 的開放標(biāo)準(zhǔn)(RFC 7519)。

JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息。

(2)JWT 的組成

JWT 共有三部分組成:

  • 第一部分我們稱它為頭部(header)
  • 第二部分我們稱其為載荷(payload, 類似于飛機(jī)上承載的物品)
  • 第三部分是簽證(signature)

在https://jwt.io/網(wǎng)站上可以解析一個(gè)已知的 JWT:

  • header

jwt的頭部承載兩部分信息:聲明類型,這里是jwt;聲明加密的算法,通常直接使用 HMAC SHA256;

  • playload

載荷就是存放有效信息的地方。主要包含三個(gè)部分:標(biāo)準(zhǔn)中注冊(cè)的聲明;公共的聲明;私有的聲明。

  • signature

jwt 的第三部分是一個(gè)簽名信息,這個(gè)簽證信息由三部分組成:header (base64后的);payload (base64后的);secret。

(3)JWT 的特點(diǎn)

不在 jwt 的 payload 部分存放敏感信息,因?yàn)樵摬糠质强蛻舳丝山饷艿牟糠帧?/p>

保護(hù)好 secret 私鑰,該私鑰非常重要。

如果可以,請(qǐng)使用 https 協(xié)議。

總結(jié)

在分布式微服務(wù)技術(shù)日趨流行的今天,大型網(wǎng)站的設(shè)計(jì)都盡量避免使用 session 實(shí)現(xiàn) HTTP 狀態(tài)化。

session簡(jiǎn)單粗暴,在服務(wù)端維護(hù)會(huì)話信息,在客戶端保存session id,服務(wù)端能夠輕易地把會(huì)話控制在自己的手中,但服務(wù)集群化產(chǎn)生了session共享的負(fù)擔(dān);

jwt(token)只在客戶端保存會(huì)話信息,服務(wù)端通過密鑰校驗(yàn)會(huì)話,(相比session)拿時(shí)間換空間,卸下了服務(wù)端集群共享會(huì)話信息的負(fù)擔(dān),同時(shí)也加大了服務(wù)端控制會(huì)話的難度。

 

責(zé)任編輯:武曉燕 來源: 愛笑的架構(gòu)師
相關(guān)推薦

2019-06-11 14:45:25

2019-11-07 10:37:36

CookieSessionToken

2023-12-11 11:29:35

2019-12-04 13:50:07

CookieSessionToken

2021-03-23 10:45:23

CookieSession前端

2019-11-06 17:30:57

cookiesessionWeb

2023-12-27 08:16:54

Sessiontoken安全性

2021-09-05 18:26:42

2021-09-01 10:15:15

前端cookiesession

2021-08-02 12:50:45

sessiontokenJava

2020-01-19 10:07:25

SessionTokenCookie

2024-04-26 12:45:39

JWTCookieSession

2023-12-04 10:36:46

SessionCookie

2025-04-21 04:00:00

2019-12-06 08:17:25

SessionCookieToken

2019-11-12 13:45:11

WebCookieSession

2024-01-03 13:39:00

JS,Javascrip算法

2023-10-18 10:55:55

HashMap

2025-01-13 16:00:00

服務(wù)網(wǎng)關(guān)分布式系統(tǒng)架構(gòu)

2025-04-11 05:55:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)