溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Session、JWT與OAuth2的特點(diǎn)是什么

發(fā)布時(shí)間:2022-01-19 16:18:04 來(lái)源:億速云 閱讀:178 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“Session、JWT與OAuth2的特點(diǎn)是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Session、JWT與OAuth2的特點(diǎn)是什么”吧!

Session模式

瀏覽器主流授權(quán)模式采用Session模式。

participant 瀏覽器 participant 服務(wù)器 瀏覽器->服務(wù)器: 用戶登錄 Note right of 瀏覽器: 提供用戶名、密碼 服務(wù)器->服務(wù)器: 產(chǎn)生并保存 Session ID Note right of 服務(wù)器: Session ID 與用戶關(guān)聯(lián) 服務(wù)器-->瀏覽器: 返回 Session ID 瀏覽器->瀏覽器: 自動(dòng)將 Session ID 保存到 Cookie 瀏覽器->服務(wù)器: 再次訪問(wèn) Note right of 瀏覽器: 自動(dòng)攜帶 Cookie (包含 Session ID) 服務(wù)器->服務(wù)器: 檢查 Session ID 是否存在 Note right of 服務(wù)器: 存在則自動(dòng)匹配相應(yīng)用戶并刷新 Session 過(guò)期時(shí)間 服務(wù)器-->瀏覽器: 返回響應(yīng)結(jié)果

特點(diǎn)

  • 服務(wù)器端產(chǎn)生Session ID,瀏覽器每次訪問(wèn)時(shí)攜帶Session ID作為身份標(biāo)識(shí)。

  • Session過(guò)期時(shí)間一般為30分鐘,每次訪問(wèn)會(huì)自動(dòng)刷新過(guò)期時(shí)間。

優(yōu)勢(shì)

  • 30分鐘無(wú)操作Session自動(dòng)過(guò)期,增強(qiáng)安全性。

  • 服務(wù)器可將Session ID的Cookie設(shè)置成HttpOnly,可以防止js從Cookie讀取Session ID。避免XSS漏洞獲取Session ID。

  • 符合大部分人的使用習(xí)慣。

缺點(diǎn)

  • Session信息需要在服務(wù)器端保存一份副本。在多服務(wù)器(如集群)的情況下,需要進(jìn)行Session同步。

  • Session只要保持刷新,則永久有效(除非用戶主動(dòng)退出)。如果攻擊者從瀏覽器或者從數(shù)據(jù)傳輸中竊取到Session ID,則可以保持該Session ID永久有效。

JWT模式

JWT全稱為:JSON Web Token。適合分布式的授權(quán)模式。用戶登錄成功后,認(rèn)證服務(wù)器會(huì)返回一個(gè)帶有簽名認(rèn)證的JWT。JWT保存在客戶端(如瀏覽器或APP),每次訪問(wèn)應(yīng)用服務(wù)器時(shí),將JWT放到http的header里面。不同于Session的集中管理,JWT自身就包含了用戶信息,每臺(tái)應(yīng)用服務(wù)器可以自己獨(dú)自判斷JWT是哪個(gè)用戶、是否合法、是否過(guò)期,無(wú)需再向認(rèn)證服務(wù)器確認(rèn),也沒(méi)有Session同步的問(wèn)題。JWT至少包含以下信息:

  • sub: Subject,一般為用戶ID。

  • exp: Expiration Time。過(guò)期時(shí)間。

  • signature: 簽名。用于驗(yàn)證JWT是否合法。

participant 用戶瀏覽器 participant 應(yīng)用服務(wù)器 participant 認(rèn)證服務(wù)器 用戶瀏覽器->應(yīng)用服務(wù)器: 訪問(wèn)登錄頁(yè)面 應(yīng)用服務(wù)器-->用戶瀏覽器: 返回登錄頁(yè)面 用戶瀏覽器->認(rèn)證服務(wù)器: 登錄請(qǐng)求 Note right of 用戶瀏覽器: 提供用戶名、密碼 認(rèn)證服務(wù)器-->用戶瀏覽器: 提示用戶登錄成功 Note left of 認(rèn)證服務(wù)器: 返回JWT,包含用戶ID、過(guò)期時(shí)間和簽名 用戶瀏覽器->應(yīng)用服務(wù)器: 獲取數(shù)據(jù) Note right of 用戶瀏覽器: header中攜帶JWT 應(yīng)用服務(wù)器->應(yīng)用服務(wù)器: 解析JWT Note right of 應(yīng)用服務(wù)器: 通過(guò)簽名驗(yàn)證JWT是否合法,判斷是否過(guò)期,并獲取用戶ID 應(yīng)用服務(wù)器-->用戶瀏覽器: 返回?cái)?shù)據(jù)

