主頁 >  其他 > 深入理解token

深入理解token

2020-09-15 09:10:02 其他

摘要: Token 是在服務端產生的,如果前端使用用戶名/密碼向服務端請求認證,服務端認證成功,那么在服務端會回傳 Token 給前端,前端可以在每次請求的時候帶上 Token 證明自己的合法地位

 

不久前,我在在前后端分離實踐中提到了基于 Token 的認證,現在我們稍稍深入一些,

 

通常情況下,我們在討論某個技術的時候,都是從問題開始,那么第一個問題:

 

為什么要用 Token?(無狀態token開始比較有用)

 

而要回答這個問題很簡單——因為它能解決問題!

 

可以解決哪些問題呢?

 

  1. Token 完全由應用管理,所以它可以避開同源策略

  2. Token 可以避免 CSRF 攻擊(http://dwz.cn/7joLzx)

  3. Token 可以是無狀態的,可以在多個服務間共享

 

Token 是在服務端產生的,如果前端使用用戶名/密碼向服務端請求認證,服務端認證成功,那么在服務端會回傳 Token 給前端,前端可以在每次請求的時候帶上 Token 證明自己的合法地位,如果這個 Token 在服務端持久化(比如存入資料庫),那它就是一個永久的身份令牌,

 

于是,又一個問題產生了:需要為 Token 設定有效期嗎?

 

需要設定有效期嗎?

 

對于這個問題,我們不妨先看兩個例子,一個例子是登錄密碼,一般要求定期改變密碼,以防止泄漏,所以密碼是有有效期的;另一個例子是安全證書,SSL 安全證書都有有效期,目的是為了解決吊銷的問題,對于這個問題的詳細情況,來看看知乎的回答(http://dwz.cn/7joMhq),所以無論是從安全的角度考慮,還是從吊銷的角度考慮,Token 都需要設有效期,

 

那么有效期多長合適呢?

 

只能說,根據系統的安全需要,盡可能的短,但也不能短得離譜——想像一下手機的自動熄屏時間,如果設定為 10 秒鐘無操作自動熄屏,再次點亮需要輸入密碼,會不會瘋?如果你覺得不會,那就親自試一試,設定成可以設定的最短時間,堅持一周就好(不排除有人適應這個時間,畢竟手機廠商也是有用戶體驗研究的),

 

然后新問題產生了,如果用戶在正常操作的程序中,Token 過期失效了,要求用戶重新登錄……用戶體驗豈不是很糟糕?

 

為了解決在操作程序不能讓用戶感到 Token 失效這個問題,有一種方案是在服務器端保存 Token 狀態,用戶每次操作都會自動重繪(推遲) Token 的過期時間——Session 就是采用這種策略來保持用戶登錄狀態的,然而仍然存在這樣一個問題,在前后端分離、單頁 App 這些情況下,每秒種可能發起很多次請求,每次都去重繪過期時間會產生非常大的代價,如果 Token 的過期時間被持久化到資料庫或檔案,代價就更大了,所以通常為了提升效率,減少消耗,會把 Token 的過期時保存在快取或者記憶體中,

 

還有另一種方案,使用 Refresh Token,它可以避免頻繁的讀寫操作,這種方案中,服務端不需要重繪 Token 的過期時間,一旦 Token 過期,就反饋給前端,前端使用 Refresh Token 申請一個全新 Token 繼續使用,這種方案中,服務端只需要在客戶端請求更新 Token 的時候對 Refresh Token 的有效性進行一次檢查,大大減少了更新有效期的操作,也就避免了頻繁讀寫,當然 Refresh Token 也是有有效期的,但是這個有效期就可以長一點了,比如,以天為單位的時間,

 

時序圖表示

 

使用 Token 和 Refresh Token 的時序圖如下:

 

1)登錄

 

 

2)業務請求

 

 

3)Token 過期,重繪 Token

 

 

 

上面的時序圖中并未提到 Refresh Token 過期怎么辦,不過很顯然,Refresh Token 既然已經過期,就該要求用戶重新登錄了,

 

當然還可以把這個機制設計得更復雜一些,比如,Refresh Token 每次使用的時候,都更新它的過期時間,直到與它的創建時間相比,已經超過了非常長的一段時間(比如三個月),這等于是在相當長一段時間內允許 Refresh Token 自動續期,

 

到目前為止,Token 都是有狀態的,即在服務端需要保存并記錄相關屬性,那說好的無狀態呢,怎么實作?

 

無狀態 Token

 

如果我們把所有狀態資訊都附加在 Token 上,服務器就可以不保存,但是服務端仍然需要認證 Token 有效,不過只要服務端能確認是自己簽發的 Token,而且其資訊未被改動過,那就可以認為 Token 有效——“簽名”可以作此保證,平時常說的簽名都存在一方簽發,另一方驗證的情況,所以要使用非對稱加密演算法,但是在這里,簽發和驗證都是同一方,所以對稱加密演算法就能達到要求,而對稱演算法比非對稱演算法要快得多(可達數十倍差距),

 

更進一步思考,對稱加密演算法除了加密,還帶有還原加密內容的功能,而這一功能在對 Token 簽名時并無必要——既然不需要解密,摘要(散列)演算法就會更快,可以指定密碼的散列演算法,自然是 HMAC,

 

上面說了這么多,還需要自己去實作嗎?不用!JWT 已經定義了詳細的規范,而且有各種語言的若干實作,

 

