主頁 > 軟體設計 > session、token、jwt、oauth2 傻傻分不清

session、token、jwt、oauth2 傻傻分不清

2021-08-06 08:09:08 軟體設計

△Hollis, 一個對Coding有著獨特追求的人△

這是Hollis的第 367 篇原創分享

作者 l zyz1992

來源 l Hollis(ID:hollischuang)

在我們的 java 業務系統中,或多或少的會涉及到權限、認證等類似的概念,但是很多小伙伴還是傻傻的分不清這些的概念和區別,今天我們就來好好的捋一捋,將其區別的概念深深的刻在腦海中,

認證 Authentication

百度百科中對于認證的解釋是:身份驗證(Authentication),在 .NET Framework 安全中,通過對照某些機構檢查用戶的憑據,發現和驗證主體標識的程序,

當然,今天我們來討論肯定不會用這么生硬的詞來解釋的,

  • 通俗地講就是 驗證當前用戶的身份,證明“你是你自己”(比如:你每天上下班打卡,都需要通過指紋打卡,當你的指紋和系統里錄入的指紋相匹配時,就打卡成功)

常見的認證方式:

  1. 用戶名密碼登錄

  2. 郵箱發送登錄鏈接

  3. 手機號接收驗證碼

  4. 只要你能收到郵箱/驗證碼,就默認你是賬號的主人

授權 Authorization

所謂授權,就是某個用戶授予其他應用訪問該用戶某些資源的權限,

例如,在你安裝手機應用的時候,APP肯定會跳出來問是否允許授予權限(訪問相冊、位置等權限);你在訪問微信小程式時,當登錄時,小程式會詢問是否允許授予權限(獲取昵稱、頭像、地區、性別等個人資訊)

實作授權的方式有:cookie、session、token、OAuth

憑證 Credentials

實作認證和授權的前提是需要一種媒介(證書) 來標記訪問者的身份,

這個其實很好理解,身份證大家肯定是都有的,過身份證,我們可以辦理手機卡/銀行卡/個人貸款/交通出行等等,這就是認證的憑證

在互聯網應用中,一般網站會有兩種模式,游客模式和登錄模式

  • 游客模式下,可以正常瀏覽網站上面的文章,一旦想要點贊/收藏/分享文章,就需要登錄或者注冊賬號,

  • 登錄模式,當用戶登錄成功后,服務器會給該用戶使用的瀏覽器頒發一個令牌(token),這個令牌用來表明你的身份,每次瀏覽器發送請求時會帶上這個令牌,就可以使用游客模式下無法使用的功能,

Cookie

HTTP 是無狀態的協議(對于事務處理沒有記憶能力,每次客戶端和服務端會話完成時,服務端不會保存任何會話資訊):每個請求都是完全獨立的,服務端無法確認當前訪問者的身份資訊,無法分辨上一次的請求發送者和這一次的發送者是不是同一個人,

所以服務器與瀏覽器為了進行會話跟蹤(知道是誰在訪問我),就必須主動的去維護一個狀態,這個狀態用于告知服務端前后兩個請求是否來自同一瀏覽器,而這個狀態需要通過 cookie 或者 session 去實作,

cookie 存盤在客戶端:cookie 是服務器發送到用戶瀏覽器并保存在本地的一小塊資料,它會在瀏覽器下次向同一服務器再發起請求時被攜帶并發送到服務器上,

cookie 是不可跨域的:每個 cookie 都會系結單一的域名,無法在別的域名下獲取使用,一級域名和二級域名之間是允許共享使用的(靠的是 domain),

Session

session 是另外一種記錄服務器和客戶端會話狀態的機制,通常情況下,session 是基于 cookie 實作的,session 存盤在服務器端,sessionId 會被存盤到客戶端的cookie 中

session 認證流程:

  1. 用戶第一次請求服務器的時候,服務器根據用戶提交的相關資訊,創建對應的 Session

  2. 請求回傳時將此 Session 的唯一標識資訊 SessionID 回傳給瀏覽器

  3. 瀏覽器接收到服務器回傳的 SessionID 資訊后,會將此資訊存入到 Cookie 中,同時 Cookie 記錄此 SessionID 屬于哪個域名

  4. 當用戶第二次訪問服務器的時候,請求會自動判斷此域名下是否存在 Cookie 資訊,如果存在自動將 Cookie 資訊也發送給服務端,服務端會從 Cookie 中獲取 SessionID,再根據 SessionID 查找對應的 Session 資訊,如果沒有找到說明用戶沒有登錄或者登錄失效,如果找到 Session 證明用戶已經登錄可執行后面操作,

目前,大部分系統都是根據此原理來驗證用戶的登錄狀態的,

Cookie 和 Session 的區別

這個應該是面試中問的頻率非常高的一個問題了,

  1. 安全性:Session 比 Cookie 安全,Session 是存盤在服務器端的,Cookie 是存盤在客戶端的,

  2. 存取值的型別不同:Cookie 只支持存字串資料,想要設定其他型別的資料,需要將其轉換成字串,Session 可以存任意資料型別,

  3. 有效期不同:Cookie 可設定為長時間保持,比如我們經常使用的默認登錄功能,Session 一般失效時間較短,客戶端關閉(默認情況下)或者 Session 超時都會失效,

  4. 存盤大小不同:單個 Cookie 保存的資料不能超過 4K,Session 可存盤資料遠高于 Cookie,但是當訪問量過多,會占用過多的服務器資源,