Access Token 和 Refresh Token

Access Token需要放到http的header里面,用于訪問(wèn)各種資源。由于使用頻繁且使用場(chǎng)景復(fù)雜,泄露風(fēng)險(xiǎn)較大,因此過(guò)期時(shí)間會(huì)比較短,比如30分鐘。如果每30分鐘讓用戶重新登錄一次,顯然用戶體驗(yàn)極差。所以認(rèn)證服務(wù)器在返回Access Token時(shí),還會(huì)同時(shí)返回一個(gè)Refresh Token。Refresh Token平時(shí)不使用,只用于從認(rèn)證服務(wù)器獲取新的Access Token,會(huì)安全很多。

Refresh Token 有效期

Refresh Token的有效期通常為30天。但在很多手機(jī)APP應(yīng)用,并不想讓用戶每30天就登錄一次。而將有效期設(shè)置為1年甚至2年,又覺(jué)風(fēng)險(xiǎn)稍大。

給Refresh Token增加一個(gè)認(rèn)證有效期(如30天),有效期則可以較長(zhǎng)(如1年)。只要在認(rèn)證有效期內(nèi)刷新,則可以獲取新的Refresh Token,認(rèn)證有效期重新計(jì)算,有效期按前一個(gè)Refresh Token計(jì)算;如果過(guò)了認(rèn)證有效期再刷新,則Refresh Token不刷新,且只能獲取到Remember Me權(quán)限的Access Token。

只要用戶在30天內(nèi)使用了APP,則自動(dòng)刷新Refresh Token,無(wú)需再次登錄。直到1年后刷新有效期到期,才需要再次登錄。

刷新Access Token時(shí),自動(dòng)返回新的Refresh Token。無(wú)需專門刷新Refresh Token。

Remember Me(記住我)

并且在瀏覽網(wǎng)站時(shí),通常會(huì)有兩個(gè)級(jí)別的權(quán)限,一種是記住我的權(quán)限,一種是登錄的權(quán)限。

給Access Token增加Remember Me標(biāo)識(shí)。如果Refresh Token過(guò)了認(rèn)證有效期再刷新,則只能獲取到Remember Me權(quán)限的Access Token。

30分鐘自動(dòng)過(guò)期

使用瀏覽器訪問(wèn)時(shí),不能長(zhǎng)期保存Refresh Token(安全考慮)。必須在瀏覽器關(guān)閉或用戶退出時(shí)刪除Refresh Token。

要模擬Session 30分鐘過(guò)期的模式,可以規(guī)定在瀏覽器訪問(wèn)時(shí),返回的Refresh Token的認(rèn)證有效期為30分鐘,用戶操作后再刷新Refresh Token,以維持Refresh Token的有效性。

Refresh Token可以保存到Cookie或者sessionStorage,確保關(guān)閉頁(yè)面時(shí)Refresh Token會(huì)被刪除。

刷新Token時(shí)機(jī)

可以每5分鐘自動(dòng)刷新Token(不需要自動(dòng)過(guò)期時(shí))。如果需要自動(dòng)過(guò)期,則要根據(jù)用戶的操作刷新。用戶每次操作時(shí),如距離上次刷新Token時(shí)間超過(guò)5分鐘,則自動(dòng)刷新Token。

每5分鐘刷新一次Token,可以更準(zhǔn)確的監(jiān)測(cè)在線人數(shù),也更滿足模擬自動(dòng)過(guò)期的要求。如果覺(jué)得5分鐘太短,可以嘗試10分鐘。

重新登錄時(shí)機(jī)

為了避免用戶正在操作的時(shí)候,突然Refresh Token到期重新登錄,應(yīng)該在Refresh Token到期的最后30天中,用戶重新打開(kāi)APP時(shí),要求用戶重新登錄。

在線人數(shù)