不過在使用無狀態 Token 的時候在服務端會有一些變化,服務端雖然不保存有效的 Token 了,卻需要保存未到期卻已注銷的 Token,如果一個 Token 未到期就被用戶主動注銷,那么服務器需要保存這個被注銷的 Token,以便下次收到使用這個仍在有效期內的 Token 時判其無效,有沒有感到一點沮喪?

 

在前端可控的情況下(比如前端和服務端在同一個專案組內),可以協商:前端一但注銷成功,就丟掉本地保存(比如保存在記憶體、LocalStorage 等)的 Token 和 Refresh Token,基于這樣的約定,服務器就可以假設收到的 Token 一定是沒注銷的(因為注銷之后前端就不會再使用了),

 

如果前端不可控的情況,仍然可以進行上面的假設,但是這種情況下,需要盡量縮短 Token 的有效期,而且必須在用戶主動注銷的情況下讓 Refresh Token 無效,這個操作存在一定的安全漏洞,因為用戶會認為已經注銷了,實際上在較短的一段時間內并沒有注銷,如果應用設計中,這點漏洞并不會造成什么損失,那采用這種策略就是可行的,

 

在使用無狀態 Token 的時候,有兩點需要注意:

 

  1. Refresh Token 有效時間較長,所以它應該在服務器端有狀態,以增強安全性,確保用戶注銷時可控

  2. 應該考慮使用二次認證來增強敏感操作的安全性

 

到此,關于 Token 的話題似乎差不多了——然而并沒有,上面說的只是認證服務和業務服務集成在一起的情況,如果是分離的情況呢?

 

分離認證服務

 

當 Token 無狀態之后,單點登錄就變得容易了,前端拿到一個有效的 Token,它就可以在任何同一體系的服務上認證通過——只要它們使用同樣的密鑰和演算法來認證 Token 的有效性,就樣這樣:

 

 

 

當然,如果 Token 過期了,前端仍然需要去認證服務更新 Token:

 

可見,雖然認證和業務分離了,實際即并沒產生多大的差異,當然,這是建立在認證服務器信任業務服務器的前提下,因為認證服務器產生 Token 的密鑰和業務服務器認證 Token 的密鑰和演算法相同,換句話說,業務服務器同樣可以創建有效的 Token,

如果業務服務器不能被信任,該怎么辦?

 

不受信的業務服務器

 

遇到不受信的業務服務器時,很容易想到的辦法是使用不同的密鑰,認證服務器使用密鑰1簽發,業務服務器使用密鑰2驗證——這是典型非對稱加密簽名的應用場景,認證服務器自己使用私鑰對 Token 簽名,公開公鑰,信任這個認證服務器的業務服務器保存公鑰,用于驗證簽名,幸好,JWT 不僅可以使用 HMAC 簽名,也可以使用 RSA(一種非對稱加密演算法)簽名,

 

不過,當業務服務器已經不受信任的時候,多個業務服務器之間使用相同的 Token 對用戶來說是不安全的,因為任何一個服務器拿到 Token 都可以仿冒用戶去另一個服務器處理業務……悲劇隨時可能發生,

 

為了防止這種情況發生,就需要在認證服務器產生 Token 的時候,把使用該 Token 的業務服務器的資訊記錄在 Token 中,這樣當另一個業務服務器拿到這個 Token 的時候,發現它并不是自己應該驗證的 Token,就可以直接拒絕,

 

現在,認證服務器不信任業務服務器,業務服務器相互也不信任,但前端是信任這些服務器的——如果前端不信任,就不會拿 Token 去請求驗證,那么為什么會信任?可能是因為這些是同一家公司或者同一個專案中提供的若干服務構成的服務體系,

 

但是,前端信任不代表用戶信任,如果 Token 不沒有攜帶用戶隱私(比如姓名),那么用戶不會關心信任問題,但如果 Token 含有用戶隱私的時候,用戶得關心信任問題了,這時候認證服務就不得不再啰嗦一些,當用戶請求 Token 的時候,問上一句,你真的要授權給某某某業務服務嗎?而這個“某某某”,用戶怎么知道它是不是真的“某某某”呢?用戶當然不知道,甚至認證服務也不知道,因為公鑰已經公開了,任何一個業務都可以宣告自己是“某某某”,

 

為了得到用戶的信任,認證服務就不得不幫助用戶來甄別業務服務,所以,認證服器決定不公開公鑰,而是要求業務服務先申請注冊并通過審核,只有通過審核的業務服務器才能得到認證服務為它創建的,僅供它使用的公鑰,如果該業務服務泄漏公鑰帶來風險,由該業務服務自行承擔,現在認證服務可以清楚的告訴用戶,“某某某”服務是什么了,如果用戶還是不夠信任,認證服務甚至可以問,某某某業務服務需要請求  A、B、C 三項個人資料,其中 A 是必須的,不然它不作業,是否允許授權?如果你授權,我就把你授權的幾項資料加密放在 Token 中……

 

廢話了這么多,有沒有似曾相識……對了,這類似開放式 API 的認證程序,開發式 API 多采用 OAuth 認證,而關于 OAuth 的探討資源非常豐富,這里就不深究了,

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

標籤:其他

上一篇:國產安全自主可控IT智能運維管理解決方案

下一篇:Prime_Series_Level-1

標籤雲
其他(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)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more