您好,登錄后才能下訂單哦!
這篇文章主要講解了“Session、JWT與OAuth2的特點是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Session、JWT與OAuth2的特點是什么”吧!
瀏覽器主流授權模式采用Session模式。
participant 瀏覽器 participant 服務器 瀏覽器->服務器: 用戶登錄 Note right of 瀏覽器: 提供用戶名、密碼 服務器->服務器: 產生并保存 Session ID Note right of 服務器: Session ID 與用戶關聯 服務器-->瀏覽器: 返回 Session ID 瀏覽器->瀏覽器: 自動將 Session ID 保存到 Cookie 瀏覽器->服務器: 再次訪問 Note right of 瀏覽器: 自動攜帶 Cookie (包含 Session ID) 服務器->服務器: 檢查 Session ID 是否存在 Note right of 服務器: 存在則自動匹配相應用戶并刷新 Session 過期時間 服務器-->瀏覽器: 返回響應結果
服務器端產生Session ID,瀏覽器每次訪問時攜帶Session ID作為身份標識。
Session過期時間一般為30分鐘,每次訪問會自動刷新過期時間。
30分鐘無操作Session自動過期,增強安全性。
服務器可將Session ID的Cookie設置成HttpOnly,可以防止js從Cookie讀取Session ID。避免XSS漏洞獲取Session ID。
符合大部分人的使用習慣。
Session信息需要在服務器端保存一份副本。在多服務器(如集群)的情況下,需要進行Session同步。
Session只要保持刷新,則永久有效(除非用戶主動退出)。如果攻擊者從瀏覽器或者從數據傳輸中竊取到Session ID,則可以保持該Session ID永久有效。
JWT全稱為:JSON Web Token。適合分布式的授權模式。用戶登錄成功后,認證服務器會返回一個帶有簽名認證的JWT。JWT保存在客戶端(如瀏覽器或APP),每次訪問應用服務器時,將JWT放到http的header里面。不同于Session的集中管理,JWT自身就包含了用戶信息,每臺應用服務器可以自己獨自判斷JWT是哪個用戶、是否合法、是否過期,無需再向認證服務器確認,也沒有Session同步的問題。JWT至少包含以下信息:
sub: Subject,一般為用戶ID。
exp: Expiration Time。過期時間。
signature: 簽名。用于驗證JWT是否合法。
participant 用戶瀏覽器 participant 應用服務器 participant 認證服務器 用戶瀏覽器->應用服務器: 訪問登錄頁面 應用服務器-->用戶瀏覽器: 返回登錄頁面 用戶瀏覽器->認證服務器: 登錄請求 Note right of 用戶瀏覽器: 提供用戶名、密碼 認證服務器-->用戶瀏覽器: 提示用戶登錄成功 Note left of 認證服務器: 返回JWT,包含用戶ID、過期時間和簽名 用戶瀏覽器->應用服務器: 獲取數據 Note right of 用戶瀏覽器: header中攜帶JWT 應用服務器->應用服務器: 解析JWT Note right of 應用服務器: 通過簽名驗證JWT是否合法,判斷是否過期,并獲取用戶ID 應用服務器-->用戶瀏覽器: 返回數據
Access Token需要放到http的header里面,用于訪問各種資源。由于使用頻繁且使用場景復雜,泄露風險較大,因此過期時間會比較短,比如30分鐘。如果每30分鐘讓用戶重新登錄一次,顯然用戶體驗極差。所以認證服務器在返回Access Token時,還會同時返回一個Refresh Token。Refresh Token平時不使用,只用于從認證服務器獲取新的Access Token,會安全很多。
Refresh Token的有效期通常為30天。但在很多手機APP應用,并不想讓用戶每30天就登錄一次。而將有效期設置為1年甚至2年,又覺風險稍大。
給Refresh Token增加一個認證有效期(如30天),有效期則可以較長(如1年)。只要在認證有效期內刷新,則可以獲取新的Refresh Token,認證有效期重新計算,有效期按前一個Refresh Token計算;如果過了認證有效期再刷新,則Refresh Token不刷新,且只能獲取到Remember Me權限的Access Token。
只要用戶在30天內使用了APP,則自動刷新Refresh Token,無需再次登錄。直到1年后刷新有效期到期,才需要再次登錄。
刷新Access Token時,自動返回新的Refresh Token。無需專門刷新Refresh Token。
并且在瀏覽網站時,通常會有兩個級別的權限,一種是記住我的權限,一種是登錄的權限。
給Access Token增加Remember Me標識。如果Refresh Token過了認證有效期再刷新,則只能獲取到Remember Me權限的Access Token。
使用瀏覽器訪問時,不能長期保存Refresh Token(安全考慮)。必須在瀏覽器關閉或用戶退出時刪除Refresh Token。
要模擬Session 30分鐘過期的模式,可以規定在瀏覽器訪問時,返回的Refresh Token的認證有效期為30分鐘,用戶操作后再刷新Refresh Token,以維持Refresh Token的有效性。
Refresh Token可以保存到Cookie或者sessionStorage,確保關閉頁面時Refresh Token會被刪除。
可以每5分鐘自動刷新Token(不需要自動過期時)。如果需要自動過期,則要根據用戶的操作刷新。用戶每次操作時,如距離上次刷新Token時間超過5分鐘,則自動刷新Token。
每5分鐘刷新一次Token,可以更準確的監測在線人數,也更滿足模擬自動過期的要求。如果覺得5分鐘太短,可以嘗試10分鐘。
為了避免用戶正在操作的時候,突然Refresh Token到期重新登錄,應該在Refresh Token到期的最后30天中,用戶重新打開APP時,要求用戶重新登錄。
如果需要監控在線人數,則認證服務器應該將登錄的數據寫入數據庫。由于Access Token的有效期很短,通常需要5分鐘到應用服務器刷新一次。因此可以很容易的監控到當前的在線人員。
如何將眾多的Access Token和Refresh Token與某個用戶的登錄關聯起來,關鍵在于用戶登錄時需要產生一個登錄ID,將這個ID寫入所有后續的Refresh Token和Access Token中,則可以知道任意一個Token是屬于哪個用戶的哪次登錄。
由于同一系列的Refresh Token都擁有同一個登錄ID,而每個Refresh Token都會在5分鐘或者更長的時間內刷新Access Token,因此只要有相同登錄ID的Refresh Token在5分鐘內刷新了兩次Access Token,就可判頂Refresh Token已經泄露。
Refresh Token強制下線:需要在認證服務器記錄所有已發布并在刷新有效期內的Refresh Token(可以只記錄登錄ID),每次刷新token時,檢查登錄ID是否被強制下線。由于Refresh Token每5分鐘刷新一次,且Access Token有效期為30分鐘,這種下線不是即時生效的。但代價較低,只要在認證服務器處理即可。
Access Token強制下線:時效性高,立即下線,但代價也較高。需要每個應用服務器在驗證JWT時,向認證服務器進行校驗,以檢查Access Token對應的登錄ID是否被強制下線。這已經違反了JWT自描述的設計初衷,且性能損耗有可能非常大。不過在認證服務器和應用服務器為同一服務器的情況下,還是可用的。
主要用于第三方登錄,如微信登錄、QQ登錄、微博登錄等。所有的應用都必須先到認證服務器備案(如微信、QQ、微博),獲取客戶端ID(Client ID)和客戶端密鑰(Client Secret)。
participant 用戶瀏覽器 participant 應用服務器 participant 認證服務器 用戶瀏覽器->應用服務器: 登錄請求 應用服務器-->用戶瀏覽器: 重定向至認證服務器 Note left of 應用服務器: 提供Client ID 用戶瀏覽器->認證服務器: 允許授權 Note right of 用戶瀏覽器: 提供用戶名、密碼和Client ID 認證服務器-->用戶瀏覽器: 返回授權碼并重定向至應用服務器 Note left of 認證服務器: 授權碼授權碼在瀏覽器中傳遞,可能被泄漏,所以只能用于獲取Token 用戶瀏覽器->應用服務器: 提供授權碼 應用服務器->認證服務器: 獲取Token Note right of 應用服務器: 提供授權碼、Client ID、Client Secret 認證服務器-->應用服務器: 返回Token 應用服務器->認證服務器: 獲取用戶信息 Note right of 應用服務器: 提供Token 認證服務器-->應用服務器: 返回Token對應用戶的信息 應用服務器-->用戶瀏覽器: 提示用戶登錄成功
感謝各位的閱讀,以上就是“Session、JWT與OAuth2的特點是什么”的內容了,經過本文的學習后,相信大家對Session、JWT與OAuth2的特點是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。