令牌 Token

Acesss Token

訪問資源介面(API)時所需要的資源憑證,簡單 token 的組成:uid(用戶唯一的身份標識)、time(當前時間的時間戳)、sign(簽名,token 的前幾位以哈希演算法壓縮成的一定長度的十六進制字串)

Acesss Token的特點是 * 服務端無狀態化、可擴展性好 * 支持移動端設備 * 安全 * 支持跨程式呼叫

token 的身份驗證流程如下:

  1. 客戶端使用用戶名跟密碼請求登錄

  2. 服務端收到請求,去驗證用戶名與密碼

  3. 驗證成功后,服務端會簽發一個 token 并把這個 token 發送給客戶端

  4. 客戶端收到 token 以后,會把它存盤起來,比如放在 cookie 里或者 localStorage 里

  5. 客戶端每次向服務端請求資源的時候需要帶著服務端簽發的 token

  6. 服務端收到請求,然后去驗證客戶端請求里面帶著的 token ,如果驗證成功,就向客戶端回傳請求的資料

Refresh Token

refresh token 是專用于重繪 access token 的 token,

如果沒有 refresh token,也可以重繪 access token,但每次重繪都要用戶輸入登錄用戶名與密碼,會很麻煩,有了 refresh token,可以減少這個麻煩,客戶端直接用 refresh token 去更新 access token,無需用戶進行額外的操作,

Access Token 的有效期比較短,當 Acesss Token 由于過期而失效時,使用 Refresh Token 就可以獲取到新的 Token,如果 Refresh Token 也失效了,用戶就只能重新登錄了,

Refresh Token 及過期時間是存盤在服務器的資料庫中,只有在申請新的 Acesss Token 時才會驗證,不會對業務介面回應時間造成影響,也不需要向 Session 一樣一直保持在記憶體中以應對大量的請求,

Token 和 Session 的區別

Session 是一種記錄服務器和客戶端會話狀態的機制,使服務端有狀態化,可以記錄會話資訊,而 Token 是令牌,訪問資源介面(API)時所需要的資源憑證,Token 使服務端無狀態化,不會存盤會話資訊,

Session 和 Token 并不矛盾,作為身份認證 Token 安全性比 Session 好,因為每一個請求都有簽名還能防止監聽以及重放攻擊,而 Session 就必須依賴鏈路層來保障通訊安全了,如果你需要實作有狀態的會話,仍然可以增加 Session 來在服務器端保存一些狀態,

所謂 Session 認證只是簡單的把 User 資訊存盤到 Session 里,因為 SessionID 的不可預測性,暫且認為是安全的,而 Token ,如果指的是 OAuth Token 或類似的機制的話,提供的是 認證 和 授權 ,認證是針對用戶,授權是針對 App ,其目的是讓某 App 有權利訪問某用戶的資訊,這里的 Token 是唯一的,不可以轉移到其它 App上,也不可以轉到其它用戶上,Session 只提供一種簡單的認證,即只要有此 SessionID ,即認為有此 User 的全部權利,是需要嚴格保密的,這個資料應該只保存在站方,不應該共享給其它網站或者第三方 App,

所以簡單來說:如果你的用戶資料可能需要和第三方共享,或者允許第三方呼叫 API 介面,用 Token ,如果永遠只是自己的網站,自己的 App,用什么就無所謂了

JWT(JSON Web Token)

JSON Web Token(簡稱 JWT)是目前最流行的跨域認證解決方案

JWT 是為了在網路應用環境間傳遞宣告而執行的一種基于 JSON 的開放標準(RFC 7519),JWT 的宣告一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份資訊,以便于從資源服務器獲取資源,比如用在用戶登錄上,

可以使用 HMAC 演算法或者是 RSA 的公/私秘鑰對 JWT 進行簽名,因為數字簽名的存在,這些傳遞的資訊是可信的,

JWT 認證流程:

  1. 用戶輸入用戶名/密碼登錄,服務端認證成功后,會回傳給客戶端一個 JWT

  2. 客戶端將 token 保存到本地(通常使用 localstorage,也可以使用 cookie)

  3. 當用戶希望訪問一個受保護的路由或者資源的時候,需要請求頭的 Authorization 欄位中使用Bearer 模式添加 JWT

技術交流群

最近有很多人問,有沒有讀者交流群,想知道怎么加入,

最近我創建了一些群,大家可以加入,交流群都是免費的,只需要大家加入之后不要隨便發廣告,多多交流技術就好了,

目前創建了多個交流群,全國交流群、北上廣杭深等各地區交流群、面試交流群、資源共享群等,

有興趣入群的同學,可長按掃描下方二維碼,一定要備注:全國 Or 城市 Or 面試 Or 資源,根據格式備注,可更快被通過且邀請進群,

▲長按掃描


往期推薦

招人!阿里!!


張小龍:做 PC 版微信是一種破壞,本來不想做


「吳X凡」的瓜,程式員這樣吃才高級!

如果你喜歡本文,

請長按二維碼,關注 Hollis.

轉發至朋友圈,是對我最大的支持,

點個 在看

喜歡是一種感覺

在看是一種支持

↘↘↘

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/292090.html

標籤:其他

上一篇:[C語言]陣列詳解

下一篇:小白入門之前端網頁技術 Vue進階

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more