如果需要監(jiān)控在線人數(shù),則認(rèn)證服務(wù)器應(yīng)該將登錄的數(shù)據(jù)寫入數(shù)據(jù)庫(kù)。由于Access Token的有效期很短,通常需要5分鐘到應(yīng)用服務(wù)器刷新一次。因此可以很容易的監(jiān)控到當(dāng)前的在線人員。

如何將眾多的Access Token和Refresh Token與某個(gè)用戶的登錄關(guān)聯(lián)起來(lái),關(guān)鍵在于用戶登錄時(shí)需要產(chǎn)生一個(gè)登錄ID,將這個(gè)ID寫入所有后續(xù)的Refresh Token和Access Token中,則可以知道任意一個(gè)Token是屬于哪個(gè)用戶的哪次登錄。

Refresh Token泄露監(jiān)控

由于同一系列的Refresh Token都擁有同一個(gè)登錄ID,而每個(gè)Refresh Token都會(huì)在5分鐘或者更長(zhǎng)的時(shí)間內(nèi)刷新Access Token,因此只要有相同登錄ID的Refresh Token在5分鐘內(nèi)刷新了兩次Access Token,就可判頂Refresh Token已經(jīng)泄露。

強(qiáng)制下線

Refresh Token強(qiáng)制下線:需要在認(rèn)證服務(wù)器記錄所有已發(fā)布并在刷新有效期內(nèi)的Refresh Token(可以只記錄登錄ID),每次刷新token時(shí),檢查登錄ID是否被強(qiáng)制下線。由于Refresh Token每5分鐘刷新一次,且Access Token有效期為30分鐘,這種下線不是即時(shí)生效的。但代價(jià)較低,只要在認(rèn)證服務(wù)器處理即可。

Access Token強(qiáng)制下線:時(shí)效性高,立即下線,但代價(jià)也較高。需要每個(gè)應(yīng)用服務(wù)器在驗(yàn)證JWT時(shí),向認(rèn)證服務(wù)器進(jìn)行校驗(yàn),以檢查Access Token對(duì)應(yīng)的登錄ID是否被強(qiáng)制下線。這已經(jīng)違反了JWT自描述的設(shè)計(jì)初衷,且性能損耗有可能非常大。不過(guò)在認(rèn)證服務(wù)器和應(yīng)用服務(wù)器為同一服務(wù)器的情況下,還是可用的。

OAuth 2

主要用于第三方登錄,如微信登錄、QQ登錄、微博登錄等。所有的應(yīng)用都必須先到認(rèn)證服務(wù)器備案(如微信、QQ、微博),獲取客戶端ID(Client ID)和客戶端密鑰(Client Secret)。

participant 用戶瀏覽器 participant 應(yīng)用服務(wù)器 participant 認(rèn)證服務(wù)器 用戶瀏覽器->應(yīng)用服務(wù)器: 登錄請(qǐng)求 應(yīng)用服務(wù)器-->用戶瀏覽器: 重定向至認(rèn)證服務(wù)器 Note left of 應(yīng)用服務(wù)器: 提供Client ID 用戶瀏覽器->認(rèn)證服務(wù)器: 允許授權(quán) Note right of 用戶瀏覽器: 提供用戶名、密碼和Client ID 認(rèn)證服務(wù)器-->用戶瀏覽器: 返回授權(quán)碼并重定向至應(yīng)用服務(wù)器 Note left of 認(rèn)證服務(wù)器: 授權(quán)碼授權(quán)碼在瀏覽器中傳遞,可能被泄漏,所以只能用于獲取Token 用戶瀏覽器->應(yīng)用服務(wù)器: 提供授權(quán)碼 應(yīng)用服務(wù)器->認(rèn)證服務(wù)器: 獲取Token Note right of 應(yīng)用服務(wù)器: 提供授權(quán)碼、Client ID、Client Secret 認(rèn)證服務(wù)器-->應(yīng)用服務(wù)器: 返回Token 應(yīng)用服務(wù)器->認(rèn)證服務(wù)器: 獲取用戶信息 Note right of 應(yīng)用服務(wù)器: 提供Token 認(rèn)證服務(wù)器-->應(yīng)用服務(wù)器: 返回Token對(duì)應(yīng)用戶的信息 應(yīng)用服務(wù)器-->用戶瀏覽器: 提示用戶登錄成功

感謝各位的閱讀,以上就是“Session、JWT與OAuth2的特點(diǎn)是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Session、JWT與OAuth2的特點(diǎn)是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI